Packages
mob
0.7.4
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/plugins/lifecycle.ex
defmodule Mob.Plugins.Lifecycle do
@moduledoc """
Dispatches OS foreground/background transitions to the tier-4 plugins'
`lifecycle.on_resume` / `lifecycle.on_background` hooks.
Subscribes to `Mob.Device`'s `:app` events and, on `:did_become_active` /
`:did_enter_background`, invokes each plugin's corresponding MFA. A plugin
that didn't declare a hook is simply skipped. Supervised by
`Mob.Plugins.Supervisor`.
"""
use GenServer
require Logger
@spec start_link(term()) :: GenServer.on_start()
def start_link(_arg), do: GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
@impl GenServer
def init(:ok) do
Mob.Device.subscribe(:app)
{:ok, Mob.Plugins.lifecycle()}
end
@impl GenServer
def handle_info({:mob_device, :did_become_active}, lifecycles) do
run_hooks(lifecycles, :on_resume)
{:noreply, lifecycles}
end
def handle_info({:mob_device, :did_enter_background}, lifecycles) do
run_hooks(lifecycles, :on_background)
{:noreply, lifecycles}
end
def handle_info(_msg, lifecycles), do: {:noreply, lifecycles}
defp run_hooks(lifecycles, key) do
for lc <- lifecycles, mfa = lc[key], not is_nil(mfa) do
invoke(mfa, lc[:plugin], key)
end
end
# A misbehaving hook must not take down the dispatcher (and with it every
# other plugin's hooks) — log and continue.
defp invoke({m, f, a}, plugin, key) do
apply(m, f, a)
rescue
e ->
Logger.error(
"[mob_plugins] #{inspect(plugin)} #{key} crashed: " <>
Exception.format(:error, e, __STACKTRACE__)
)
end
end