forked from upstream-mirrors/OpenTracks
Ask for permission before using Bluetooth
This commit is contained in:
committed by
Román Martínez
parent
d99fb5ea47
commit
f070495fb4
@@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
package="de.dennisguse.opentracks"
|
package="de.dennisguse.opentracks"
|
||||||
android:installLocation="auto">
|
android:installLocation="auto">
|
||||||
|
|
||||||
@@ -52,7 +53,10 @@ limitations under the License.
|
|||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.BLUETOOTH_ADMIN"
|
android:name="android.permission.BLUETOOTH_ADMIN"
|
||||||
android:maxSdkVersion="30" />
|
android:maxSdkVersion="30" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
<uses-permission
|
||||||
|
android:name="android.permission.BLUETOOTH_SCAN"
|
||||||
|
android:usesPermissionFlags="neverForLocation"
|
||||||
|
tools:targetApi="s" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
|
|||||||
+34
-2
@@ -1,5 +1,6 @@
|
|||||||
package de.dennisguse.opentracks.settings.bluetooth;
|
package de.dennisguse.opentracks.settings.bluetooth;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.bluetooth.le.BluetoothLeScanner;
|
import android.bluetooth.le.BluetoothLeScanner;
|
||||||
import android.bluetooth.le.ScanCallback;
|
import android.bluetooth.le.ScanCallback;
|
||||||
@@ -8,6 +9,8 @@ import android.bluetooth.le.ScanResult;
|
|||||||
import android.bluetooth.le.ScanSettings;
|
import android.bluetooth.le.ScanSettings;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.ParcelUuid;
|
import android.os.ParcelUuid;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@@ -15,7 +18,10 @@ import android.util.AttributeSet;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.preference.DialogPreference;
|
import androidx.preference.DialogPreference;
|
||||||
import androidx.preference.PreferenceDialogFragmentCompat;
|
import androidx.preference.PreferenceDialogFragmentCompat;
|
||||||
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
|
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
|
||||||
@@ -143,13 +149,39 @@ public abstract class BluetoothLeSensorPreference extends DialogPreference {
|
|||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
List<ParcelUuid> serviceUUIDs = getArguments().getParcelableArrayList(ARG_BLE_SERVICE_UUIDS);
|
|
||||||
|
|
||||||
// Don't know why: need to load the drawable _twice_, so that animation is actually started.
|
// Don't know why: need to load the drawable _twice_, so that animation is actually started.
|
||||||
bluetoothIcon = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.ic_bluetooth_searching_animated_24dp);
|
bluetoothIcon = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.ic_bluetooth_searching_animated_24dp);
|
||||||
bluetoothIcon = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.ic_bluetooth_searching_animated_24dp);
|
bluetoothIcon = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.ic_bluetooth_searching_animated_24dp);
|
||||||
bluetoothIcon.start();
|
bluetoothIcon.start();
|
||||||
|
|
||||||
|
if (
|
||||||
|
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && (
|
||||||
|
ContextCompat.checkSelfPermission(getContext(), Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED ||
|
||||||
|
ContextCompat.checkSelfPermission(getContext(), Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
ActivityResultLauncher<String[]> requestPermissionLauncher =
|
||||||
|
registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), granted -> {
|
||||||
|
if (!granted.containsValue(false)) {
|
||||||
|
startBluetoothScan();
|
||||||
|
} else if (shouldShowRequestPermissionRationale(Manifest.permission.BLUETOOTH_SCAN) || shouldShowRequestPermissionRationale(Manifest.permission.BLUETOOTH_CONNECT)) {
|
||||||
|
Toast.makeText(getContext(), R.string.permission_bluetooth_failed_rejected, Toast.LENGTH_LONG).show();
|
||||||
|
dismiss();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(getContext(), R.string.permission_bluetooth_failed, Toast.LENGTH_SHORT).show();
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
requestPermissionLauncher.launch(new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN});
|
||||||
|
} else {
|
||||||
|
startBluetoothScan();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startBluetoothScan() {
|
||||||
|
List<ParcelUuid> serviceUUIDs = getArguments().getParcelableArrayList(ARG_BLE_SERVICE_UUIDS);
|
||||||
|
|
||||||
BluetoothAdapter bluetoothAdapter = BluetoothUtils.getAdapter(getContext());
|
BluetoothAdapter bluetoothAdapter = BluetoothUtils.getAdapter(getContext());
|
||||||
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
|
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
|
||||||
Log.w(TAG, "Bluetooth adapter is present or not enabled.");
|
Log.w(TAG, "Bluetooth adapter is present or not enabled.");
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
<!--
|
|
||||||
Copyright 2010 Google Inc.
|
Copyright 2010 Google Inc.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -13,7 +12,8 @@ distributed under the License is distributed on an "AS IS" BASIS,
|
|||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
--><resources>
|
-->
|
||||||
|
<resources>
|
||||||
<string name="about_preference_title">Über OpenTracks</string>
|
<string name="about_preference_title">Über OpenTracks</string>
|
||||||
<string name="about_description"><i>OpenTracks</i> ist eine Sport-Tracking-Anwendung, die Ihre Privatsphäre vollständig respektiert.</string>
|
<string name="about_description"><i>OpenTracks</i> ist eine Sport-Tracking-Anwendung, die Ihre Privatsphäre vollständig respektiert.</string>
|
||||||
<string name="about_url">Projekt-Website: <a href="%1$s">%1$s</a></string>
|
<string name="about_url">Projekt-Website: <a href="%1$s">%1$s</a></string>
|
||||||
@@ -235,6 +235,8 @@ Meldet das GPS-Gerät ungenaue Daten (z.B. Standort, Geschwindigkeit, Höhe), ka
|
|||||||
<string name="recording_service">Dienst für Aufzeichnung</string>
|
<string name="recording_service">Dienst für Aufzeichnung</string>
|
||||||
<!-- Permission -->
|
<!-- Permission -->
|
||||||
<string name="permission_gps_failed">OpenTracks benötigt eine Berechtigung zur Nutzung von GPS.</string>
|
<string name="permission_gps_failed">OpenTracks benötigt eine Berechtigung zur Nutzung von GPS.</string>
|
||||||
|
<string name="permission_bluetooth_failed">OpenTracks benötigt eine Berechtigung zur Nutzung von Bluetooth.</string>
|
||||||
|
<string name="permission_bluetooth_failed_rejected">Du musst OpenTracks die Berechtigung zum Zugriff auf Geräte in der Nähe manuell in den Systemeinstellungen geben.</string>
|
||||||
<!-- Search -->
|
<!-- Search -->
|
||||||
<!-- Sensor State -->
|
<!-- Sensor State -->
|
||||||
<string name="sensor_state_battery">Akkustatus</string>
|
<string name="sensor_state_battery">Akkustatus</string>
|
||||||
|
|||||||
@@ -309,6 +309,8 @@ limitations under the License.
|
|||||||
<string name="delete_service">Deletion service</string>
|
<string name="delete_service">Deletion service</string>
|
||||||
<!-- Permission -->
|
<!-- Permission -->
|
||||||
<string name="permission_gps_failed">OpenTracks requires permission to use GPS.</string>
|
<string name="permission_gps_failed">OpenTracks requires permission to use GPS.</string>
|
||||||
|
<string name="permission_bluetooth_failed">OpenTracks requires permission to use Bluetooth.</string>
|
||||||
|
<string name="permission_bluetooth_failed_rejected">You manually need to grant OpenTracks access to Nearby Devices in system settings.</string>
|
||||||
<!-- Search -->
|
<!-- Search -->
|
||||||
<!-- Sensor State -->
|
<!-- Sensor State -->
|
||||||
<string name="sensor_state_battery">Battery level</string>
|
<string name="sensor_state_battery">Battery level</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user