diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 64e73ad0..d2b85057 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -42,6 +42,7 @@ import com.geeksville.android.Logging import com.geeksville.android.ServiceClient import com.geeksville.concurrent.handledLaunch import com.geeksville.mesh.android.getBackgroundPermissions +import com.geeksville.mesh.android.getCameraPermissions import com.geeksville.mesh.android.getMissingPermissions import com.geeksville.mesh.database.entity.Packet import com.geeksville.mesh.databinding.ActivityMainBinding @@ -247,6 +248,8 @@ class MainActivity : AppCompatActivity(), Logging, return getMissingPermissions(perms) } + /** Ask the user to grant camera permission */ + fun requestCameraPermission() = requestPermission(getCameraPermissions(), false) /** Ask the user to grant background location permission */ fun requestBackgroundPermission() = requestPermission(getBackgroundPermissions(), false) diff --git a/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt b/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt index 656ed745..77fad486 100644 --- a/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt +++ b/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt @@ -28,6 +28,18 @@ fun Context.getMissingPermissions(perms: List) = perms.filter { ) != PackageManager.PERMISSION_GRANTED } +/** + * Camera permission (or empty if we already have what we need) + */ +fun Context.getCameraPermissions(): List { + val perms = mutableListOf(Manifest.permission.CAMERA) + + return getMissingPermissions(perms) +} + +/** @return true if the user already has camera permission */ +fun Context.hasCameraPermission() = getCameraPermissions().isEmpty() + /** * A list of missing background location permissions (or empty if we already have what we need) */ @@ -41,4 +53,4 @@ fun Context.getBackgroundPermissions(): List { } /** @return true if the user already has background location permission */ -fun Context.hasBackgroundPermission() = getBackgroundPermissions().isEmpty() \ No newline at end of file +fun Context.hasBackgroundPermission() = getBackgroundPermissions().isEmpty() diff --git a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt index bc41b585..c6cfbcd3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt @@ -20,7 +20,9 @@ import com.geeksville.android.Logging import com.geeksville.android.hideKeyboard import com.geeksville.mesh.AppOnlyProtos import com.geeksville.mesh.ChannelProtos +import com.geeksville.mesh.MainActivity import com.geeksville.mesh.R +import com.geeksville.mesh.android.hasCameraPermission import com.geeksville.mesh.databinding.ChannelFragmentBinding import com.geeksville.mesh.model.Channel import com.geeksville.mesh.model.ChannelOption @@ -208,12 +210,16 @@ class ChannelFragment : ScreenFragment("Channel"), Logging { } binding.scanButton.setOnClickListener { - val zxingScan = IntentIntegrator.forSupportFragment(this) - zxingScan.setCameraId(0) - zxingScan.setPrompt("") - zxingScan.setBeepEnabled(false) - zxingScan.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE) - zxingScan.initiateScan() + if ((requireActivity() as MainActivity).hasCameraPermission()) { + val zxingScan = IntentIntegrator.forSupportFragment(this) + zxingScan.setCameraId(0) + zxingScan.setPrompt("") + zxingScan.setBeepEnabled(false) + zxingScan.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE) + zxingScan.initiateScan() + } else { + (requireActivity() as MainActivity).requestCameraPermission() + } } // Note: Do not use setOnCheckedChanged here because we don't want to be called when we programmatically disable editing