Packages
mob
0.7.19
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.2
0.6.1
0.6.0
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.11
0.5.10
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
BEAM-on-device mobile framework for Elixir
Current section
Files
Jump to
Current section
Files
lib/mob/permissions.ex
defmodule Mob.Permissions do
@moduledoc """
Request OS-level permissions from the user.
The permission dialog is shown asynchronously. The result arrives as:
handle_info({:permission, capability, :granted | :denied}, socket)
Capabilities that core handles directly:
- `:camera`
- `:microphone`
- `:photo_library`
- `:notifications`
Plugins can add their own capabilities (e.g. a `mob_location` plugin owns
`:location`): the plugin registers a native handler that the platform
permission registry dispatches to. `request/2` therefore accepts any atom and
lets the native layer decide whether it is a known capability — an unrecognized
one returns `badarg` from the NIF (surfacing as an `ArgumentError`).
Capabilities that need *no* permission: haptics, clipboard, share sheet, file picker.
> **Beyond `request/2`**: each capability also needs a matching
> `Info.plist` key (iOS) and `AndroidManifest.xml` entry. Without
> them the dialog is silently suppressed and you get no event. See
> the [permissions guide](permissions.html) for the per-capability
> table and the most common failure modes — it's the first place
> to check when "the dialog never appears".
"""
@typedoc """
A permission capability. The atoms core handles directly are listed below;
plugins may register additional capabilities at runtime, so any atom is
accepted by `request/2` and validated natively.
"""
@type capability :: :camera | :microphone | :photo_library | :notifications | atom()
@doc """
Request an OS permission from the user.
The system dialog is shown asynchronously. The result arrives in
`handle_info/2`:
def handle_info({:permission, :camera, :granted}, socket), do: ...
def handle_info({:permission, :camera, :denied}, socket), do: ...
Safe to call if the permission is already granted — the result still arrives
via `handle_info` with the current status.
The capability must be one core handles or one a plugin has registered. A
capability that needs no permission (haptics, clipboard, share sheet, file
picker) — or any other unrecognized atom — returns `badarg` from the NIF,
surfacing as an `ArgumentError`; do not call `request/2` for those.
"""
@spec request(Mob.Socket.t(), capability()) :: Mob.Socket.t()
def request(socket, capability) when is_atom(capability) do
:mob_nif.request_permission(capability)
socket
end
end