Packages
mob_dev
0.6.21
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.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
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.37
0.3.35
0.3.34
0.3.33
0.3.28
0.3.26
0.3.23
0.3.21
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
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.18
0.2.17
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
Development tooling for the Mob mobile framework
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/mob/adopt/native/android.ex
defmodule Mix.Tasks.Mob.Adopt.Native.Android do
@shortdoc "Generates the android/ native tree from mob_new templates"
@moduledoc """
Walks `priv/templates/mob.new/android/**/*.eex` (resolved from mob_new
— see `MobDev.Adopt.Generator`), renders each with the project's
assigns, and writes them via `Igniter.create_new_file/4` with
`on_exists: :skip`. Then copies the binary static tree
(`priv/static/mob.new/android/**`) via direct `File.copy!/2` since
Igniter's `Rewrite` engine assumes UTF-8 text and would corrupt the
Gradle wrapper jar and PNG icons.
Idempotent — `on_exists: :skip` for EEx-rendered files; `File.exists?`
pre-check for binaries.
The `gradlew` script is `chmod 0o755` after copy so it's executable.
"""
use Igniter.Mix.Task
alias Igniter.Project.Application, as: ProjectApplication
alias MobDev.Adopt.Generator
@common_schema [
ios: :boolean,
android: :boolean,
local: :boolean,
python: :boolean,
host_url: :string,
live_view: :boolean
]
@common_defaults [ios: true, android: true, live_view: true]
@impl Igniter.Mix.Task
def info(_argv, _composing_task) do
%Igniter.Mix.Task.Info{
group: :mob,
example: "mix mob.adopt.native.android",
schema: @common_schema,
defaults: @common_defaults
}
end
@impl Igniter.Mix.Task
def igniter(igniter) do
opts = igniter.args.options
app_name = ProjectApplication.app_name(igniter) |> to_string()
assigns = Generator.assigns(app_name, opts)
igniter
|> emit_templates(assigns, opts, "android")
|> copy_static_binaries(opts, "android")
end
@doc false
@spec emit_templates(Igniter.t(), map(), keyword(), String.t()) :: Igniter.t()
def emit_templates(igniter, assigns, opts, platform) do
t_root = Generator.templates_root(opts)
t_root
|> Path.join("#{platform}/**/*.eex")
|> Path.wildcard(match_dot: true)
|> Enum.reduce(igniter, fn template_path, ig ->
rel = Path.relative_to(template_path, t_root)
dest_rel = Generator.expand_path(rel, assigns)
content = EEx.eval_file(template_path, Map.to_list(assigns))
Igniter.create_new_file(ig, dest_rel, content, on_exists: :skip)
end)
end
@doc false
@spec copy_static_binaries(Igniter.t(), keyword(), String.t()) :: Igniter.t()
def copy_static_binaries(igniter, opts, platform) do
s_root = Generator.static_root(opts)
s_root
|> Path.join("#{platform}/**/*")
|> Path.wildcard(match_dot: true)
|> Enum.reject(&File.dir?/1)
|> Enum.reduce(igniter, ©_one_binary(&1, &2, s_root))
end
defp copy_one_binary(src, igniter, s_root) do
rel = Path.relative_to(src, s_root)
if File.exists?(rel), do: igniter, else: do_copy_binary(src, rel, igniter)
end
defp do_copy_binary(src, rel, igniter) do
File.mkdir_p!(Path.dirname(rel))
File.copy!(src, rel)
if rel == "android/gradlew", do: File.chmod!(rel, 0o755)
Igniter.add_notice(igniter, "* copied binary: #{rel}")
end
end