From 52ebbb78ede6b879cfa07673d2cb2cd390275033 Mon Sep 17 00:00:00 2001 From: Gideon Okuro Date: Fri, 16 Feb 2024 23:34:48 +0300 Subject: [PATCH] actions: foreground bluetooth service (fixes #1919) (#1925) --- app/src/main/AndroidManifest.xml | 3 ++ .../remote/bases/BaseBluetoothChatService.kt | 12 ++++- .../remote/bases/PermissionActivity.kt | 44 +++++++++---------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f7745682e..9e6262189 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,8 @@ tools:ignore="ProtectedPermissions" /> + + diff --git a/app/src/main/kotlin/io/treehouses/remote/bases/BaseBluetoothChatService.kt b/app/src/main/kotlin/io/treehouses/remote/bases/BaseBluetoothChatService.kt index 635d7812b..1c383ed4a 100644 --- a/app/src/main/kotlin/io/treehouses/remote/bases/BaseBluetoothChatService.kt +++ b/app/src/main/kotlin/io/treehouses/remote/bases/BaseBluetoothChatService.kt @@ -9,12 +9,15 @@ import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothManager import android.content.Context import android.content.Intent +import android.content.pm.ServiceInfo +import android.os.Build import android.os.Bundle import android.os.Handler import android.os.IBinder import android.os.Message import android.util.Log import androidx.core.app.NotificationCompat +import androidx.core.app.ServiceCompat import io.treehouses.remote.Constants import io.treehouses.remote.InitialActivity import io.treehouses.remote.R @@ -90,7 +93,14 @@ open class BaseBluetoothChatService @JvmOverloads constructor(handler: Handler? .setContentIntent(pendingClickIntent) .addAction(R.drawable.bluetooth, "Disconnect", disconnectPendingIntent) .build() - startForeground(2, notification) + ServiceCompat.startForeground(this,2, + notification, + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE + } else { + 0 + } + ) } /** diff --git a/app/src/main/kotlin/io/treehouses/remote/bases/PermissionActivity.kt b/app/src/main/kotlin/io/treehouses/remote/bases/PermissionActivity.kt index c9fdf2ce3..1cc4b86af 100644 --- a/app/src/main/kotlin/io/treehouses/remote/bases/PermissionActivity.kt +++ b/app/src/main/kotlin/io/treehouses/remote/bases/PermissionActivity.kt @@ -15,8 +15,8 @@ import androidx.core.content.ContextCompat import io.treehouses.remote.R abstract class PermissionActivity : AppCompatActivity() { - private fun checkPermission(strPermission: String?): Boolean { - val result = ContextCompat.checkSelfPermission(this, strPermission!!) + private fun checkPermission(strPermission: String): Boolean { + val result = ContextCompat.checkSelfPermission(this, strPermission) return result == PackageManager.PERMISSION_GRANTED } @@ -30,31 +30,28 @@ abstract class PermissionActivity : AppCompatActivity() { private fun buildAlertMessageNoGps() { val builder = AlertDialog.Builder(ContextThemeWrapper(this, R.style.CustomAlertDialogStyle)) builder.setMessage("Your GPS seems to be disabled, do you want to enable it?") - .setCancelable(false) - .setPositiveButton("Yes") { _: DialogInterface?, _: Int -> startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)) } - .setNegativeButton("No") { dialog: DialogInterface, _: Int -> dialog.cancel() } + .setCancelable(false) + .setPositiveButton("Yes") { _, _ -> startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)) } + .setNegativeButton("No") { dialog, _ -> dialog.cancel() } val alert = builder.create() - alert.window!!.setBackgroundDrawableResource(android.R.color.transparent) + alert.window?.setBackgroundDrawableResource(android.R.color.transparent) alert.show() } fun requestPermission() { - if (!checkPermission(Manifest.permission.ACCESS_FINE_LOCATION) || - !checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION) || - !checkPermission(Manifest.permission.CHANGE_WIFI_STATE) || - !checkPermission(Manifest.permission.BLUETOOTH) || - !checkPermission(Manifest.permission.BLUETOOTH_ADMIN) || - !checkPermission(Manifest.permission.BLUETOOTH_CONNECT) || - !checkPermission(Manifest.permission.BLUETOOTH_CONNECT)) { - ActivityCompat.requestPermissions(this, arrayOf( - Manifest.permission.CHANGE_WIFI_STATE, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN, - Manifest.permission.BLUETOOTH_CONNECT, - Manifest.permission.BLUETOOTH_SCAN, - ), PERMISSION_REQUEST_WIFI) + val permissionsToRequest = mutableListOf( + Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.BLUETOOTH_CONNECT, + Manifest.permission.BLUETOOTH_SCAN + ) + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU && !checkPermission(Manifest.permission.POST_NOTIFICATIONS)) { + permissionsToRequest.add(Manifest.permission.POST_NOTIFICATIONS) + } + + if (permissionsToRequest.any { !checkPermission(it) }) { + ActivityCompat.requestPermissions(this, permissionsToRequest.toTypedArray(), PERMISSION_REQUEST_WIFI) } else { statusCheck() } @@ -63,8 +60,7 @@ abstract class PermissionActivity : AppCompatActivity() { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == PERMISSION_REQUEST_WIFI) { - if (grantResults.isNotEmpty() - && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + if (grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED }) { statusCheck() } }