mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-11 18:29:05 +01:00
Ask for NEARBY_WIFI_DEVICES permission on SDK 33 and up
This commit is contained in:
@@ -19,6 +19,10 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.NEARBY_WIFI_DEVICES"
|
||||||
|
android:usesPermissionFlags="neverForLocation"
|
||||||
|
tools:targetApi="31" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
@@ -32,7 +36,8 @@
|
|||||||
tools:ignore="ScopedStorage" />
|
tools:ignore="ScopedStorage" />
|
||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"
|
||||||
|
android:maxSdkVersion="32" />
|
||||||
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||||
<uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC" />
|
<uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC" />
|
||||||
<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import static org.briarproject.briar.android.util.PermissionUtils.showLocationDi
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This class ensures that the conditions to open a hotspot are fulfilled on
|
* This class ensures that the conditions to open a hotspot are fulfilled on
|
||||||
* API levels >= 29.
|
* API levels >= 29 and < 33.
|
||||||
* <p>
|
* <p>
|
||||||
* As soon as {@link #checkAndRequestConditions()} returns true,
|
* As soon as {@link #checkAndRequestConditions()} returns true,
|
||||||
* all conditions are fulfilled.
|
* all conditions are fulfilled.
|
||||||
|
|||||||
@@ -0,0 +1,139 @@
|
|||||||
|
package org.briarproject.briar.android.hotspot;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import org.briarproject.briar.R;
|
||||||
|
import org.briarproject.briar.android.util.Permission;
|
||||||
|
import org.briarproject.briar.android.util.PermissionUtils;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import androidx.activity.result.ActivityResultCaller;
|
||||||
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission;
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
import androidx.core.util.Consumer;
|
||||||
|
|
||||||
|
import static android.Manifest.permission.NEARBY_WIFI_DEVICES;
|
||||||
|
import static androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale;
|
||||||
|
import static java.lang.Boolean.TRUE;
|
||||||
|
import static java.util.logging.Level.INFO;
|
||||||
|
import static java.util.logging.Logger.getLogger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class ensures that the conditions to open a hotspot are fulfilled on
|
||||||
|
* API levels >= 33.
|
||||||
|
* <p>
|
||||||
|
* As soon as {@link #checkAndRequestConditions()} returns true,
|
||||||
|
* all conditions are fulfilled.
|
||||||
|
*/
|
||||||
|
@RequiresApi(33)
|
||||||
|
class ConditionManager33 extends AbstractConditionManager {
|
||||||
|
|
||||||
|
private static final Logger LOG =
|
||||||
|
getLogger(ConditionManager33.class.getName());
|
||||||
|
|
||||||
|
private Permission nearbyWifiPermission = Permission.UNKNOWN;
|
||||||
|
|
||||||
|
private final ActivityResultLauncher<String> nearbyWifiRequest;
|
||||||
|
private final ActivityResultLauncher<Intent> wifiRequest;
|
||||||
|
|
||||||
|
ConditionManager33(ActivityResultCaller arc,
|
||||||
|
Consumer<Boolean> permissionUpdateCallback) {
|
||||||
|
super(permissionUpdateCallback);
|
||||||
|
// permissionUpdateCallback receives false if permissions were denied
|
||||||
|
nearbyWifiRequest = arc.registerForActivityResult(
|
||||||
|
new RequestPermission(), granted -> {
|
||||||
|
onRequestPermissionResult(granted);
|
||||||
|
permissionUpdateCallback.accept(TRUE.equals(granted));
|
||||||
|
});
|
||||||
|
wifiRequest = arc.registerForActivityResult(
|
||||||
|
new StartActivityForResult(),
|
||||||
|
result -> permissionUpdateCallback
|
||||||
|
.accept(wifiManager.isWifiEnabled())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void onStart() {
|
||||||
|
nearbyWifiPermission = Permission.UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean areEssentialPermissionsGranted() {
|
||||||
|
boolean isWifiEnabled = wifiManager.isWifiEnabled();
|
||||||
|
if (LOG.isLoggable(INFO)) {
|
||||||
|
LOG.info(String.format("areEssentialPermissionsGranted(): " +
|
||||||
|
"nearbyWifiPermission? %s, " +
|
||||||
|
"wifiManager.isWifiEnabled()? %b",
|
||||||
|
nearbyWifiPermission, isWifiEnabled));
|
||||||
|
}
|
||||||
|
return nearbyWifiPermission == Permission.GRANTED && isWifiEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean checkAndRequestConditions() {
|
||||||
|
if (areEssentialPermissionsGranted()) return true;
|
||||||
|
|
||||||
|
if (nearbyWifiPermission == Permission.UNKNOWN) {
|
||||||
|
requestPermissions();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the location permission has been permanently denied, ask the
|
||||||
|
// user to change the setting
|
||||||
|
if (nearbyWifiPermission == Permission.PERMANENTLY_DENIED) {
|
||||||
|
PermissionUtils.showDenialDialog(ctx,
|
||||||
|
R.string.permission_nearby_devices_title,
|
||||||
|
R.string.permission_hotspot_nearby_wifi_denied_body,
|
||||||
|
() -> permissionUpdateCallback.accept(false));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should we show the rationale for location permission?
|
||||||
|
if (nearbyWifiPermission == Permission.SHOW_RATIONALE) {
|
||||||
|
showRationale(ctx,
|
||||||
|
R.string.permission_location_title,
|
||||||
|
R.string.permission_hotspot_nearby_wifi_request_body,
|
||||||
|
this::requestPermissions,
|
||||||
|
() -> permissionUpdateCallback.accept(false));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If Wifi is not enabled, we show the rationale for enabling Wifi?
|
||||||
|
if (!wifiManager.isWifiEnabled()) {
|
||||||
|
showRationale(ctx, R.string.wifi_settings_title,
|
||||||
|
R.string.wifi_settings_request_enable_body,
|
||||||
|
this::requestEnableWiFi,
|
||||||
|
() -> permissionUpdateCallback.accept(false));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we shouldn't usually reach this point, but if we do, return false
|
||||||
|
// anyway to force a recheck. Maybe some condition changed in the
|
||||||
|
// meantime.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onRequestPermissionResult(@Nullable Boolean granted) {
|
||||||
|
if (granted != null && granted) {
|
||||||
|
nearbyWifiPermission = Permission.GRANTED;
|
||||||
|
} else if (shouldShowRequestPermissionRationale(ctx,
|
||||||
|
NEARBY_WIFI_DEVICES)) {
|
||||||
|
nearbyWifiPermission = Permission.SHOW_RATIONALE;
|
||||||
|
} else {
|
||||||
|
nearbyWifiPermission = Permission.PERMANENTLY_DENIED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void requestPermissions() {
|
||||||
|
nearbyWifiRequest.launch(NEARBY_WIFI_DEVICES);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void requestEnableWiFi() {
|
||||||
|
wifiRequest.launch(new Intent(Settings.Panel.ACTION_WIFI));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -50,7 +50,9 @@ public class HotspotIntroFragment extends Fragment {
|
|||||||
|
|
||||||
private final AbstractConditionManager conditionManager = SDK_INT < 29 ?
|
private final AbstractConditionManager conditionManager = SDK_INT < 29 ?
|
||||||
new ConditionManager(this, this::onPermissionUpdate) :
|
new ConditionManager(this, this::onPermissionUpdate) :
|
||||||
new ConditionManager29(this, this::onPermissionUpdate);
|
SDK_INT >= 33 ?
|
||||||
|
new ConditionManager33(this, this::onPermissionUpdate) :
|
||||||
|
new ConditionManager29(this, this::onPermissionUpdate);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAttach(Context context) {
|
public void onAttach(Context context) {
|
||||||
|
|||||||
@@ -789,6 +789,7 @@
|
|||||||
<string name="permission_camera_title">Camera permission</string>
|
<string name="permission_camera_title">Camera permission</string>
|
||||||
<string name="permission_camera_request_body">To scan the QR code, Briar needs access to the camera.</string>
|
<string name="permission_camera_request_body">To scan the QR code, Briar needs access to the camera.</string>
|
||||||
<string name="permission_location_title">Location permission</string>
|
<string name="permission_location_title">Location permission</string>
|
||||||
|
<string name="permission_nearby_devices_title">Nearby devices permission</string>
|
||||||
<string name="permission_location_request_body">To discover Bluetooth devices, Briar needs permission to access your location.\n\nBriar does not store your location or share it with anyone.</string>
|
<string name="permission_location_request_body">To discover Bluetooth devices, Briar needs permission to access your location.\n\nBriar does not store your location or share it with anyone.</string>
|
||||||
<string name="permission_camera_location_title">Camera and location</string>
|
<string name="permission_camera_location_title">Camera and location</string>
|
||||||
<string name="permission_camera_location_request_body">To scan the QR code, Briar needs access to the camera.\n\nTo discover Bluetooth devices, Briar needs permission to access your location.\n\nBriar does not store your location or share it with anyone.</string>
|
<string name="permission_camera_location_request_body">To scan the QR code, Briar needs access to the camera.\n\nTo discover Bluetooth devices, Briar needs permission to access your location.\n\nBriar does not store your location or share it with anyone.</string>
|
||||||
@@ -833,6 +834,8 @@
|
|||||||
<string name="permission_hotspot_location_request_precise_body">To create a Wi-Fi hotspot, Briar needs permission to access your precise location.\n\nBriar does not store your location or share it with anyone.</string>
|
<string name="permission_hotspot_location_request_precise_body">To create a Wi-Fi hotspot, Briar needs permission to access your precise location.\n\nBriar does not store your location or share it with anyone.</string>
|
||||||
<string name="permission_hotspot_location_denied_body">You have denied access to your location, but Briar needs this permission to create a Wi-Fi hotspot.\n\nPlease consider granting access.</string>
|
<string name="permission_hotspot_location_denied_body">You have denied access to your location, but Briar needs this permission to create a Wi-Fi hotspot.\n\nPlease consider granting access.</string>
|
||||||
<string name="permission_hotspot_location_denied_precise_body">You have denied access to your precise location, but Briar needs this permission to create a Wi-Fi hotspot.\n\nPlease consider granting access.</string>
|
<string name="permission_hotspot_location_denied_precise_body">You have denied access to your precise location, but Briar needs this permission to create a Wi-Fi hotspot.\n\nPlease consider granting access.</string>
|
||||||
|
<string name="permission_hotspot_nearby_wifi_request_body">To create a Wi-Fi hotspot, Briar needs permission to access nearby devices.</string>
|
||||||
|
<string name="permission_hotspot_nearby_wifi_denied_body">You have denied access to nearby devices, but Briar needs this permission to create a Wi-Fi hotspot.\n\nPlease consider granting access.</string>
|
||||||
<string name="wifi_settings_title">Wi-Fi setting</string>
|
<string name="wifi_settings_title">Wi-Fi setting</string>
|
||||||
<string name="wifi_settings_request_enable_body">To create a Wi-Fi hotspot, Briar needs to use Wi-Fi. Please enable it.</string>
|
<string name="wifi_settings_request_enable_body">To create a Wi-Fi hotspot, Briar needs to use Wi-Fi. Please enable it.</string>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user