mirror of
https://github.com/nix-community/nix-on-droid.git
synced 2025-11-08 19:46:07 +01:00
modules/android_integration: termux-setup-storage & unsupported
This commit is contained in:
parent
c4c4f09e3d
commit
733a9fe55c
7 changed files with 265 additions and 4 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
* New options under `android-integration`,
|
* New options under `android-integration`,
|
||||||
offer some of the tools familiar to Termux users.
|
offer some of the tools familiar to Termux users.
|
||||||
Currently it's just `am`.
|
Currently only `am` and `termux-setup-storage` are provided.
|
||||||
|
|
||||||
### Compatibility considerations
|
### Compatibility considerations
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,10 @@ let
|
||||||
|
|
||||||
termux-am =
|
termux-am =
|
||||||
pkgs.callPackage (import ../../pkgs/android-integration/termux-am.nix) { };
|
pkgs.callPackage (import ../../pkgs/android-integration/termux-am.nix) { };
|
||||||
|
termux-tools =
|
||||||
|
pkgs.callPackage (import ../../pkgs/android-integration/termux-tools.nix) {
|
||||||
|
inherit termux-am;
|
||||||
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -25,12 +29,35 @@ in
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
termux-setup-storage.enable = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = false;
|
||||||
|
example = "true";
|
||||||
|
description = lib.mdDoc ''
|
||||||
|
Provide a `termux-setup-storage` command
|
||||||
|
that makes the app request storage permission,
|
||||||
|
and then creates a $HOME/storage directory with symlinks to storage.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
unsupported.enable = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = false;
|
||||||
|
example = "true";
|
||||||
|
description = lib.mdDoc ''
|
||||||
|
Provide several more unsupported and untested commands.
|
||||||
|
For testing and for brave souls only.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
###### implementation
|
###### implementation
|
||||||
|
|
||||||
config = {
|
config = let ifD = cond: pkg: if cond then [ pkg ] else [ ]; in {
|
||||||
environment.packages =
|
environment.packages =
|
||||||
lib.mkIf cfg.am.enable [ termux-am ];
|
(ifD cfg.am.enable termux-am) ++
|
||||||
|
(ifD cfg.termux-setup-storage.enable termux-tools.setup_storage) ++
|
||||||
|
(ifD cfg.unsupported.enable termux-tools.out);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
99
pkgs/android-integration/termux-tools.nix
Normal file
99
pkgs/android-integration/termux-tools.nix
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
# Copyright (c) 2019-2024, see AUTHORS. Licensed under MIT License, see LICENSE.
|
||||||
|
|
||||||
|
{ stdenvNoCC
|
||||||
|
, fetchFromGitHub
|
||||||
|
, autoreconfHook
|
||||||
|
, makeWrapper
|
||||||
|
, gnused
|
||||||
|
, getopt
|
||||||
|
, termux-am
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenvNoCC.mkDerivation rec {
|
||||||
|
name = "termux-tools";
|
||||||
|
version = "1.42.4";
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "termux";
|
||||||
|
repo = "termux-tools";
|
||||||
|
rev = "v${version}";
|
||||||
|
sha256 = "sha256-LkkeaEQcY8HgunBYAg3Ymn5xYPvrGqGNCZTd/NyIOKY=";
|
||||||
|
};
|
||||||
|
nativeBuildInputs = [ autoreconfHook makeWrapper ];
|
||||||
|
propagatedInputs = [ termux-am ];
|
||||||
|
|
||||||
|
# https://github.com/termux/termux-tools/pull/95
|
||||||
|
patches = [ ./termux-tools.patch ];
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace scripts/termux-setup-storage.in \
|
||||||
|
--replace @TERMUX_HOME@ /data/data/com.termux.nix/files/home/ \
|
||||||
|
--replace @TERMUX_APP_PACKAGE@ com.termux.nix
|
||||||
|
substituteInPlace scripts/termux-open.in \
|
||||||
|
--replace @TERMUX_APP_PACKAGE@.app com.termux.app \
|
||||||
|
--replace @TERMUX_APP_PACKAGE@ com.termux.nix \
|
||||||
|
--replace 'getopt ' '${getopt}/bin/getopt '
|
||||||
|
${gnused}/bin/sed -i 's|^am |${termux-am}/bin/am |' scripts/*
|
||||||
|
|
||||||
|
rm -r doc # manpage is half misleading, pulling pandoc is not worth it
|
||||||
|
substituteInPlace Makefile.am --replace \
|
||||||
|
'SUBDIRS = . scripts doc mirrors motds' \
|
||||||
|
'SUBDIRS = . scripts'
|
||||||
|
substituteInPlace configure.ac --replace \
|
||||||
|
'AC_CONFIG_FILES([Makefile scripts/Makefile doc/Makefile' \
|
||||||
|
'AC_CONFIG_FILES([Makefile scripts/Makefile])'
|
||||||
|
substituteInPlace configure.ac --replace \
|
||||||
|
'mirrors/Makefile motds/Makefile])' ""
|
||||||
|
'';
|
||||||
|
|
||||||
|
outputs = [
|
||||||
|
"out" # all the unsupported unsorted stuff
|
||||||
|
"setup_storage" # termux-setup-storage
|
||||||
|
];
|
||||||
|
postInstall = ''
|
||||||
|
rm $out/etc/termux-login.sh
|
||||||
|
rm $out/etc/profile.d/init-termux-properties.sh
|
||||||
|
rm -d $out/etc/profile.d
|
||||||
|
rm -d $out/etc
|
||||||
|
|
||||||
|
rm $out/bin/chsh # we offer a declarative way to change your shell
|
||||||
|
rm $out/bin/cmd # doesn't work because we overlay /system/bin
|
||||||
|
rm $out/bin/dalvikvm # doesn't work because we overlay /system/bin
|
||||||
|
rm $out/bin/df # works without the magic
|
||||||
|
rm $out/bin/getprop # doesn't work because we overlay /system/bin
|
||||||
|
rm $out/bin/logcat # doesn't work because we overlay /system/bin
|
||||||
|
rm $out/bin/login # we have our own, very complex login
|
||||||
|
rm $out/bin/ping # doesn't work because we overlay /system/bin
|
||||||
|
rm $out/bin/ping6 # doesn't work because we overlay /system/bin
|
||||||
|
rm $out/bin/pkg # we use Nix
|
||||||
|
rm $out/bin/pm # doesn't work because we overlay /system/bin
|
||||||
|
rm $out/bin/settings # doesn't work because we overlay /system/bin
|
||||||
|
rm $out/bin/su # doesn't work because we overlay /bin
|
||||||
|
rm $out/bin/top # doesn't work because we overlay /system/bin
|
||||||
|
|
||||||
|
rm $out/bin/termux-change-repo # we use Nix
|
||||||
|
rm $out/bin/termux-fix-shebang # we use Nix
|
||||||
|
rm $out/bin/termux-info # Termux-specific. write our own?
|
||||||
|
rm $out/bin/termux-reset # untested and dangerous
|
||||||
|
rm $out/bin/termux-restore # untested and dangerous
|
||||||
|
rm $out/bin/termux-setup-package-manager # we use Nix
|
||||||
|
|
||||||
|
mkdir -p $setup_storage/bin
|
||||||
|
mv $out/bin/termux-setup-storage $setup_storage/bin/
|
||||||
|
|
||||||
|
# check that we didn't package we didn't want to
|
||||||
|
find $out | ${gnused}/bin/sed "s|^$out|.|" | sort > effective
|
||||||
|
echo . >> expected
|
||||||
|
echo ./bin >> expected
|
||||||
|
echo ./bin/termux-backup >> expected # entirely untested
|
||||||
|
echo ./bin/termux-open >> expected # good candidate for fixing
|
||||||
|
echo ./bin/termux-open-url >> expected # good candidate for fixing
|
||||||
|
echo ./bin/termux-reload-settings >> expected # good candidate for fixing
|
||||||
|
echo ./bin/termux-wake-lock >> expected # good candidate for fixing
|
||||||
|
echo ./bin/termux-wake-unlock >> expected # good candidate for fixing
|
||||||
|
echo ./bin/xdg-open >> expected # good candidate for fixing
|
||||||
|
echo ./share >> expected
|
||||||
|
echo ./share/examples >> expected
|
||||||
|
echo ./share/examples/termux >> expected
|
||||||
|
echo ./share/examples/termux/termux.properties >> expected # useful
|
||||||
|
diff -u expected effective
|
||||||
|
'';
|
||||||
|
}
|
||||||
87
pkgs/android-integration/termux-tools.patch
Normal file
87
pkgs/android-integration/termux-tools.patch
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
From 6d72b44d90347ddce8473b604c38f352e6773f8d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alexander Sosedkin <monk@unboiled.info>
|
||||||
|
Date: Sat, 1 Jun 2024 17:14:22 +0200
|
||||||
|
Subject: [PATCH] scripts: replace com.termux with @TERMUX_APP_PACKAGE@
|
||||||
|
|
||||||
|
---
|
||||||
|
scripts/termux-open.in | 2 +-
|
||||||
|
scripts/termux-reload-settings.in | 2 +-
|
||||||
|
scripts/termux-reset.in | 2 +-
|
||||||
|
scripts/termux-setup-storage.in | 4 ++--
|
||||||
|
scripts/termux-wake-lock.in | 4 ++--
|
||||||
|
scripts/termux-wake-unlock.in | 4 ++--
|
||||||
|
6 files changed, 9 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/scripts/termux-open.in b/scripts/termux-open.in
|
||||||
|
index 9c81630..9a04e7b 100644
|
||||||
|
--- a/scripts/termux-open.in
|
||||||
|
+++ b/scripts/termux-open.in
|
||||||
|
@@ -44,7 +44,7 @@ case "${TERMUX__USER_ID:-}" in ''|*[!0-9]*|0[0-9]*) TERMUX__USER_ID=0;; esac
|
||||||
|
|
||||||
|
am broadcast --user "$TERMUX__USER_ID" \
|
||||||
|
-a $ACTION \
|
||||||
|
- -n com.termux/com.termux.app.TermuxOpenReceiver \
|
||||||
|
+ -n @TERMUX_APP_PACKAGE@/@TERMUX_APP_PACKAGE@.app.TermuxOpenReceiver \
|
||||||
|
$EXTRAS \
|
||||||
|
-d "$FILE" \
|
||||||
|
> /dev/null
|
||||||
|
diff --git a/scripts/termux-reload-settings.in b/scripts/termux-reload-settings.in
|
||||||
|
index 4e71f8a..ef8b0f4 100644
|
||||||
|
--- a/scripts/termux-reload-settings.in
|
||||||
|
+++ b/scripts/termux-reload-settings.in
|
||||||
|
@@ -11,4 +11,4 @@ fi
|
||||||
|
|
||||||
|
case "${TERMUX__USER_ID:-}" in ''|*[!0-9]*|0[0-9]*) TERMUX__USER_ID=0;; esac
|
||||||
|
|
||||||
|
-am broadcast --user "$TERMUX__USER_ID" -a com.termux.app.reload_style com.termux > /dev/null
|
||||||
|
+am broadcast --user "$TERMUX__USER_ID" -a @TERMUX_APP_PACKAGE@.app.reload_style @TERMUX_APP_PACKAGE@ > /dev/null
|
||||||
|
diff --git a/scripts/termux-reset.in b/scripts/termux-reset.in
|
||||||
|
index 6f807a7..2161d1f 100644
|
||||||
|
--- a/scripts/termux-reset.in
|
||||||
|
+++ b/scripts/termux-reset.in
|
||||||
|
@@ -45,6 +45,6 @@ else
|
||||||
|
/system/bin/killall -9 "$SHELL"
|
||||||
|
else
|
||||||
|
export CLASSPATH="@TERMUX_CACHE_DIR@/termux-am/am.apk"
|
||||||
|
- /system/bin/app_process / com.termux.termuxam.Am stopservice com.termux/.app.TermuxService
|
||||||
|
+ /system/bin/app_process / @TERMUX_APP_PACKAGE@.termuxam.Am stopservice @TERMUX_APP_PACKAGE@/.app.TermuxService
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
diff --git a/scripts/termux-setup-storage.in b/scripts/termux-setup-storage.in
|
||||||
|
index c621234..a086159 100644
|
||||||
|
--- a/scripts/termux-setup-storage.in
|
||||||
|
+++ b/scripts/termux-setup-storage.in
|
||||||
|
@@ -27,5 +27,5 @@ fi
|
||||||
|
case "${TERMUX__USER_ID:-}" in ''|*[!0-9]*|0[0-9]*) TERMUX__USER_ID=0;; esac
|
||||||
|
|
||||||
|
am broadcast --user "$TERMUX__USER_ID" \
|
||||||
|
- --es com.termux.app.reload_style storage \
|
||||||
|
- -a com.termux.app.reload_style com.termux > /dev/null
|
||||||
|
+ --es @TERMUX_APP_PACKAGE@.app.reload_style storage \
|
||||||
|
+ -a @TERMUX_APP_PACKAGE@.app.reload_style @TERMUX_APP_PACKAGE@ > /dev/null
|
||||||
|
diff --git a/scripts/termux-wake-lock.in b/scripts/termux-wake-lock.in
|
||||||
|
index ba4b899..f3fd59e 100644
|
||||||
|
--- a/scripts/termux-wake-lock.in
|
||||||
|
+++ b/scripts/termux-wake-lock.in
|
||||||
|
@@ -10,6 +10,6 @@ case "${TERMUX__USER_ID:-}" in ''|*[!0-9]*|0[0-9]*) TERMUX__USER_ID=0;; esac
|
||||||
|
|
||||||
|
am startservice \
|
||||||
|
--user "$TERMUX__USER_ID" \
|
||||||
|
- -a com.termux.service_wake_lock \
|
||||||
|
- com.termux/com.termux.app.TermuxService \
|
||||||
|
+ -a @TERMUX_APP_PACKAGE@.service_wake_lock \
|
||||||
|
+ @TERMUX_APP_PACKAGE@/@TERMUX_APP_PACKAGE@.app.TermuxService \
|
||||||
|
> /dev/null
|
||||||
|
diff --git a/scripts/termux-wake-unlock.in b/scripts/termux-wake-unlock.in
|
||||||
|
index a4b1f57..d53ce31 100644
|
||||||
|
--- a/scripts/termux-wake-unlock.in
|
||||||
|
+++ b/scripts/termux-wake-unlock.in
|
||||||
|
@@ -10,6 +10,6 @@ case "${TERMUX__USER_ID:-}" in ''|*[!0-9]*|0[0-9]*) TERMUX__USER_ID=0;; esac
|
||||||
|
|
||||||
|
am startservice \
|
||||||
|
--user "$TERMUX__USER_ID" \
|
||||||
|
- -a com.termux.service_wake_unlock \
|
||||||
|
- com.termux/com.termux.app.TermuxService \
|
||||||
|
+ -a @TERMUX_APP_PACKAGE@.service_wake_unlock \
|
||||||
|
+ @TERMUX_APP_PACKAGE@/@TERMUX_APP_PACKAGE@.app.TermuxService \
|
||||||
|
> /dev/null
|
||||||
|
|
@ -8,12 +8,17 @@ from common import screenshot, wait_for
|
||||||
def run(d):
|
def run(d):
|
||||||
nod = bootstrap_channels.run(d)
|
nod = bootstrap_channels.run(d)
|
||||||
|
|
||||||
|
# Verify that android-integration tools aren't installed by default
|
||||||
d('input text "am"')
|
d('input text "am"')
|
||||||
d.ui.press('enter')
|
d.ui.press('enter')
|
||||||
wait_for(d, 'bash: am: command not found')
|
wait_for(d, 'bash: am: command not found')
|
||||||
screenshot(d, 'no-am')
|
screenshot(d, 'no-am')
|
||||||
|
d('input text "termux-setup-storage"')
|
||||||
|
d.ui.press('enter')
|
||||||
|
wait_for(d, 'bash: termux-setup-storage: command not found')
|
||||||
|
screenshot(d, 'no-termux-setup-storage')
|
||||||
|
|
||||||
# Apply a config that enables am
|
# Apply a config that enables android-integration tools
|
||||||
cfg = ('/data/local/tmp/n-o-d/unpacked/tests/on-device/'
|
cfg = ('/data/local/tmp/n-o-d/unpacked/tests/on-device/'
|
||||||
'config-android-integration.nix')
|
'config-android-integration.nix')
|
||||||
d(f'input text \'cp {cfg} .config/nixpkgs/nix-on-droid.nix\'')
|
d(f'input text \'cp {cfg} .config/nixpkgs/nix-on-droid.nix\'')
|
||||||
|
|
@ -67,3 +72,31 @@ def run(d):
|
||||||
d('input text "am | head -n2"')
|
d('input text "am | head -n2"')
|
||||||
d.ui.press('enter')
|
d.ui.press('enter')
|
||||||
wait_for(d, 'termux-am is a wrapper script')
|
wait_for(d, 'termux-am is a wrapper script')
|
||||||
|
|
||||||
|
# Verify termux-setup-storage is there
|
||||||
|
d('input text "termux-setup-storage"')
|
||||||
|
d.ui.press('enter')
|
||||||
|
screenshot(d, 'termux-setup-storage-invoked')
|
||||||
|
wait_for(d, 'Allow Nix to access')
|
||||||
|
screenshot(d, 'permission-requested')
|
||||||
|
if 'text="Allow"' in d.ui.dump_hierarchy():
|
||||||
|
d.ui(text='Allow').click()
|
||||||
|
elif 'text="ALLOW"' in d.ui.dump_hierarchy():
|
||||||
|
d.ui(text='ALLOW').click()
|
||||||
|
screenshot(d, 'permission-granted')
|
||||||
|
|
||||||
|
d('input text "ls -l storage"')
|
||||||
|
d.ui.press('enter')
|
||||||
|
screenshot(d, 'storage-listed')
|
||||||
|
wait_for(d, 'pictures -> /storage/emulated/0/Pictures')
|
||||||
|
wait_for(d, 'shared -> /storage/emulated/0')
|
||||||
|
screenshot(d, 'storage-listed-ok')
|
||||||
|
|
||||||
|
# Invoke termux-setup-storage again
|
||||||
|
d('input text "termux-setup-storage"')
|
||||||
|
d.ui.press('enter')
|
||||||
|
screenshot(d, 'termux-setup-storage-invoked-again')
|
||||||
|
wait_for(d, 'already exists')
|
||||||
|
wait_for(d, 'Do you want to continue?')
|
||||||
|
d.ui.press('enter')
|
||||||
|
wait_for(d, 'Aborting configuration and leaving')
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@ load lib
|
||||||
@test 'android-integration options can be used' {
|
@test 'android-integration options can be used' {
|
||||||
bats_require_minimum_version 1.5.0
|
bats_require_minimum_version 1.5.0
|
||||||
run ! command -v am
|
run ! command -v am
|
||||||
|
run ! command -v termux-setup-storage
|
||||||
|
run ! command -v termux-open-url
|
||||||
|
|
||||||
cp \
|
cp \
|
||||||
"$ON_DEVICE_TESTS_DIR/config-android-integration.nix" \
|
"$ON_DEVICE_TESTS_DIR/config-android-integration.nix" \
|
||||||
|
|
@ -12,6 +14,17 @@ load lib
|
||||||
nix-on-droid switch
|
nix-on-droid switch
|
||||||
|
|
||||||
command -v am
|
command -v am
|
||||||
|
command -v termux-setup-storage
|
||||||
|
run ! command -v termux-open-url
|
||||||
|
|
||||||
|
_sed \
|
||||||
|
-e "s|# unsupported.enable = false;|unsupported.enable = true;|" \
|
||||||
|
-e "s|am.enable = true;|am.enable = false;|" \
|
||||||
|
-i ~/.config/nixpkgs/nix-on-droid.nix
|
||||||
|
nix-on-droid switch
|
||||||
|
run ! command -v am
|
||||||
|
command -v termux-setup-storage
|
||||||
|
command -v termux-open-url
|
||||||
|
|
||||||
switch_to_default_config
|
switch_to_default_config
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,5 +4,7 @@ _:
|
||||||
system.stateVersion = "23.11";
|
system.stateVersion = "23.11";
|
||||||
android-integration = {
|
android-integration = {
|
||||||
am.enable = true;
|
am.enable = true;
|
||||||
|
termux-setup-storage.enable = true;
|
||||||
|
# unsupported.enable = false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue