From cd3be880191f75704dcbc288d9b990391a4a508f Mon Sep 17 00:00:00 2001 From: Rkareko Date: Wed, 4 Sep 2024 12:55:01 +0300 Subject: [PATCH] Chain fine location and nearby devices permission requests Add null check for wifiP2pChannel when requesting device info --- p2p-lib/build.gradle | 2 +- .../WifiDirectDataSharingStrategy.kt | 7 ++- .../p2p/search/ui/P2PDeviceSearchActivity.kt | 45 ++++++++++++++++++- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/p2p-lib/build.gradle b/p2p-lib/build.gradle index bd5279a..95f1f92 100644 --- a/p2p-lib/build.gradle +++ b/p2p-lib/build.gradle @@ -229,7 +229,7 @@ afterEvaluate { from(components["release"]) artifactId = "p2p-lib" groupId = "org.smartregister" - version = "0.6.10-SNAPSHOT" + version = "0.6.11-SNAPSHOT" pom { name.set("Peer to Peer Library") } diff --git a/p2p-lib/src/main/java/org/smartregister/p2p/data_sharing/WifiDirectDataSharingStrategy.kt b/p2p-lib/src/main/java/org/smartregister/p2p/data_sharing/WifiDirectDataSharingStrategy.kt index 2a93c6c..40a82d5 100644 --- a/p2p-lib/src/main/java/org/smartregister/p2p/data_sharing/WifiDirectDataSharingStrategy.kt +++ b/p2p-lib/src/main/java/org/smartregister/p2p/data_sharing/WifiDirectDataSharingStrategy.kt @@ -197,7 +197,9 @@ class WifiDirectDataSharingStrategy : DataSharingStrategy, P2PManagerListener { android.Manifest.permission.NEARBY_WIFI_DEVICES )) != PackageManager.PERMISSION_GRANTED ) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && + Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU + ) { logDebug( "initiatePeerDiscoveryOnceAccessFineLocationGranted(): requesting ACCESS_FINE_LOCATION" ) @@ -282,6 +284,9 @@ class WifiDirectDataSharingStrategy : DataSharingStrategy, P2PManagerListener { onDeviceFound: OnDeviceFound, onConnected: DataSharingStrategy.PairingListener ) { + if (wifiP2pChannel == null) { + initChannel(onDeviceFound = onDeviceFound, onConnected = onConnected) + } wifiP2pChannel?.also { wifiP2pChannel -> if (ActivityCompat.checkSelfPermission( context, diff --git a/p2p-lib/src/main/java/org/smartregister/p2p/search/ui/P2PDeviceSearchActivity.kt b/p2p-lib/src/main/java/org/smartregister/p2p/search/ui/P2PDeviceSearchActivity.kt index 9a1a75a..caf27f8 100644 --- a/p2p-lib/src/main/java/org/smartregister/p2p/search/ui/P2PDeviceSearchActivity.kt +++ b/p2p-lib/src/main/java/org/smartregister/p2p/search/ui/P2PDeviceSearchActivity.kt @@ -110,6 +110,7 @@ import timber.log.Timber class P2PDeviceSearchActivity : AppCompatActivity(), P2pModeSelectContract.View { private val accessFineLocationPermissionRequestInt: Int = 12345 + private val nearbyWifiDevicesPermissionRequestInt: Int = 67890 private val p2PReceiverViewModel by viewModels { P2PReceiverViewModel.Factory( dataSharingStrategy = dataSharingStrategy, @@ -290,7 +291,11 @@ class P2PDeviceSearchActivity : AppCompatActivity(), P2pModeSelectContract.View OnSuccessListener { // All location settings are satisfied. The client can initialize // location requests here. - checkEnableWifi() + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + checkEnableWifi() + } else { + checkNearbyWifiDevicesPermissionEnabled() + } } ) result.addOnFailureListener( @@ -316,6 +321,22 @@ class P2PDeviceSearchActivity : AppCompatActivity(), P2pModeSelectContract.View ) } + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + fun checkNearbyWifiDevicesPermissionEnabled() { + when (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.NEARBY_WIFI_DEVICES) + ) { + PackageManager.PERMISSION_GRANTED -> { + logDebug("P2PDeviceSearchActivity Wifi P2P: Nearby wifi devices granted") + checkEnableWifi() + } + else -> { + logDebug( + "P2PDeviceSearchActivity Wifi P2P: Requesting Nearby wifi devices granted permission" + ) + requestNearbyWifiDevicesNotGranted() + } + } + } fun createLocationRequest(): LocationRequest { return LocationRequest.create().apply { interval = 3600000 @@ -402,6 +423,20 @@ class P2PDeviceSearchActivity : AppCompatActivity(), P2pModeSelectContract.View } } + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun requestNearbyWifiDevicesNotGranted() { + when (ActivityCompat.checkSelfPermission(this, Manifest.permission.NEARBY_WIFI_DEVICES)) { + PackageManager.PERMISSION_GRANTED -> logDebug("Wifi P2P: Nearby wifi devices granted") + else -> { + logDebug("Wifi P2P: Requesting access Nearby wifi devices permission") + return requestPermissions( + arrayOf(Manifest.permission.NEARBY_WIFI_DEVICES), + nearbyWifiDevicesPermissionRequestInt + ) + } + } + } + override fun sendDeviceDetails() { p2PSenderViewModel.sendDeviceDetails(getCurrentConnectedDevice()) } @@ -483,6 +518,14 @@ class P2PDeviceSearchActivity : AppCompatActivity(), P2pModeSelectContract.View ) { checkLocationEnabled() } + + if ((nearbyWifiDevicesPermissionRequestInt == requestCode && + hasPermission(Manifest.permission.NEARBY_WIFI_DEVICES)) && + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + ) { + logDebug("onRequestPermissionsResult has nearby wifi devices permission") + checkNearbyWifiDevicesPermissionEnabled() + } } override fun onStop() {