Skip to content

Commit

Permalink
Show a prompt to request Bluetooth permission
Browse files Browse the repository at this point in the history
  • Loading branch information
hufman committed Jan 19, 2023
1 parent 3ce59fd commit c380147
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.bimmergestalt.bclclient.controllers

import android.Manifest
import android.app.Activity
import androidx.core.app.ActivityCompat

class PermissionsController(val activity: Activity) {
companion object {
const val REQUEST_BLUETOOTH = 50
}
fun promptBluetoothConnect() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
ActivityCompat.requestPermissions(activity,
arrayOf(Manifest.permission.BLUETOOTH_CONNECT),
REQUEST_BLUETOOTH)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.bimmergestalt.bclclient.fragments

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import io.bimmergestalt.bclclient.controllers.PermissionsController
import io.bimmergestalt.bclclient.databinding.PermissionsBinding
import io.bimmergestalt.bclclient.models.PermissionsViewModel

class PermissionsFragment: Fragment() {
val viewModel by viewModels<PermissionsViewModel>()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
val binding = PermissionsBinding.inflate(inflater, container, false)

binding.lifecycleOwner = viewLifecycleOwner
binding.controller = PermissionsController(requireActivity())
binding.viewModel = viewModel
return binding.root
}

override fun onResume() {
super.onResume()
viewModel.update(requireContext())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ fun setImageViewResource(view: ImageView, resource: Int) {
view.setImageResource(resource)
}

@BindingAdapter("android:visibility")
fun setViewVisibility(view: View, visible: Boolean) {
view.visibility = if (visible) View.VISIBLE else View.GONE
}
@BindingAdapter("android:foregroundTint")
fun setForegroundTint(view: View, value: (Context.() -> Int)?) {
value ?: return
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.bimmergestalt.bclclient.models

import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import androidx.core.content.ContextCompat
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class PermissionsViewModel: ViewModel() {
private val _supportsBluetoothConnectPermission = MutableLiveData(false)
val supportsBluetoothConnectPermission: LiveData<Boolean> = _supportsBluetoothConnectPermission
private val _hasBluetoothConnectPermission = MutableLiveData(false)
val hasBluetoothConnectPermission: LiveData<Boolean> = _hasBluetoothConnectPermission

fun update(context: Context) {
_supportsBluetoothConnectPermission.value = android.os.Build.VERSION.SDK_INT >= 31
_hasBluetoothConnectPermission.value = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED
} else {
true
}
}
}
6 changes: 6 additions & 0 deletions app/src/main/res/layout/fragment_connection_status.xml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@
android:text="@{viewModel.proxyText}" />
</androidx.appcompat.widget.LinearLayoutCompat>

<androidx.fragment.app.FragmentContainerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_settings"
android:name="io.bimmergestalt.bclclient.fragments.PermissionsFragment"/>

<Button
android:id="@+id/button_first"
android:layout_width="wrap_content"
Expand Down
51 changes: 51 additions & 0 deletions app/src/main/res/layout/fragment_permissions.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data class="PermissionsBinding">
<variable
name="controller"
type="io.bimmergestalt.bclclient.controllers.PermissionsController" />
<variable
name="viewModel"
type="io.bimmergestalt.bclclient.models.PermissionsViewModel" />
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="16dp"
android:orientation="vertical"
android:gravity="center"
android:visibility="@{viewModel.supportsBluetoothConnectPermission &amp;&amp; !viewModel.hasBluetoothConnectPermission}">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:onClick="@{() -> controller.promptBluetoothConnect()}"
app:srcCompat="@android:drawable/checkbox_off_background" />

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:text="@string/lbl_grant_permission_bluetooth_connect" />
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lbl_grant"
android:textSize="12sp"
android:onClick="@{() -> controller.promptBluetoothConnect()}" />
</LinearLayout>
</LinearLayout>
</layout>
3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
<string name="sw_automatic_bluetooth_connect">Connect to Bluetooth automatically</string>
<string name="service_shutdown">Shutdown</string>

<string name="lbl_grant_permission_bluetooth_connect">Grant Bluetooth connectivity access</string>
<string name="lbl_grant">Grant</string>

<string name="status_transport_waiting">Waiting for car</string>
<string name="status_transport_searching">Searching for car</string>
<string name="status_transport_opening">Connecting to car</string>
Expand Down

0 comments on commit c380147

Please sign in to comment.