From 71fe7e05a750fdd9cbb50314a3086854f2e5a833 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Mon, 24 Apr 2023 15:10:22 +0200 Subject: [PATCH 01/10] Merge the use of a non-singleton NotificationHandler --- plugins/radar-android-audio/build.gradle | 5 +-- .../passive/audio/OpenSmileAudioService.kt | 6 +-- .../passive/audio/OpensmileAudioManager.kt | 2 +- .../src/main/AndroidManifest.xml | 16 ++++--- .../radarbase/passive/empatica/E4Manager.kt | 15 ++++--- .../radarbase/passive/empatica/E4Provider.kt | 15 +------ .../src/main/AndroidManifest.xml | 14 ++++-- .../radarbase/passive/bittium/FarosManager.kt | 14 +++--- .../passive/bittium/FarosProvider.kt | 17 +------- .../radarbase/passive/bittium/FarosState.kt | 14 +++--- .../android/auth/oauth2/OAuth2LoginManager.kt | 25 ++++------- .../passive/phone/usage/PhoneUsageManager.kt | 5 +-- .../passive/phone/usage/PhoneUsageProvider.kt | 1 - .../src/main/AndroidManifest.xml | 11 +++-- .../passive/phone/PhoneBluetoothManager.kt | 12 +++-- .../passive/phone/PhoneBluetoothProvider.kt | 17 +------- .../passive/phone/PhoneLocationManager.kt | 1 + .../passive/phone/PhoneSensorManager.kt | 5 ++- .../passive/phone/PhoneSensorService.kt | 1 - plugins/radar-android-ppg/gradle.skip | 0 .../passive/weather/WeatherApiProvider.kt | 2 + .../passive/weather/WeatherApiService.kt | 5 ++- .../android/AbstractRadarApplication.kt | 4 +- .../org/radarbase/android/RadarApplication.kt | 5 --- .../org/radarbase/android/RadarService.kt | 6 ++- .../android/util/BluetoothEnforcer.kt | 15 +++++-- .../android/util/BluetoothStateReceiver.kt | 30 ++++++++++++- .../android/util/NotificationHandler.kt | 41 +++++++++++------- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4546 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 6527 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 6887 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2756 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 4212 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 4159 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6443 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 9158 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 10008 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10056 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 15204 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 15829 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 14016 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 21665 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 22725 bytes 45 files changed, 171 insertions(+), 143 deletions(-) create mode 100644 plugins/radar-android-ppg/gradle.skip create mode 100644 radar-commons-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 radar-commons-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 radar-commons-android/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 radar-commons-android/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 radar-commons-android/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 radar-commons-android/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 radar-commons-android/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 radar-commons-android/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 radar-commons-android/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 radar-commons-android/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 radar-commons-android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/plugins/radar-android-audio/build.gradle b/plugins/radar-android-audio/build.gradle index 9065d0923..b860a0d55 100644 --- a/plugins/radar-android-audio/build.gradle +++ b/plugins/radar-android-audio/build.gradle @@ -4,15 +4,12 @@ android { namespace "org.radarbase.passive.audio" // Matches Github Actions - ndkVersion "22.1.7171670" + ndkVersion "25.2.9519653" defaultConfig { ndk { moduleName rootProject.name } - packagingOptions { - doNotStrip '**.so' - } } // Encapsulates your external native build configurations. diff --git a/plugins/radar-android-audio/src/main/java/org/radarbase/passive/audio/OpenSmileAudioService.kt b/plugins/radar-android-audio/src/main/java/org/radarbase/passive/audio/OpenSmileAudioService.kt index 120ae6466..9cb3a00a5 100644 --- a/plugins/radar-android-audio/src/main/java/org/radarbase/passive/audio/OpenSmileAudioService.kt +++ b/plugins/radar-android-audio/src/main/java/org/radarbase/passive/audio/OpenSmileAudioService.kt @@ -39,9 +39,9 @@ class OpenSmileAudioService : SourceService() { manager as OpensmileAudioManager manager.setRecordRate(config.getLong(AUDIO_RECORD_RATE_S, DEFAULT_RECORD_RATE)) manager.config = OpensmileAudioManager.AudioConfiguration( - config.getString(AUDIO_CONFIG_FILE, "ComParE_2016.conf"), - config.getLong(AUDIO_DURATION_S, 15L), - TimeUnit.SECONDS + config.getString(AUDIO_CONFIG_FILE, "ComParE_2016.conf"), + config.getLong(AUDIO_DURATION_S, 15L), + TimeUnit.SECONDS, ) } diff --git a/plugins/radar-android-audio/src/main/java/org/radarbase/passive/audio/OpensmileAudioManager.kt b/plugins/radar-android-audio/src/main/java/org/radarbase/passive/audio/OpensmileAudioManager.kt index 017fbf8ff..3f8bf249a 100644 --- a/plugins/radar-android-audio/src/main/java/org/radarbase/passive/audio/OpensmileAudioManager.kt +++ b/plugins/radar-android-audio/src/main/java/org/radarbase/passive/audio/OpensmileAudioManager.kt @@ -135,7 +135,7 @@ class OpensmileAudioManager constructor(service: OpenSmileAudioService) : Abstra ?.list { _, name -> name.startsWith("audio_") && name.endsWith(".bin") } ?.forEach { File(audioDir.parentFile, it).delete() } - audioDir.walk().filter { it.startsWith("audio_") && it.endsWith(".bin") } + audioDir.walk().filter { it.startsWith("audio_") && it.path.endsWith(".bin") } .forEach { it.delete() } } } diff --git a/plugins/radar-android-empatica/src/main/AndroidManifest.xml b/plugins/radar-android-empatica/src/main/AndroidManifest.xml index cacff25f5..6df293abd 100644 --- a/plugins/radar-android-empatica/src/main/AndroidManifest.xml +++ b/plugins/radar-android-empatica/src/main/AndroidManifest.xml @@ -4,13 +4,19 @@ - - - - - + + + + + + hasBeenConnecting = true EmpaStatus.CONNECTED -> { status = SourceStatusListener.Status.CONNECTED - service.radarApp.notificationHandler.manager?.cancel(EMPATICA_DISCONNECTED_NOTIFICATION_ID) + notificationHandler.manager?.cancel(EMPATICA_DISCONNECTED_NOTIFICATION_ID) } EmpaStatus.DISCONNECTED -> // The device manager disconnected from a device. Before it ever makes a connection, @@ -230,10 +232,11 @@ class E4Manager( override fun disconnect() { if (status != SourceStatusListener.Status.UNAVAILABLE && !isClosed && doNotify) { - service.radarApp.notificationHandler.notify( - id = EMPATICA_DISCONNECTED_NOTIFICATION_ID, - channel = NotificationHandler.NOTIFICATION_CHANNEL_ALERT, - includeStartIntent = true) { + notificationHandler.notify( + id = EMPATICA_DISCONNECTED_NOTIFICATION_ID, + channel = NotificationHandler.NOTIFICATION_CHANNEL_ALERT, + includeStartIntent = true, + ) { setContentTitle(service.getString(R.string.notification_empatica_disconnected_title)) setContentText(service.getString(R.string.notification_empatica_disconnected_text)) } diff --git a/plugins/radar-android-empatica/src/main/java/org/radarbase/passive/empatica/E4Provider.kt b/plugins/radar-android-empatica/src/main/java/org/radarbase/passive/empatica/E4Provider.kt index a4d262a8d..fbf5faa48 100644 --- a/plugins/radar-android-empatica/src/main/java/org/radarbase/passive/empatica/E4Provider.kt +++ b/plugins/radar-android-empatica/src/main/java/org/radarbase/passive/empatica/E4Provider.kt @@ -21,6 +21,7 @@ import android.content.pm.PackageManager import android.os.Build import org.radarbase.android.RadarService import org.radarbase.android.source.SourceProvider +import org.radarbase.android.util.BluetoothStateReceiver.Companion.bluetoothPermissionList open class E4Provider(radarService: RadarService) : SourceProvider(radarService) { override val serviceClass = E4Service::class.java @@ -32,19 +33,7 @@ open class E4Provider(radarService: RadarService) : SourceProvider(rada "org.radarbase.passive.empatica.E4Provider", "org.radarcns.empatica.E4ServiceProvider") - override val permissionsNeeded = buildList { - add(ACCESS_COARSE_LOCATION) - add(ACCESS_FINE_LOCATION) - add(BLUETOOTH) - add(BLUETOOTH_ADMIN) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - add(BLUETOOTH_SCAN) - add(BLUETOOTH_CONNECT) - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - add(ACCESS_BACKGROUND_LOCATION) - } - } + override val permissionsNeeded = bluetoothPermissionList override val featuresNeeded = listOf(PackageManager.FEATURE_BLUETOOTH, PackageManager.FEATURE_BLUETOOTH_LE) diff --git a/plugins/radar-android-faros/src/main/AndroidManifest.xml b/plugins/radar-android-faros/src/main/AndroidManifest.xml index 685b73533..1ce61b710 100644 --- a/plugins/radar-android-faros/src/main/AndroidManifest.xml +++ b/plugins/radar-android-faros/src/main/AndroidManifest.xml @@ -3,14 +3,20 @@ - - - - + + + + + diff --git a/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosManager.kt b/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosManager.kt index cfcdc72ce..5a20854d2 100644 --- a/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosManager.kt +++ b/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosManager.kt @@ -35,6 +35,9 @@ class FarosManager internal constructor( private val farosFactory: FarosSdkFactory, private val handler: SafeHandler ) : AbstractSourceManager(service), FarosDeviceListener, FarosSdkListener { + private val notificationHandler by lazy { + NotificationHandler(this.service) + } private var doNotify: Boolean = false private val accelerationTopic: DataCache = createCache("android_bittium_faros_acceleration", BittiumFarosAcceleration()) private val ecgTopic: DataCache = createCache("android_bittium_faros_ecg", BittiumFarosEcg()) @@ -78,7 +81,7 @@ class FarosManager internal constructor( startMeasurements() } } - service.radarApp.notificationHandler.manager?.cancel(FAROS_DISCONNECTED_NOTIFICATION_ID) + notificationHandler.manager?.cancel(FAROS_DISCONNECTED_NOTIFICATION_ID) SourceStatusListener.Status.CONNECTED } FarosDeviceListener.CONNECTING -> SourceStatusListener.Status.CONNECTING @@ -194,10 +197,11 @@ class FarosManager internal constructor( override fun disconnect() { if (!isClosed && doNotify) { - service.radarApp.notificationHandler.notify( - id = FAROS_DISCONNECTED_NOTIFICATION_ID, - channel = NotificationHandler.NOTIFICATION_CHANNEL_ALERT, - includeStartIntent = true) { + notificationHandler.notify( + id = FAROS_DISCONNECTED_NOTIFICATION_ID, + channel = NotificationHandler.NOTIFICATION_CHANNEL_ALERT, + includeStartIntent = true, + ) { setContentTitle(service.getString(R.string.notification_faros_disconnected_title)) setContentText(service.getString(R.string.notification_faros_disconnected_text)) } diff --git a/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosProvider.kt b/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosProvider.kt index 394df1293..20fc7cc40 100644 --- a/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosProvider.kt +++ b/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosProvider.kt @@ -16,12 +16,11 @@ package org.radarbase.passive.bittium -import android.Manifest.permission.* import android.content.pm.PackageManager -import android.os.Build import org.radarbase.android.BuildConfig import org.radarbase.android.RadarService import org.radarbase.android.source.SourceProvider +import org.radarbase.android.util.BluetoothStateReceiver.Companion.bluetoothPermissionList class FarosProvider(radarService: RadarService) : SourceProvider(radarService) { override val description: String? @@ -38,19 +37,7 @@ class FarosProvider(radarService: RadarService) : SourceProvider(rad override val hasDetailView: Boolean = true - override val permissionsNeeded: List = buildList { - add(ACCESS_COARSE_LOCATION) - add(ACCESS_FINE_LOCATION) - add(BLUETOOTH) - add(BLUETOOTH_ADMIN) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - add(BLUETOOTH_SCAN) - add(BLUETOOTH_CONNECT) - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - add(ACCESS_BACKGROUND_LOCATION) - } - } + override val permissionsNeeded: List = bluetoothPermissionList override val featuresNeeded: List = listOf(PackageManager.FEATURE_BLUETOOTH) diff --git a/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosState.kt b/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosState.kt index 1ff638c35..23d5432d9 100644 --- a/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosState.kt +++ b/plugins/radar-android-faros/src/main/java/org/radarbase/passive/bittium/FarosState.kt @@ -48,12 +48,10 @@ class FarosState : BaseSourceState() { this.acceleration[2] = z } - override fun toString(): String { - return "FarosDeviceStatus{" + - "batteryLevel=" + batteryLevel + - ", heartRate=" + heartRate + - ", temperature=" + temperature + - ", acceleration=" + Arrays.toString(acceleration) + - '}'.toString() - } + override fun toString(): String = "FarosDeviceStatus{" + + "batteryLevel=" + batteryLevel + + ", heartRate=" + heartRate + + ", temperature=" + temperature + + ", acceleration=" + acceleration.contentToString() + + '}' } diff --git a/plugins/radar-android-login-oauth2/src/main/java/org/radarbase/android/auth/oauth2/OAuth2LoginManager.kt b/plugins/radar-android-login-oauth2/src/main/java/org/radarbase/android/auth/oauth2/OAuth2LoginManager.kt index 60054c3f7..9340ae320 100644 --- a/plugins/radar-android-login-oauth2/src/main/java/org/radarbase/android/auth/oauth2/OAuth2LoginManager.kt +++ b/plugins/radar-android-login-oauth2/src/main/java/org/radarbase/android/auth/oauth2/OAuth2LoginManager.kt @@ -20,15 +20,16 @@ import android.app.Activity import org.json.JSONException import org.radarbase.android.RadarApplication.Companion.radarApp import org.radarbase.android.auth.* +import org.radarbase.android.auth.portal.ManagementPortalLoginManager import org.radarbase.producer.AuthenticationException /** * Authenticates against the RADAR Management Portal. */ class OAuth2LoginManager( - private val service: AuthService, - private val projectIdClaim: String, - private val userIdClaim: String + private val service: AuthService, + private val projectIdClaim: String, + private val userIdClaim: String ) : LoginManager, LoginListener { private val stateManager: OAuth2StateManager = OAuth2StateManager(service) @@ -55,16 +56,8 @@ class OAuth2LoginManager( return true } - override fun invalidate(authState: AppAuthState, disableRefresh: Boolean): AppAuthState? { - return when { - authState.tokenType != LoginManager.AUTH_TYPE_BEARER -> return null - disableRefresh -> authState.alter { - attributes -= LOGIN_REFRESH_TOKEN - isPrivacyPolicyAccepted = false - } - else -> authState - } - } + override fun invalidate(authState: AppAuthState, disableRefresh: Boolean): AppAuthState? = + authState.takeIf { it.authenticationSource == OAUTH2_SOURCE_TYPE } override val sourceTypes: List = OAUTH2_SOURCE_TYPES @@ -89,16 +82,16 @@ class OAuth2LoginManager( override fun loginSucceeded(manager: LoginManager?, authState: AppAuthState) { val token = authState.token if (token == null) { - this.service.loginFailed(this, + loginFailed(this, IllegalArgumentException("Cannot login using OAuth2 without a token")) return } try { processJwt(authState, Jwt.parse(token)).let { - this.service.loginSucceeded(this, it) + service.loginSucceeded(this, it) } } catch (ex: JSONException) { - this.service.loginFailed(this, ex) + loginFailed(this, ex) } } diff --git a/plugins/radar-android-phone-usage/src/main/java/org/radarbase/passive/phone/usage/PhoneUsageManager.kt b/plugins/radar-android-phone-usage/src/main/java/org/radarbase/passive/phone/usage/PhoneUsageManager.kt index cefc06ad2..102d813b1 100644 --- a/plugins/radar-android-phone-usage/src/main/java/org/radarbase/passive/phone/usage/PhoneUsageManager.kt +++ b/plugins/radar-android-phone-usage/src/main/java/org/radarbase/passive/phone/usage/PhoneUsageManager.kt @@ -173,7 +173,7 @@ class PhoneUsageManager(context: PhoneUsageService) : AbstractSourceManager UsageEventType.BACKGROUND CONFIGURATION_CHANGE -> UsageEventType.CONFIG SHORTCUT_INVOCATION_COMPAT -> UsageEventType.SHORTCUT - USER_INTERACTION_COMPAT -> UsageEventType.INTERACTION + USER_INTERACTION -> UsageEventType.INTERACTION else -> UsageEventType.OTHER } @@ -223,8 +223,7 @@ class PhoneUsageManager(context: PhoneUsageService) : AbstractSourceManager= 25) SHORTCUT_INVOCATION else 8 - private val USER_INTERACTION_COMPAT = if (Build.VERSION.SDK_INT >= 23) USER_INTERACTION else 7 + private val SHORTCUT_INVOCATION_COMPAT = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) SHORTCUT_INVOCATION else 8 private const val LAST_PACKAGE_NAME = "org.radarcns.phone.packageName" private const val LAST_EVENT_TIMESTAMP = "org.radarcns.phone.timestamp" diff --git a/plugins/radar-android-phone-usage/src/main/java/org/radarbase/passive/phone/usage/PhoneUsageProvider.kt b/plugins/radar-android-phone-usage/src/main/java/org/radarbase/passive/phone/usage/PhoneUsageProvider.kt index 4efc54b42..188184de4 100644 --- a/plugins/radar-android-phone-usage/src/main/java/org/radarbase/passive/phone/usage/PhoneUsageProvider.kt +++ b/plugins/radar-android-phone-usage/src/main/java/org/radarbase/passive/phone/usage/PhoneUsageProvider.kt @@ -17,7 +17,6 @@ package org.radarbase.passive.phone.usage import android.Manifest.permission.PACKAGE_USAGE_STATS -import android.os.Build import org.radarbase.android.BuildConfig import org.radarbase.android.RadarService import org.radarbase.android.source.BaseSourceState diff --git a/plugins/radar-android-phone/src/main/AndroidManifest.xml b/plugins/radar-android-phone/src/main/AndroidManifest.xml index 3f25ff405..d4e44df97 100644 --- a/plugins/radar-android-phone/src/main/AndroidManifest.xml +++ b/plugins/radar-android-phone/src/main/AndroidManifest.xml @@ -4,11 +4,16 @@ - - + + + - + + diff --git a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneBluetoothManager.kt b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneBluetoothManager.kt index c39348159..496d1b9a1 100644 --- a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneBluetoothManager.kt +++ b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneBluetoothManager.kt @@ -31,6 +31,7 @@ import org.radarbase.android.source.AbstractSourceManager import org.radarbase.android.source.BaseSourceState import org.radarbase.android.source.SourceStatusListener import org.radarbase.android.util.BluetoothStateReceiver.Companion.bluetoothAdapter +import org.radarbase.android.util.BluetoothStateReceiver.Companion.hasBluetoothPermission import org.radarbase.android.util.OfflineProcessor import org.radarcns.kafka.ObservationKey import org.radarcns.passive.phone.PhoneBluetoothDevices @@ -65,14 +66,11 @@ class PhoneBluetoothManager(service: PhoneBluetoothService) : AbstractSourceMana logger.error("Bluetooth is not available.") return } + if (!service.hasBluetoothPermission) { + logger.error("Cannot initiate Bluetooth scan without scan permissions") + return + } if (bluetoothAdapter.isEnabled) { - val scanPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - Manifest.permission.BLUETOOTH_SCAN - } else Manifest.permission.BLUETOOTH_ADMIN - if (ActivityCompat.checkSelfPermission(service, scanPermission) != PackageManager.PERMISSION_GRANTED) { - logger.error("Cannot initiate Bluetooth scan without scan permissions") - return - } val filter = IntentFilter().apply { addAction(BluetoothDevice.ACTION_FOUND) addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED) diff --git a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneBluetoothProvider.kt b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneBluetoothProvider.kt index 989f17de6..5755ba8d7 100644 --- a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneBluetoothProvider.kt +++ b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneBluetoothProvider.kt @@ -16,13 +16,12 @@ package org.radarbase.passive.phone -import android.Manifest.permission.* import android.content.pm.PackageManager -import android.os.Build import org.radarbase.android.BuildConfig import org.radarbase.android.RadarService import org.radarbase.android.source.BaseSourceState import org.radarbase.android.source.SourceProvider +import org.radarbase.android.util.BluetoothStateReceiver.Companion.bluetoothPermissionList import org.radarbase.passive.phone.PhoneSensorProvider.Companion.MODEL import org.radarbase.passive.phone.PhoneSensorProvider.Companion.PRODUCER @@ -44,19 +43,7 @@ open class PhoneBluetoothProvider(radarService: RadarService) : SourceProvider = buildList { - add(ACCESS_COARSE_LOCATION) - add(ACCESS_FINE_LOCATION) - add(BLUETOOTH) - add(BLUETOOTH_ADMIN) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - add(BLUETOOTH_SCAN) - add(BLUETOOTH_CONNECT) - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - add(ACCESS_BACKGROUND_LOCATION) - } - } + override val permissionsNeeded: List = bluetoothPermissionList override val featuresNeeded: List = listOf(PackageManager.FEATURE_BLUETOOTH) diff --git a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneLocationManager.kt b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneLocationManager.kt index 94f875abd..6fdcc021f 100644 --- a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneLocationManager.kt +++ b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneLocationManager.kt @@ -140,6 +140,7 @@ class PhoneLocationManager(context: PhoneLocationService) : AbstractSourceManage longitude, accuracy, altitude, speed, bearing, timestamp) } + @Deprecated("This callback will never be invoked on Android Q and above.") override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {} override fun onProviderEnabled(provider: String) {} diff --git a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneSensorManager.kt b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneSensorManager.kt index 3f19e35a7..88d1043ad 100644 --- a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneSensorManager.kt +++ b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneSensorManager.kt @@ -306,8 +306,9 @@ class PhoneSensorManager(context: PhoneSensorService) : AbstractSourceManager SparseArray.computeIfAbsent(key: Int, compute: () -> T) = get(key) diff --git a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneSensorService.kt b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneSensorService.kt index a966a1492..44be7f9e8 100644 --- a/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneSensorService.kt +++ b/plugins/radar-android-phone/src/main/java/org/radarbase/passive/phone/PhoneSensorService.kt @@ -21,7 +21,6 @@ import android.util.SparseIntArray import org.radarbase.android.config.SingleRadarConfiguration import org.radarbase.android.source.SourceManager import org.radarbase.android.source.SourceService -import org.slf4j.LoggerFactory import java.util.concurrent.TimeUnit /** diff --git a/plugins/radar-android-ppg/gradle.skip b/plugins/radar-android-ppg/gradle.skip new file mode 100644 index 000000000..e69de29bb diff --git a/plugins/radar-android-weather/src/main/java/org/radarbase/passive/weather/WeatherApiProvider.kt b/plugins/radar-android-weather/src/main/java/org/radarbase/passive/weather/WeatherApiProvider.kt index 156bb4648..58ef33a50 100644 --- a/plugins/radar-android-weather/src/main/java/org/radarbase/passive/weather/WeatherApiProvider.kt +++ b/plugins/radar-android-weather/src/main/java/org/radarbase/passive/weather/WeatherApiProvider.kt @@ -19,11 +19,13 @@ package org.radarbase.passive.weather import android.Manifest.permission.* import android.content.pm.PackageManager import android.os.Build +import androidx.annotation.Keep import org.radarbase.android.BuildConfig import org.radarbase.android.RadarService import org.radarbase.android.source.BaseSourceState import org.radarbase.android.source.SourceProvider +@Keep open class WeatherApiProvider(radarService: RadarService) : SourceProvider(radarService) { override val description: String? get() = radarService.getString(R.string.weather_api_description) diff --git a/plugins/radar-android-weather/src/main/java/org/radarbase/passive/weather/WeatherApiService.kt b/plugins/radar-android-weather/src/main/java/org/radarbase/passive/weather/WeatherApiService.kt index 88cfd7f5f..8a72d598c 100644 --- a/plugins/radar-android-weather/src/main/java/org/radarbase/passive/weather/WeatherApiService.kt +++ b/plugins/radar-android-weather/src/main/java/org/radarbase/passive/weather/WeatherApiService.kt @@ -46,8 +46,9 @@ class WeatherApiService : SourceService() { manager as WeatherApiManager manager.setQueryInterval(config.getLong(WEATHER_QUERY_INTERVAL, WEATHER_QUERY_INTERVAL_DEFAULT), TimeUnit.SECONDS) manager.setSource( - config.getString(WEATHER_API_SOURCE, WEATHER_API_SOURCE_DEFAULT), - config.optString(WEATHER_API_KEY)) + config.getString(WEATHER_API_SOURCE, WEATHER_API_SOURCE_DEFAULT), + config.optString(WEATHER_API_KEY), + ) } companion object { diff --git a/radar-commons-android/src/main/java/org/radarbase/android/AbstractRadarApplication.kt b/radar-commons-android/src/main/java/org/radarbase/android/AbstractRadarApplication.kt index 63c6df5fa..d5f1f8230 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/AbstractRadarApplication.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/AbstractRadarApplication.kt @@ -31,7 +31,7 @@ abstract class AbstractRadarApplication : Application(), RadarApplication { private lateinit var innerNotificationHandler: NotificationHandler override val notificationHandler: NotificationHandler - get() = innerNotificationHandler.apply { onCreate() } + get() = innerNotificationHandler override lateinit var configuration: RadarConfiguration @@ -51,7 +51,7 @@ abstract class AbstractRadarApplication : Application(), RadarApplication { // initialize crashlytics HandroidLoggerAdapter.DEBUG = BuildConfig.DEBUG HandroidLoggerAdapter.APP_NAME = packageName - HandroidLoggerAdapter.enableLoggingToCrashlytics() + HandroidLoggerAdapter.enableLoggingToFirebaseCrashlytics() } /** diff --git a/radar-commons-android/src/main/java/org/radarbase/android/RadarApplication.kt b/radar-commons-android/src/main/java/org/radarbase/android/RadarApplication.kt index 56b63873d..ad747983a 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/RadarApplication.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/RadarApplication.kt @@ -30,11 +30,6 @@ interface RadarApplication { val configuration: RadarConfiguration - /** Large icon bitmap. */ - val largeIcon: Bitmap - /** Small icon drawable resource ID. */ - val smallIcon: Int - val mainActivity: Class val loginActivity: Class diff --git a/radar-commons-android/src/main/java/org/radarbase/android/RadarService.kt b/radar-commons-android/src/main/java/org/radarbase/android/RadarService.kt index bdf691f78..4eac4080c 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/RadarService.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/RadarService.kt @@ -108,6 +108,7 @@ abstract class RadarService : LifecycleService(), ServerStatusListener, LoginLis add(POST_NOTIFICATIONS) } } + private lateinit var notificationHandler: NotificationHandler override fun onBind(intent: Intent): IBinder? { super.onBind(intent) @@ -124,6 +125,7 @@ abstract class RadarService : LifecycleService(), ServerStatusListener, LoginLis override fun onCreate() { super.onCreate() serverStatus = ServerStatusListener.Status.DISABLED + notificationHandler = NotificationHandler(this) binder = createBinder() mHandler = SafeHandler.getInstance("RadarService", THREAD_PRIORITY_BACKGROUND).apply { start() @@ -186,7 +188,7 @@ abstract class RadarService : LifecycleService(), ServerStatusListener, LoginLis .filter { it.needsBluetooth() } .forEach { it.stopRecording() } - bluetoothNotification = radarApp.notificationHandler.notify( + bluetoothNotification = notificationHandler.notify( BLUETOOTH_NOTIFICATION, NotificationHandler.NOTIFICATION_CHANNEL_ALERT, false @@ -213,7 +215,7 @@ abstract class RadarService : LifecycleService(), ServerStatusListener, LoginLis protected open fun createForegroundNotification(): Notification { val mainIntent = Intent(this, radarApp.mainActivity) - return radarApp.notificationHandler.create( + return notificationHandler.create( NOTIFICATION_CHANNEL_INFO, true ) { diff --git a/radar-commons-android/src/main/java/org/radarbase/android/util/BluetoothEnforcer.kt b/radar-commons-android/src/main/java/org/radarbase/android/util/BluetoothEnforcer.kt index 4d0763a57..e4b05873b 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/util/BluetoothEnforcer.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/util/BluetoothEnforcer.kt @@ -13,6 +13,7 @@ import org.radarbase.android.RadarApplication.Companion.radarConfig import org.radarbase.android.RadarConfiguration.Companion.ENABLE_BLUETOOTH_REQUESTS import org.radarbase.android.RadarService import org.radarbase.android.util.BluetoothStateReceiver.Companion.bluetoothIsEnabled +import org.slf4j.LoggerFactory import java.util.concurrent.TimeUnit class BluetoothEnforcer( @@ -114,10 +115,14 @@ class BluetoothEnforcer( .putLong(LAST_REQUEST, System.currentTimeMillis()) .apply() - context.startActivityForResult(Intent().apply { - action = BluetoothAdapter.ACTION_REQUEST_ENABLE - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - }, REQUEST_ENABLE_BT) + try { + context.startActivityForResult(Intent().apply { + action = BluetoothAdapter.ACTION_REQUEST_ENABLE + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + }, REQUEST_ENABLE_BT) + } catch (ex: SecurityException) { + logger.warn("Cannot request Bluetooth to be enabled - no permission") + } } isRequestingBluetooth = false }, 1000L) @@ -134,5 +139,7 @@ class BluetoothEnforcer( const val REQUEST_ENABLE_BT: Int = 6944 private const val LAST_REQUEST: String = "lastRequest" private const val BLUETOOTH_REQUEST_COOLDOWN = "bluetooth_request_cooldown" + + private val logger = LoggerFactory.getLogger(BluetoothEnforcer::class.java) } } diff --git a/radar-commons-android/src/main/java/org/radarbase/android/util/BluetoothStateReceiver.kt b/radar-commons-android/src/main/java/org/radarbase/android/util/BluetoothStateReceiver.kt index da51f2f8f..d2b8403f8 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/util/BluetoothStateReceiver.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/util/BluetoothStateReceiver.kt @@ -1,5 +1,6 @@ package org.radarbase.android.util +import android.Manifest import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothAdapter.STATE_CONNECTED import android.bluetooth.BluetoothManager @@ -8,6 +9,9 @@ import android.content.Context import android.content.Context.BLUETOOTH_SERVICE import android.content.Intent import android.content.IntentFilter +import android.content.pm.PackageManager +import android.os.Build +import androidx.core.app.ActivityCompat import org.slf4j.LoggerFactory class BluetoothStateReceiver( @@ -54,7 +58,11 @@ class BluetoothStateReceiver( @Synchronized override fun unregister() { if (isRegistered) { - context.unregisterReceiver(receiver) + try { + context.unregisterReceiver(receiver) + } catch (ex: Exception) { + logger.debug("Failed to unregister BluetoothStateReceiver: {}", ex.toString()) + } isRegistered = false } } @@ -67,5 +75,25 @@ class BluetoothStateReceiver( val Context.bluetoothIsEnabled: Boolean get() = bluetoothAdapter?.isEnabled == true + + val bluetoothPermissionList: List = buildList { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + add(Manifest.permission.BLUETOOTH_SCAN) + add(Manifest.permission.BLUETOOTH_CONNECT) + } else { + add(Manifest.permission.ACCESS_COARSE_LOCATION) + add(Manifest.permission.ACCESS_FINE_LOCATION) + add(Manifest.permission.BLUETOOTH) + add(Manifest.permission.BLUETOOTH_ADMIN) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + add(Manifest.permission.ACCESS_BACKGROUND_LOCATION) + } + } + } + + val Context.hasBluetoothPermission: Boolean + get() = bluetoothPermissionList.all { permission -> + ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED + } } } diff --git a/radar-commons-android/src/main/java/org/radarbase/android/util/NotificationHandler.kt b/radar-commons-android/src/main/java/org/radarbase/android/util/NotificationHandler.kt index 195c13789..f972c5a10 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/util/NotificationHandler.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/util/NotificationHandler.kt @@ -12,20 +12,21 @@ import android.media.AudioAttributes import android.media.RingtoneManager import android.os.Build import androidx.annotation.RequiresApi +import androidx.appcompat.content.res.AppCompatResources.getDrawable +import androidx.core.graphics.drawable.toBitmap import org.radarbase.android.R -import org.radarbase.android.RadarApplication import org.slf4j.LoggerFactory /** * Handle notifications and notification channels. */ -class NotificationHandler(private val context: Context) { - private var isCreated: Boolean = false - +class NotificationHandler( + private val context: Context +) { val manager : NotificationManager? get() = context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager? - fun onCreate() { + init { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { createNotificationChannels() } @@ -34,12 +35,7 @@ class NotificationHandler(private val context: Context) { @RequiresApi(api = Build.VERSION_CODES.O) private fun createNotificationChannels() { manager?.run { - synchronized(this) { - if (isCreated) { - return - } - isCreated = true - } + if (!shouldCreate()) return logger.debug("Creating notification channels") createNotificationChannel(NOTIFICATION_CHANNEL_INFO, NotificationManager.IMPORTANCE_LOW, @@ -164,10 +160,13 @@ class NotificationHandler(private val context: Context) { } private fun Notification.Builder.updateNotificationAppSettings(includeIntent: Boolean) { - (context.applicationContext as? RadarApplication)?.let { app -> - setLargeIcon(app.largeIcon) - setSmallIcon(app.smallIcon) - } + setLargeIcon( + getDrawable(context, R.mipmap.ic_launcher) + ?.toBitmap() + ) + setSmallIcon( + R.drawable.ic_bt_connected + ) if (includeIntent) { val intent = context.packageManager.getLaunchIntentForPackage(context.packageName) @@ -205,6 +204,18 @@ class NotificationHandler(private val context: Context) { const val NOTIFICATION_CHANNEL_FINAL_ALERT = "org.radarbase.android.NotificationHandler.FINAL_ALERT" private const val NOTIFICATION_REQUEST_CODE = 27581 + + private val syncObject = Any() + private var isCreated = false + + private fun shouldCreate(): Boolean = synchronized(syncObject) { + if (!isCreated) { + isCreated = true + true + } else { + false + } + } } data class NotificationRegistration( diff --git a/radar-commons-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/radar-commons-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..036d09bc5 --- /dev/null +++ b/radar-commons-android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/radar-commons-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/radar-commons-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..036d09bc5 --- /dev/null +++ b/radar-commons-android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher.png b/radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0b6f26230c18316e63ae97d0913468671df8e7 GIT binary patch literal 4546 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 literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..acbe056db44a99abff326047041d44d88491eb70 GIT binary patch literal 6527 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 E1EpPps{jB1 literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher_round.png b/radar-commons-android/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c2043d793f59d0057bd19aec2f08ab9586994a GIT binary patch literal 6887 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 literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-mdpi/ic_launcher.png b/radar-commons-android/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8abf26e13ec493a9d61bfd8dd28ed70ec1503fa0 GIT binary patch literal 2756 zcmV;#3On_QP)3|ej7j6ZH11mz7esa! zK&`UMB8vzN3JMAc%nY&$%plva&ISz2fa9;Imxi&_J)(`;usb`XzuKV`*t=`3Vtd z z7~b0Ig9*!a7`+N+r#rlqAl zPXx5)&b9;I4W+6E%-wqoOMSz!BQycK!;`S#WUL@CX{{@s`D81`FLlP|pg0s&)!Fs8 zg*AboprEnVvi52=1isY{v~?O$TwRB#jH_@CmtgJjD6AoD3yFuH+z5M|3d^3DXy%6Myo}ALp@qMyP(juL7~>;LVY8dKND|=Z?*|uG7q}j9MP{uI z6N9rbHByGf$=48G+JFj8GpZUjma$seJMbRa&2yh_!`1Sd2SXqrB?}{+Rtep1(r6GJ z6AhRBE{KSXKz@EcnwpwmG#bUXnsy^HYV~lDR$@wo3~!#6Bd)xum&&mH%>3#IURk*p zDvkdB6X-B@A*-|k%5o(9jg5`wNm13LMQTAA&XM8fmRAb_g`mc6951ZJYhhAs z$t*{ESGQ%%23-p#F580z9)W1@`Tm{|=;-J`Wo0G0y1IIiP$(5}b9ck#^vhzk^@cVa zPPl|Wtl5uIb64See_w&&b5>x)yDRaFe{IBP2SWv!ZX%f9)QZ2w=3#YO89KXf>-|L{ z?Q;4&G=}zjM}UGG4*MP^!@RAxYPA~fp6*D`NEgK9$|_7{)JiUIpE_?@M8?|%5+8ic0i&=@9E)Yc(6B^kU} zJU*}dyo3Vm%c*pnKM(TnGCKho{5<$#4%tE9 zYQ-r92SHw>y)Jv9)9EaWQk?67XCURr%;f2@eZoP zMqJUL!H?cwYxj=91|CAYz~lP*`$8_4-`?dKt#G;JI)h^b0)hgNav{YsFnf{FwEb$z zUu23Z;bCkAGvk*ZZ$Uf}<($X%of+nxOq3+zZ2VcvLKSNacq3AdtXiF81lapz=VV(5 zNMyy7QEn0Uyn6kq592SCQh)3fj5pSM*u67@ZG^|lypk!Lg*o_DHn(GXR4ybHYR3q8 zAM}PiSB?U8D~bqlSp}G|boZ@orzkw64+Ax0g?}WTU9=TWdye*c{wS#wM{&Mq@5N)u zWHOu#I4NQd|5mkj2p3Bc+c5&>9ax!KCXgU4#F)j~?RJ1Y&Qw}yPUu+ohs|Ct2=M)K zzX*%)uYc)=eH5s;UKrftrFg6>SyvDo8jOr01^&A2ATE~GU85O78WE3OGxXfABnTWuxZ&uPLaT73?B zY$KnLiV4+Bk|6GE98RT4#jYfkRO3%%1DPrZZGa7n^PCt(qsSokY)n^*72OaJD+q8PnzGIf zgZdEM3=UZA^R1tap0@^JRQ&K5*GftddnOi_N&kO3e;p*bCHPQMh#gl%f#VnfPSgT} z0+EoIfQYhsObU~tRNH28s|*?0!pmRmx+4i|um{>68c%_+8}h~$cvIAEC-1}dF>RA4 zlCL+2AeK%wgu?{*nwOu4&{LtP)wkl^_yVlGr0A7=F>;;kU zSGBZbCaKA;tO{HzQVP3?&b*3U*%e~94aR$rjq;UuA-$&vPpQ&i0+om{%BEff7|m_% z@J~t?uJQ+SR|^-)U}I$?UwR}QdDm4mt_kJ(HsRGiOD;h@EezWOCx~sGohYDMp-_G6 zq~e|sV8mwS2^_-7fvC!2)tw$g9f7DESpCQNi&$BNZ>v%0@~P zWLQCQMb}{zae~v08ujgD?)F­b4;Y$X5w1QjHiB^B68<>2_BEK%EXg=IUjH9ER( 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 literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-mdpi/ic_launcher_round.png b/radar-commons-android/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..2d25218a95725684ddc14bb5eef5e434c38adf4b GIT binary patch literal 4159 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 JPDHLkV1ifOJa+&9 literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher.png b/radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..13bbbffa6bb8874c515732fcf61792af9b6d2a85 GIT binary patch literal 6443 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

8E=L1w;uIkgJV$3lBfP(wlIY48}LpR{{1elG; z8AAl2j0O9H-4D5QEFRgY+B#TD1N#hzg@+2W5?(h59#_@E4xgl8A?Fb?k2n@VJ9qEY z%z9KkU|*Y|iteFcOfmp~gR@rH*s#;V1XLm*tq7S5kp$%A06pP5pK%I6Me9;N?lEy}=4d zPEMwM`}eV8ln4f(^1|8GnSz3YIOc>hNYwA3iVbmmROO|nrt)tgM??4pA4rkP?}2+F zP>4Orom~TmM23Pf%>eba6rEMbficOOMP_P+YaoX%AeLZ_lRX|APUuSsQbBC zRt>MQ!Mop3wumYTBDETnTSM!Ee~uhuTq8*1f!X z5AVQySU7rj&RxN6P<8!}b+$Us7-`5D&^D|L2nq`N-wPwm012>`paOZsf;!+YY52Y{0zHD!}ATgk#qN35l!s2nz?ot_mf4_0{ zv(G+zhfshS=6_*waey|Uk#H(=r%jtS5wsJNcjyejVQXuPe^Pd{FbDU*a}*Eg#dDMo zzuX~c^8;vu&_-}@@P5!tO}k4w)Hk_t=FFK-l!*f`=fH!+L;J88#DgzufCd7felKVv zy!rAMUwjb?_@-5>R{cat&!HSwzW(~__>Vvnmn~a1Tdaig=4Mqw!+fX?h#eI3CMG6U zELgB$4rn!f`t+MXI|VI=d|WeS%9Pv1=j0b&c;Q7KAD@GQ(*-3ZCC%mKd(sw zJZ9klwtyC1US96cJ@?#8ppiK6kKBgmKk2CtaPqnbAAE3v_?#^8*n|lao)%(h=Dd0H z{yBH<+}W2SFm}*D(Bc`;1hi4p=sGpchV_6&bp51BlYSwNN#gqh0>2W#|I50Z0UA62 znt(Rq`}J3-Xf+}SxC*6w!^DXbZ@c&2d+)sGo_l_I_uY3-xEz78g9e}lXriXgu+Myb z2Oa|Z7IF>`y_^9WfEJ@dc=KUC%!m0fALhe+n2#UF@gG7II0p~yFrfed002ovPDHLk FV1jq;688WA literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb48176dad325afdfd0c451197ac40a3027bea5 GIT binary patch literal 9158 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 literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/radar-commons-android/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ac8fbad0d001e96b429c38aa0114b67906ee3b GIT binary patch literal 10008 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 RUkW)0IVokyTJc{&{|_50u!R5s literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/radar-commons-android/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..237c7b3c3f444171553ddb9490adfbdbbd9d26d7 GIT binary patch literal 15204 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 literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/radar-commons-android/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4112673fd3e7f5734a02891627dca79e46a727 GIT binary patch literal 14016 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 Ri}*JhJ#9m+vfB>f{{uXgQPltd literal 0 HcmV?d00001 diff --git a/radar-commons-android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/radar-commons-android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e5051720fb247afc3e83b6ca0d5f6e5fb73104 GIT binary patch literal 22725 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 Date: Wed, 3 May 2023 23:17:32 +0530 Subject: [PATCH 02/10] service properties modified Skip PPG plugin from building on Github actions Fix snyk check Set up service properties --- .snyk | 2 +- README.md | 4 ++-- avro-android/src/main/AndroidManifest.xml | 1 + .../src/main/AndroidManifest.xml | 4 +++- .../src/main/AndroidManifest.xml | 5 ++++- .../src/main/AndroidManifest.xml | 4 +++- .../src/main/AndroidManifest.xml | 5 ++++- .../src/main/AndroidManifest.xml | 4 +++- .../src/main/AndroidManifest.xml | 4 +++- .../src/main/AndroidManifest.xml | 16 ++++++++++++---- .../src/main/AndroidManifest.xml | 4 +++- .../src/main/AndroidManifest.xml | 4 +++- 12 files changed, 42 insertions(+), 15 deletions(-) diff --git a/.snyk b/.snyk index 919cdb02f..358ea9d1b 100644 --- a/.snyk +++ b/.snyk @@ -5,6 +5,6 @@ ignore: SNYK-JAVA-ORGJETBRAINSKOTLIN-2393744: - '*': reason: Not using createTempFile/Dir - expires: 2022-10-27T10:04:03.174Z + expires: 2023-10-27T10:04:03.174Z created: 2022-06-27T10:04:03.177Z patch: {} diff --git a/README.md b/README.md index 528331dca..df4f7628f 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ repositories { mavenCentral() } dependencies { - api 'org.radarbase:radar-commons-android:1.2.1' + api 'org.radarbase:radar-commons-android:1.2.2' } ``` @@ -48,7 +48,7 @@ Include additional plugins by adding: ```gradle dependencies { - implementation 'org.radarbase::1.2.1' + implementation 'org.radarbase::1.2.2' } ``` diff --git a/avro-android/src/main/AndroidManifest.xml b/avro-android/src/main/AndroidManifest.xml index 9b65eb06c..d30de6534 100644 --- a/avro-android/src/main/AndroidManifest.xml +++ b/avro-android/src/main/AndroidManifest.xml @@ -1 +1,2 @@ + diff --git a/plugins/radar-android-application-status/src/main/AndroidManifest.xml b/plugins/radar-android-application-status/src/main/AndroidManifest.xml index 8003fa0a4..cd45aef03 100644 --- a/plugins/radar-android-application-status/src/main/AndroidManifest.xml +++ b/plugins/radar-android-application-status/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ - + diff --git a/plugins/radar-android-audio/src/main/AndroidManifest.xml b/plugins/radar-android-audio/src/main/AndroidManifest.xml index e51b3a9b1..46fddfb7e 100644 --- a/plugins/radar-android-audio/src/main/AndroidManifest.xml +++ b/plugins/radar-android-audio/src/main/AndroidManifest.xml @@ -8,6 +8,9 @@ + android:foregroundServiceType="microphone" + android:exported="false" + android:description="Audio Service for the RADAR passive remote monitoring app." + /> diff --git a/plugins/radar-android-empatica/src/main/AndroidManifest.xml b/plugins/radar-android-empatica/src/main/AndroidManifest.xml index 6df293abd..344600b38 100644 --- a/plugins/radar-android-empatica/src/main/AndroidManifest.xml +++ b/plugins/radar-android-empatica/src/main/AndroidManifest.xml @@ -20,6 +20,8 @@ + android:foregroundServiceType="location" + android:exported="false" + android:description="Service which intercat with Empatica." /> diff --git a/plugins/radar-android-faros/src/main/AndroidManifest.xml b/plugins/radar-android-faros/src/main/AndroidManifest.xml index 1ce61b710..ab68d6c03 100644 --- a/plugins/radar-android-faros/src/main/AndroidManifest.xml +++ b/plugins/radar-android-faros/src/main/AndroidManifest.xml @@ -19,6 +19,9 @@ + android:foregroundServiceType="location" + android:exported="false" + android:description="Service for the eMotion Faros 180 and 360 devices." + /> diff --git a/plugins/radar-android-phone-telephony/src/main/AndroidManifest.xml b/plugins/radar-android-phone-telephony/src/main/AndroidManifest.xml index 6dd3ff31d..549c8812e 100644 --- a/plugins/radar-android-phone-telephony/src/main/AndroidManifest.xml +++ b/plugins/radar-android-phone-telephony/src/main/AndroidManifest.xml @@ -5,6 +5,8 @@ - + diff --git a/plugins/radar-android-phone-usage/src/main/AndroidManifest.xml b/plugins/radar-android-phone-usage/src/main/AndroidManifest.xml index 9ed10e4b9..6343391aa 100644 --- a/plugins/radar-android-phone-usage/src/main/AndroidManifest.xml +++ b/plugins/radar-android-phone-usage/src/main/AndroidManifest.xml @@ -7,6 +7,8 @@ android:name="android.permission.PACKAGE_USAGE_STATS"/> - + diff --git a/plugins/radar-android-phone/src/main/AndroidManifest.xml b/plugins/radar-android-phone/src/main/AndroidManifest.xml index d4e44df97..cc3481731 100644 --- a/plugins/radar-android-phone/src/main/AndroidManifest.xml +++ b/plugins/radar-android-phone/src/main/AndroidManifest.xml @@ -19,11 +19,19 @@ - + - + android:foregroundServiceType="location" + android:exported="false" + android:description="Service that monitors current GPS and/or network location." /> + + android:foregroundServiceType="location" + android:exported="false" + android:description="Service that monitors bluetooth usage." /> diff --git a/plugins/radar-android-ppg/src/main/AndroidManifest.xml b/plugins/radar-android-ppg/src/main/AndroidManifest.xml index 32999094e..40ce3a12c 100644 --- a/plugins/radar-android-ppg/src/main/AndroidManifest.xml +++ b/plugins/radar-android-ppg/src/main/AndroidManifest.xml @@ -8,7 +8,9 @@ - + diff --git a/plugins/radar-android-weather/src/main/AndroidManifest.xml b/plugins/radar-android-weather/src/main/AndroidManifest.xml index d5e0d80bc..74f400c1a 100644 --- a/plugins/radar-android-weather/src/main/AndroidManifest.xml +++ b/plugins/radar-android-weather/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ + android:foregroundServiceType="location" + android:exported="false" + android:description="Sevice which collects weather data based on phone location." /> From 30de5b48879f09c4b688fd7163c92dec149bf0c3 Mon Sep 17 00:00:00 2001 From: Aditya Mishra Date: Thu, 4 May 2023 00:08:18 +0530 Subject: [PATCH 03/10] bump java version in all workflows --- .github/workflows/main.yml | 2 +- .github/workflows/publish_snapshots.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/scheduled_snyk.yaml | 2 +- .github/workflows/snyk.yaml | 2 +- .snyk | 2 +- README.md | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 73952e766..7374f959f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-java@v3 with: - java-version: 11 + java-version: 17 distribution: temurin - uses: gradle/gradle-build-action@v2 diff --git a/.github/workflows/publish_snapshots.yml b/.github/workflows/publish_snapshots.yml index 6e709d460..067c4f87e 100644 --- a/.github/workflows/publish_snapshots.yml +++ b/.github/workflows/publish_snapshots.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: temurin - java-version: 11 + java-version: 17 - uses: gradle/gradle-build-action@v2 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 721b1be07..33f3b0e1c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: temurin - java-version: 11 + java-version: 17 - uses: gradle/gradle-build-action@v2 diff --git a/.github/workflows/scheduled_snyk.yaml b/.github/workflows/scheduled_snyk.yaml index e727787c0..ee5d6ca0b 100644 --- a/.github/workflows/scheduled_snyk.yaml +++ b/.github/workflows/scheduled_snyk.yaml @@ -21,7 +21,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: temurin - java-version: 11 + java-version: 17 - name: Decrypt libraries run: ./.github/scripts/decrypt_libraries.sh diff --git a/.github/workflows/snyk.yaml b/.github/workflows/snyk.yaml index 380521e58..00bde44d6 100644 --- a/.github/workflows/snyk.yaml +++ b/.github/workflows/snyk.yaml @@ -16,7 +16,7 @@ jobs: - uses: actions/setup-java@v3 with: distribution: temurin - java-version: 11 + java-version: 17 - name: Decrypt libraries run: ./.github/scripts/decrypt_libraries.sh diff --git a/.snyk b/.snyk index 919cdb02f..358ea9d1b 100644 --- a/.snyk +++ b/.snyk @@ -5,6 +5,6 @@ ignore: SNYK-JAVA-ORGJETBRAINSKOTLIN-2393744: - '*': reason: Not using createTempFile/Dir - expires: 2022-10-27T10:04:03.174Z + expires: 2023-10-27T10:04:03.174Z created: 2022-06-27T10:04:03.177Z patch: {} diff --git a/README.md b/README.md index 528331dca..df4f7628f 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ repositories { mavenCentral() } dependencies { - api 'org.radarbase:radar-commons-android:1.2.1' + api 'org.radarbase:radar-commons-android:1.2.2' } ``` @@ -48,7 +48,7 @@ Include additional plugins by adding: ```gradle dependencies { - implementation 'org.radarbase::1.2.1' + implementation 'org.radarbase::1.2.2' } ``` From fcbd17862f96e453c30751c41356cbd5377f4e82 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 26 Jan 2023 11:33:34 +0100 Subject: [PATCH 04/10] Added instructions for publishing schemas to mavenLocal --- .snyk | 2 +- README.md | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.snyk b/.snyk index 919cdb02f..358ea9d1b 100644 --- a/.snyk +++ b/.snyk @@ -5,6 +5,6 @@ ignore: SNYK-JAVA-ORGJETBRAINSKOTLIN-2393744: - '*': reason: Not using createTempFile/Dir - expires: 2022-10-27T10:04:03.174Z + expires: 2023-10-27T10:04:03.174Z created: 2022-06-27T10:04:03.177Z patch: {} diff --git a/README.md b/README.md index 528331dca..6ccbc2f58 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ repositories { mavenCentral() } dependencies { - api 'org.radarbase:radar-commons-android:1.2.1' + api 'org.radarbase:radar-commons-android:1.2.2' } ``` @@ -48,7 +48,7 @@ Include additional plugins by adding: ```gradle dependencies { - implementation 'org.radarbase::1.2.1' + implementation 'org.radarbase::1.2.2' } ``` @@ -97,6 +97,35 @@ To only build plugins that are of interest to you, add a `gradle.skip` file in a If you want to contribute a feature or fix browse our [issues](https://github.com/RADAR-base/radar-commons-android/issues), and please make a pull request. +## Publishing Schemas to Maven Local + +While the plugin is in development phase schemas are not published centrally. To access the java generated file from avro schemas first publish them to maven local. +To publish schemas locally to Maven, please follow these steps: + +1. Change your working directory to java-sdk in RADAR-Schemas. + +2. Run the following commands in your terminal: +```shell +./gradlew build +./gradlew publishToMavenLocal +``` + +3. In your build.gradle file, add the following to your repositories block: +```gradle +repositories { + mavenLocal() +} +``` + +4. In the same build.gradle file, add the following to your dependencies block, replacing `$radarSchemasVersion` with its corresponding value: +```gradle +dependencies { + implementation "org.radarbase:radar-schemas-commons:$radarSchemasVersion" +} +``` + +You can find the version value in the metadata of your local Maven repository. It should end in `SNAPSHOT`. + ## Licensing Code made in the RADAR-base platform is licensed under the Apache License 2.0, as listed in see the LICENSE file in this directory. Plugins that have additional licensing requirements list them in their README. From f890ee095818482471268b67af208afbd6287eb0 Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Thu, 4 May 2023 12:05:53 +0200 Subject: [PATCH 05/10] Bumped SNAPSHOT version --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index afbf2af12..bb22c19c5 100644 --- a/build.gradle +++ b/build.gradle @@ -41,10 +41,10 @@ allprojects { ext.issueUrl = 'https://github.com/' + githubRepoName + '/issues' ext.website = 'http://radar-base.org' - version = "1.2.3" + version = "1.2.4-SNAPSHOT" group = 'org.radarbase' - ext.versionCode = 51 + ext.versionCode = 52 } subprojects { From 65fcd2627ae8c5c013bf16279a0aba15142febac Mon Sep 17 00:00:00 2001 From: Joris Borgdorff Date: Wed, 10 May 2023 10:56:57 +0200 Subject: [PATCH 06/10] Add location permission dialogs --- .../android/util/PermissionHandler.kt | 100 ++++++++++++++---- .../src/main/res/values/strings.xml | 9 +- 2 files changed, 86 insertions(+), 23 deletions(-) diff --git a/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt b/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt index ac3cc695d..5f7e09b8f 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt @@ -13,19 +13,17 @@ import android.content.pm.PackageManager.PERMISSION_DENIED import android.content.pm.PackageManager.PERMISSION_GRANTED import android.location.LocationManager import android.net.Uri -import android.os.Build import android.os.Bundle import android.os.PowerManager import android.os.Process import android.provider.Settings -import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import androidx.lifecycle.LifecycleService import androidx.localbroadcastmanager.content.LocalBroadcastManager import org.radarbase.android.R import org.radarbase.android.RadarService +import org.radarbase.android.RadarService.Companion.ACCESS_BACKGROUND_LOCATION_COMPAT import org.slf4j.LoggerFactory @@ -47,7 +45,7 @@ open class PermissionHandler( val result = if (granted) PERMISSION_GRANTED else PERMISSION_DENIED broadcaster.send(RadarService.ACTION_PERMISSIONS_GRANTED) { - putExtra(RadarService.EXTRA_PERMISSIONS, arrayOf(Context.LOCATION_SERVICE)) + putExtra(RadarService.EXTRA_PERMISSIONS, arrayOf(LOCATION_SERVICE)) putExtra(RadarService.EXTRA_GRANT_RESULTS, intArrayOf(result)) } @@ -90,8 +88,24 @@ open class PermissionHandler( when { currentlyNeeded.isEmpty() -> logger.info("Already requested all permissions.") - Context.LOCATION_SERVICE in currentlyNeeded -> { - addRequestingPermissions(Context.LOCATION_SERVICE) + ACCESS_COARSE_LOCATION in currentlyNeeded || ACCESS_FINE_LOCATION in currentlyNeeded -> { + val locationPermissions = buildSet(2) { + if (ACCESS_COARSE_LOCATION in currentlyNeeded) { + add(ACCESS_COARSE_LOCATION) + } + if (ACCESS_FINE_LOCATION in currentlyNeeded) { + add(ACCESS_FINE_LOCATION) + } + } + addRequestingPermissions(locationPermissions) + requestLocationPermissions(locationPermissions) + } + ACCESS_BACKGROUND_LOCATION_COMPAT in currentlyNeeded -> { + addRequestingPermissions(ACCESS_BACKGROUND_LOCATION_COMPAT) + requestBackgroundLocationPermissions() + } + LOCATION_SERVICE in currentlyNeeded -> { + addRequestingPermissions(LOCATION_SERVICE) requestLocationProvider() } SYSTEM_ALERT_WINDOW in currentlyNeeded -> { @@ -108,19 +122,53 @@ open class PermissionHandler( } else -> { addRequestingPermissions(currentlyNeeded) - try { - ActivityCompat.requestPermissions( - activity, - currentlyNeeded.toTypedArray(), - REQUEST_ENABLE_PERMISSIONS, - ) - } catch (ex: IllegalStateException) { - logger.warn("Cannot request permission on closing activity") - } + requestPermissions(currentlyNeeded) + } + } + } + + private fun requestBackgroundLocationPermissions() { + alertDialog { + setTitle(R.string.enable_location_title) + setMessage(R.string.enable_location_background) + setPositiveButton(android.R.string.ok) { dialog, _ -> + dialog.dismiss() + requestPermissions(setOf(ACCESS_BACKGROUND_LOCATION_COMPAT)) + } + setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.cancel() + requestPermissions() + } + } + } + + private fun requestLocationPermissions(locationPermissions: Set) { + alertDialog { + setTitle(R.string.enable_location_title) + setMessage(R.string.enable_location) + setPositiveButton(android.R.string.ok) { dialog, _ -> + dialog.dismiss() + requestPermissions(locationPermissions) + } + setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.cancel() + requestPermissions() } } } + private fun requestPermissions(permissions: Set) { + try { + ActivityCompat.requestPermissions( + activity, + permissions.toTypedArray(), + REQUEST_ENABLE_PERMISSIONS, + ) + } catch (ex: IllegalStateException) { + logger.warn("Cannot request permission on closing activity") + } + } + private fun resetRequestingPermission() { isRequestingPermissions.clear() isRequestingPermissionsTime = java.lang.Long.MAX_VALUE @@ -146,8 +194,8 @@ open class PermissionHandler( try { activity.runOnUiThread { AlertDialog.Builder(activity, android.R.style.Theme_Material_Dialog_Alert) - .apply(configure) - .show() + .apply(configure) + .show() } } catch (ex: IllegalStateException) { logger.warn("Cannot show dialog on closing activity") @@ -157,12 +205,16 @@ open class PermissionHandler( private fun requestLocationProvider() { alertDialog { setTitle(R.string.enable_location_title) - setMessage(R.string.enable_location) + setMessage(R.string.enable_location_instruction) setPositiveButton(android.R.string.ok) { dialog, _ -> - dialog.cancel() + dialog.dismiss() Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) .startActivityForResult(LOCATION_REQUEST_CODE) } + setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.cancel() + requestPermissions() + } setIcon(android.R.drawable.ic_dialog_alert) } } @@ -200,13 +252,17 @@ open class PermissionHandler( setTitle(R.string.enable_package_usage_title) setMessage(R.string.enable_package_usage) setPositiveButton(android.R.string.ok) { dialog, _ -> - dialog.cancel() + dialog.dismiss() var intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS) if (intent.resolveActivity(activity.packageManager) == null) { intent = Intent(Settings.ACTION_SETTINGS) } intent.startActivityForResult(USAGE_REQUEST_CODE) } + setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.cancel() + requestPermissions() + } setIcon(android.R.drawable.ic_dialog_alert) } } @@ -214,7 +270,7 @@ open class PermissionHandler( fun onActivityResult(requestCode: Int, resultCode: Int) { when (requestCode) { LOCATION_REQUEST_CODE -> onPermissionRequestResult( - Context.LOCATION_SERVICE, + LOCATION_SERVICE, resultCode == Activity.RESULT_OK ) USAGE_REQUEST_CODE -> onPermissionRequestResult( @@ -307,7 +363,7 @@ open class PermissionHandler( private const val ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 232619697 and 0xFFFF fun Context.isPermissionGranted(permission: String): Boolean = when (permission) { - LOCATION_SERVICE -> applySystemService(Context.LOCATION_SERVICE) { locationManager -> + LOCATION_SERVICE -> applySystemService(LOCATION_SERVICE) { locationManager -> locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) } ?: true diff --git a/radar-commons-android/src/main/res/values/strings.xml b/radar-commons-android/src/main/res/values/strings.xml index fefb968e3..e8c9c85f8 100644 --- a/radar-commons-android/src/main/res/values/strings.xml +++ b/radar-commons-android/src/main/res/values/strings.xml @@ -9,7 +9,14 @@ Failed to login to authorization service, please retry Failed to log in - Location]]> + Location information is needed to enable Bluetooth Low Energy and/or location tracking as + part of the study. + + + Background location is needed to keep passively collecting data while the app is in the background, either for Bluetooth devices or for actual, relative location. + + + Location]]> Enable usage access to keep track of what kind of applications you use. Enable location tracking Enable usage tracking From 76a75808e1bdedab85baffc47ff9f35f2ae69bd8 Mon Sep 17 00:00:00 2001 From: Peyman Mohtashami Date: Wed, 10 May 2023 16:07:22 +0200 Subject: [PATCH 07/10] Modify layout and strings --- .../src/main/AndroidManifest.xml | 2 +- .../src/main/res/values/strings.xml | 4 +- .../src/main/AndroidManifest.xml | 3 +- .../src/main/AndroidManifest.xml | 2 +- .../src/main/AndroidManifest.xml | 3 +- .../src/main/AndroidManifest.xml | 2 +- .../src/main/AndroidManifest.xml | 2 +- .../src/main/AndroidManifest.xml | 8 ++-- .../src/main/AndroidManifest.xml | 2 +- .../src/main/res/values/strings.xml | 1 + .../src/main/AndroidManifest.xml | 2 +- .../android/util/PermissionHandler.kt | 19 +--------- .../baseline_location_on_green_700_48dp.xml | 6 +++ .../src/main/res/layout/location_dialog.xml | 38 +++++++++++++++++++ .../src/main/res/values/strings.xml | 5 +++ 15 files changed, 64 insertions(+), 35 deletions(-) create mode 100644 radar-commons-android/src/main/res/drawable/baseline_location_on_green_700_48dp.xml create mode 100644 radar-commons-android/src/main/res/layout/location_dialog.xml diff --git a/plugins/radar-android-application-status/src/main/AndroidManifest.xml b/plugins/radar-android-application-status/src/main/AndroidManifest.xml index cd45aef03..635aabfd0 100644 --- a/plugins/radar-android-application-status/src/main/AndroidManifest.xml +++ b/plugins/radar-android-application-status/src/main/AndroidManifest.xml @@ -4,6 +4,6 @@ + android:description="@string/application_status_description" /> diff --git a/plugins/radar-android-application-status/src/main/res/values/strings.xml b/plugins/radar-android-application-status/src/main/res/values/strings.xml index eec4a9a52..bb4b5ae86 100644 --- a/plugins/radar-android-application-status/src/main/res/values/strings.xml +++ b/plugins/radar-android-application-status/src/main/res/values/strings.xml @@ -1,6 +1,4 @@ Application - Monitors how much data the app is collecting and - server status. - + Monitors how much data the app is collecting and server status. diff --git a/plugins/radar-android-audio/src/main/AndroidManifest.xml b/plugins/radar-android-audio/src/main/AndroidManifest.xml index 46fddfb7e..5059bf293 100644 --- a/plugins/radar-android-audio/src/main/AndroidManifest.xml +++ b/plugins/radar-android-audio/src/main/AndroidManifest.xml @@ -10,7 +10,6 @@ + android:description="@string/audio_description" /> diff --git a/plugins/radar-android-empatica/src/main/AndroidManifest.xml b/plugins/radar-android-empatica/src/main/AndroidManifest.xml index 344600b38..b0266246b 100644 --- a/plugins/radar-android-empatica/src/main/AndroidManifest.xml +++ b/plugins/radar-android-empatica/src/main/AndroidManifest.xml @@ -22,6 +22,6 @@ android:name=".E4Service" android:foregroundServiceType="location" android:exported="false" - android:description="Service which intercat with Empatica." /> + android:description="@string/empatica_e4_explanation" /> diff --git a/plugins/radar-android-faros/src/main/AndroidManifest.xml b/plugins/radar-android-faros/src/main/AndroidManifest.xml index ab68d6c03..0f27076ab 100644 --- a/plugins/radar-android-faros/src/main/AndroidManifest.xml +++ b/plugins/radar-android-faros/src/main/AndroidManifest.xml @@ -21,7 +21,6 @@ + android:description="@string/farosDescription"/> diff --git a/plugins/radar-android-phone-telephony/src/main/AndroidManifest.xml b/plugins/radar-android-phone-telephony/src/main/AndroidManifest.xml index 549c8812e..134fec4a0 100644 --- a/plugins/radar-android-phone-telephony/src/main/AndroidManifest.xml +++ b/plugins/radar-android-phone-telephony/src/main/AndroidManifest.xml @@ -7,6 +7,6 @@ + android:description="@string/phone_log_description" /> diff --git a/plugins/radar-android-phone-usage/src/main/AndroidManifest.xml b/plugins/radar-android-phone-usage/src/main/AndroidManifest.xml index 6343391aa..4c3ec3781 100644 --- a/plugins/radar-android-phone-usage/src/main/AndroidManifest.xml +++ b/plugins/radar-android-phone-usage/src/main/AndroidManifest.xml @@ -9,6 +9,6 @@ + android:description="@string/phone_usage_description" /> diff --git a/plugins/radar-android-phone/src/main/AndroidManifest.xml b/plugins/radar-android-phone/src/main/AndroidManifest.xml index cc3481731..60f484d19 100644 --- a/plugins/radar-android-phone/src/main/AndroidManifest.xml +++ b/plugins/radar-android-phone/src/main/AndroidManifest.xml @@ -21,17 +21,17 @@ + android:description="@string/phone_sensors_description" /> + android:description="@string/phone_location_description" /> + android:description="@string/phone_contact_list_description" /> + android:description="@string/phone_bluetooth_description" /> diff --git a/plugins/radar-android-ppg/src/main/AndroidManifest.xml b/plugins/radar-android-ppg/src/main/AndroidManifest.xml index 40ce3a12c..2589b27db 100644 --- a/plugins/radar-android-ppg/src/main/AndroidManifest.xml +++ b/plugins/radar-android-ppg/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:supportsRtl="true"> + android:description="@string/phone_ppg_description" /> diff --git a/plugins/radar-android-ppg/src/main/res/values/strings.xml b/plugins/radar-android-ppg/src/main/res/values/strings.xml index 818805178..f62827721 100644 --- a/plugins/radar-android-ppg/src/main/res/values/strings.xml +++ b/plugins/radar-android-ppg/src/main/res/values/strings.xml @@ -9,4 +9,5 @@ Stop PPG PPG measurement + Service that measure PPG using the camera of a phone. diff --git a/plugins/radar-android-weather/src/main/AndroidManifest.xml b/plugins/radar-android-weather/src/main/AndroidManifest.xml index 74f400c1a..aef0517fc 100644 --- a/plugins/radar-android-weather/src/main/AndroidManifest.xml +++ b/plugins/radar-android-weather/src/main/AndroidManifest.xml @@ -10,6 +10,6 @@ + android:description="@string/weather_api_description" /> diff --git a/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt b/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt index 5f7e09b8f..9edb409aa 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt @@ -102,7 +102,6 @@ open class PermissionHandler( } ACCESS_BACKGROUND_LOCATION_COMPAT in currentlyNeeded -> { addRequestingPermissions(ACCESS_BACKGROUND_LOCATION_COMPAT) - requestBackgroundLocationPermissions() } LOCATION_SERVICE in currentlyNeeded -> { addRequestingPermissions(LOCATION_SERVICE) @@ -127,25 +126,9 @@ open class PermissionHandler( } } - private fun requestBackgroundLocationPermissions() { - alertDialog { - setTitle(R.string.enable_location_title) - setMessage(R.string.enable_location_background) - setPositiveButton(android.R.string.ok) { dialog, _ -> - dialog.dismiss() - requestPermissions(setOf(ACCESS_BACKGROUND_LOCATION_COMPAT)) - } - setNegativeButton(android.R.string.cancel) { dialog, _ -> - dialog.cancel() - requestPermissions() - } - } - } - private fun requestLocationPermissions(locationPermissions: Set) { alertDialog { - setTitle(R.string.enable_location_title) - setMessage(R.string.enable_location) + setView(R.layout.location_dialog) setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() requestPermissions(locationPermissions) diff --git a/radar-commons-android/src/main/res/drawable/baseline_location_on_green_700_48dp.xml b/radar-commons-android/src/main/res/drawable/baseline_location_on_green_700_48dp.xml new file mode 100644 index 000000000..548eea793 --- /dev/null +++ b/radar-commons-android/src/main/res/drawable/baseline_location_on_green_700_48dp.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/radar-commons-android/src/main/res/layout/location_dialog.xml b/radar-commons-android/src/main/res/layout/location_dialog.xml new file mode 100644 index 000000000..1185a72a2 --- /dev/null +++ b/radar-commons-android/src/main/res/layout/location_dialog.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/radar-commons-android/src/main/res/values/strings.xml b/radar-commons-android/src/main/res/values/strings.xml index e8c9c85f8..ed34978e0 100644 --- a/radar-commons-android/src/main/res/values/strings.xml +++ b/radar-commons-android/src/main/res/values/strings.xml @@ -15,6 +15,11 @@ Background location is needed to keep passively collecting data while the app is in the background, either for Bluetooth devices or for actual, relative location. + pRMT App uses your location + This app collects location data to enable Bluetooth Low Energy and/or location tracking as + part of the study even when the app is closed or not in use. + The researcher(s) only use the collected data in the study you consented to. + Location]]> Enable usage access to keep track of what kind of applications you use. From 0424f2a00c8f1bd8a1cd1332502563c1f7bb0daa Mon Sep 17 00:00:00 2001 From: Peyman Mohtashami Date: Wed, 10 May 2023 16:17:25 +0200 Subject: [PATCH 08/10] Revert back the requestBackgroundLocationPermissions --- .../android/util/PermissionHandler.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt b/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt index 9edb409aa..c261ef40d 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt @@ -102,6 +102,7 @@ open class PermissionHandler( } ACCESS_BACKGROUND_LOCATION_COMPAT in currentlyNeeded -> { addRequestingPermissions(ACCESS_BACKGROUND_LOCATION_COMPAT) + requestBackgroundLocationPermissions() } LOCATION_SERVICE in currentlyNeeded -> { addRequestingPermissions(LOCATION_SERVICE) @@ -126,7 +127,24 @@ open class PermissionHandler( } } + private fun requestBackgroundLocationPermissions() { + alertDialog { + setTitle(R.string.enable_location_title) + setMessage(R.string.enable_location_background) + setPositiveButton(android.R.string.ok) { dialog, _ -> + dialog.dismiss() + requestPermissions(setOf(ACCESS_BACKGROUND_LOCATION_COMPAT)) + } + setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.cancel() + requestPermissions() + } + show() + } + } + private fun requestLocationPermissions(locationPermissions: Set) { + alertDialog { setView(R.layout.location_dialog) setPositiveButton(android.R.string.ok) { dialog, _ -> From 71a1f1996523c2fd9ac3fce1e5b5a3e0db111b7e Mon Sep 17 00:00:00 2001 From: Peyman Mohtashami Date: Wed, 10 May 2023 16:55:36 +0200 Subject: [PATCH 09/10] Bump version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bb22c19c5..e05355f71 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ allprojects { ext.issueUrl = 'https://github.com/' + githubRepoName + '/issues' ext.website = 'http://radar-base.org' - version = "1.2.4-SNAPSHOT" + version = "1.2.4" group = 'org.radarbase' ext.versionCode = 52 From 03f8fa7333d212e80e327cffd25bdb992d4203e2 Mon Sep 17 00:00:00 2001 From: Peyman Mohtashami Date: Wed, 10 May 2023 20:11:54 +0200 Subject: [PATCH 10/10] Add dialogs and strings for other sensitive data permissions --- .../android/util/PermissionHandler.kt | 59 ++++++++++--------- .../drawable/baseline_apps_green_700_48dp.xml | 6 ++ .../baseline_battery_alert_green_700_48dp.xml | 6 ++ .../baseline_warning_yellow_700_48dp.xml | 6 ++ .../disable_battery_optimization_dialog.xml | 38 ++++++++++++ .../src/main/res/layout/location_dialog.xml | 8 +-- .../main/res/layout/system_window_dialog.xml | 46 +++++++++++++++ .../main/res/layout/usage_tracking_dialog.xml | 45 ++++++++++++++ .../src/main/res/values/strings.xml | 32 +++++++--- 9 files changed, 206 insertions(+), 40 deletions(-) create mode 100644 radar-commons-android/src/main/res/drawable/baseline_apps_green_700_48dp.xml create mode 100644 radar-commons-android/src/main/res/drawable/baseline_battery_alert_green_700_48dp.xml create mode 100644 radar-commons-android/src/main/res/drawable/baseline_warning_yellow_700_48dp.xml create mode 100644 radar-commons-android/src/main/res/layout/disable_battery_optimization_dialog.xml create mode 100644 radar-commons-android/src/main/res/layout/system_window_dialog.xml create mode 100644 radar-commons-android/src/main/res/layout/usage_tracking_dialog.xml diff --git a/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt b/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt index c261ef40d..517759197 100644 --- a/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt +++ b/radar-commons-android/src/main/java/org/radarbase/android/util/PermissionHandler.kt @@ -128,23 +128,10 @@ open class PermissionHandler( } private fun requestBackgroundLocationPermissions() { - alertDialog { - setTitle(R.string.enable_location_title) - setMessage(R.string.enable_location_background) - setPositiveButton(android.R.string.ok) { dialog, _ -> - dialog.dismiss() - requestPermissions(setOf(ACCESS_BACKGROUND_LOCATION_COMPAT)) - } - setNegativeButton(android.R.string.cancel) { dialog, _ -> - dialog.cancel() - requestPermissions() - } - show() - } + requestPermissions(setOf(ACCESS_BACKGROUND_LOCATION_COMPAT)) } private fun requestLocationPermissions(locationPermissions: Set) { - alertDialog { setView(R.layout.location_dialog) setPositiveButton(android.R.string.ok) { dialog, _ -> @@ -205,8 +192,7 @@ open class PermissionHandler( private fun requestLocationProvider() { alertDialog { - setTitle(R.string.enable_location_title) - setMessage(R.string.enable_location_instruction) + setView(R.layout.location_dialog) setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) @@ -216,17 +202,26 @@ open class PermissionHandler( dialog.cancel() requestPermissions() } - setIcon(android.R.drawable.ic_dialog_alert) } } private fun requestSystemWindowPermissions() { // Show alert dialog to the user saying a separate permission is needed // Launch the settings activity if the user prefers - Intent( - Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - Uri.parse("package:" + activity.packageName) - ).startActivityForResult(ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) + alertDialog { + setView(R.layout.system_window_dialog) + setPositiveButton(android.R.string.ok) { dialog, _ -> + dialog.dismiss() + Intent( + Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + activity.packageName) + ).startActivityForResult(ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) + } + setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.cancel() + requestPermissions() + } + } } private fun Intent.startActivityForResult(code: Int) { @@ -242,16 +237,25 @@ open class PermissionHandler( @SuppressLint("BatteryLife") private fun requestDisableBatteryOptimization() { - Intent( - Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, - Uri.parse("package:" + activity.packageName) - ).startActivityForResult(BATTERY_OPT_CODE) + alertDialog { + setView(R.layout.disable_battery_optimization_dialog) + setPositiveButton(android.R.string.ok) { dialog, _ -> + dialog.dismiss() + Intent( + Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, + Uri.parse("package:" + activity.packageName) + ).startActivityForResult(BATTERY_OPT_CODE) + } + setNegativeButton(android.R.string.cancel) { dialog, _ -> + dialog.cancel() + requestPermissions() + } + } } private fun requestPackageUsageStats() { alertDialog { - setTitle(R.string.enable_package_usage_title) - setMessage(R.string.enable_package_usage) + setView(R.layout.usage_tracking_dialog) setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() var intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS) @@ -264,7 +268,6 @@ open class PermissionHandler( dialog.cancel() requestPermissions() } - setIcon(android.R.drawable.ic_dialog_alert) } } diff --git a/radar-commons-android/src/main/res/drawable/baseline_apps_green_700_48dp.xml b/radar-commons-android/src/main/res/drawable/baseline_apps_green_700_48dp.xml new file mode 100644 index 000000000..e9fdb61f4 --- /dev/null +++ b/radar-commons-android/src/main/res/drawable/baseline_apps_green_700_48dp.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/radar-commons-android/src/main/res/drawable/baseline_battery_alert_green_700_48dp.xml b/radar-commons-android/src/main/res/drawable/baseline_battery_alert_green_700_48dp.xml new file mode 100644 index 000000000..dda78069a --- /dev/null +++ b/radar-commons-android/src/main/res/drawable/baseline_battery_alert_green_700_48dp.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/radar-commons-android/src/main/res/drawable/baseline_warning_yellow_700_48dp.xml b/radar-commons-android/src/main/res/drawable/baseline_warning_yellow_700_48dp.xml new file mode 100644 index 000000000..81ed5dcb1 --- /dev/null +++ b/radar-commons-android/src/main/res/drawable/baseline_warning_yellow_700_48dp.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/radar-commons-android/src/main/res/layout/disable_battery_optimization_dialog.xml b/radar-commons-android/src/main/res/layout/disable_battery_optimization_dialog.xml new file mode 100644 index 000000000..7a4b03af2 --- /dev/null +++ b/radar-commons-android/src/main/res/layout/disable_battery_optimization_dialog.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/radar-commons-android/src/main/res/layout/location_dialog.xml b/radar-commons-android/src/main/res/layout/location_dialog.xml index 1185a72a2..835227439 100644 --- a/radar-commons-android/src/main/res/layout/location_dialog.xml +++ b/radar-commons-android/src/main/res/layout/location_dialog.xml @@ -16,8 +16,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" - android:layout_gravity="center" - android:text="@string/location_dialog_title" + android:text="@string/location_bg_dialog_title" + android:textAlignment="center" android:textSize="20sp" android:textStyle="bold" /> @@ -25,14 +25,14 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" - android:text="@string/location_dialog_message" + android:text="@string/location_bg_dialog_message" /> \ No newline at end of file diff --git a/radar-commons-android/src/main/res/layout/system_window_dialog.xml b/radar-commons-android/src/main/res/layout/system_window_dialog.xml new file mode 100644 index 000000000..783add06c --- /dev/null +++ b/radar-commons-android/src/main/res/layout/system_window_dialog.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/radar-commons-android/src/main/res/layout/usage_tracking_dialog.xml b/radar-commons-android/src/main/res/layout/usage_tracking_dialog.xml new file mode 100644 index 000000000..104d76640 --- /dev/null +++ b/radar-commons-android/src/main/res/layout/usage_tracking_dialog.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/radar-commons-android/src/main/res/values/strings.xml b/radar-commons-android/src/main/res/values/strings.xml index ed34978e0..0736c56b5 100644 --- a/radar-commons-android/src/main/res/values/strings.xml +++ b/radar-commons-android/src/main/res/values/strings.xml @@ -8,21 +8,37 @@ , Failed to login to authorization service, please retry Failed to log in - - Location information is needed to enable Bluetooth Low Energy and/or location tracking as - part of the study. - + + pRMT App uses your \"Location in Background\" + This app collects location data to enable Bluetooth Low Energy and/or location tracking as + part of the study even when the app is closed or not in use. + The researcher(s) only use the collected data in the study you consented to. + + pRMT App uses your \"Location\" + Location information is needed to enable Bluetooth Low Energy and/or location tracking as part of the study. + + Enable \"Usage tracking\" + Enable usage access to keep track of what kind of applications you use. + After click \"OK\", select RADAR pRMT from the list and enable \"Usage access\" + + Enable \"Display over other apps\" + Allow this app to display on top of other apps. + After click \"OK\", select RADAR pRMT from the list and enable \"Display over other apps\". + + + Enable \"No Restrictions\" for background apps + \"No Restrictions for background apps\" means that the battery saver does not restrict app\'s activity. + After click \"OK\", select \"No restrictions\". + + Location information is needed to enable Bluetooth Low Energy and/or location tracking as part of the study. Background location is needed to keep passively collecting data while the app is in the background, either for Bluetooth devices or for actual, relative location. - pRMT App uses your location - This app collects location data to enable Bluetooth Low Energy and/or location tracking as - part of the study even when the app is closed or not in use. - The researcher(s) only use the collected data in the study you consented to. Location]]> Enable usage access to keep track of what kind of applications you use. + Enable location tracking Enable usage tracking