lomiri.lomiri-gallery-app: 3.1.0 -> 3.1.1 (#407191)

This commit is contained in:
Cosima Neidahl 2025-06-09 13:40:44 +02:00 committed by GitHub
commit d3b0010137
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 323 additions and 173 deletions

View File

@ -773,7 +773,7 @@ in
lomiri-filemanager-app = runTest ./lomiri-filemanager-app.nix;
lomiri-mediaplayer-app = runTest ./lomiri-mediaplayer-app.nix;
lomiri-music-app = runTest ./lomiri-music-app.nix;
lomiri-gallery-app = runTest ./lomiri-gallery-app.nix;
lomiri-gallery-app = discoverTests (import ./lomiri-gallery-app.nix);
lomiri-system-settings = runTest ./lomiri-system-settings.nix;
lorri = handleTest ./lorri/default.nix { };
lxqt = runTest ./lxqt.nix;

View File

@ -1,163 +1,311 @@
{ lib, ... }:
{
name = "lomiri-gallery-app-standalone";
meta.maintainers = lib.teams.lomiri.members;
let
makeTest = import ./make-test-python.nix;
imageDataDir = "gallery-app-sampledata";
imageLabel = "Image";
nodes.machine =
{ config, pkgs, ... }:
makeFormatTest =
{
imports = [ ./common/x11.nix ];
file,
buttonIsOffset ? null,
customTest ? null,
}:
services.xserver.enable = true;
makeTest (
{ pkgs, lib, ... }:
environment = {
systemPackages =
with pkgs;
[
ffmpeg # make a video from the image
(imagemagick.override { ghostscriptSupport = true; }) # example image creation
mpv # URI dispatching for video support
xdotool # mouse movement
]
++ (with pkgs.lomiri; [
suru-icon-theme
lomiri-gallery-app
lomiri-thumbnailer # finds new images & generates thumbnails
]);
variables = {
UITK_ICON_THEME = "suru";
assert lib.asserts.assertMsg (
buttonIsOffset != null || customTest != null
) "Must either clarify button position, or define custom test code";
let
format = lib.lists.last (lib.strings.splitString "." file);
in
{
name = "lomiri-gallery-app-standalone-format-${format}";
meta.maintainers = lib.teams.lomiri.members;
nodes.machine =
{ config, pkgs, ... }:
{
imports = [ ./common/x11.nix ];
services.xserver.enable = true;
environment = {
etc."${imageDataDir}".source =
pkgs.runCommand imageDataDir
{
nativeBuildInputs = with pkgs; [
ffmpeg # make a video from the image
(imagemagick.override { ghostscriptSupport = true; }) # add label for OCR
];
}
''
mkdir -p $out/{Pictures,Videos}
# Setup example data, OCR-friendly:
# - White square, black text
# - Small text for display OCR
# - Big text for gallery preview OCR
# - uppercase extension
magick -size 500x500 -background white -fill black canvas:white \
-pointsize 20 -annotate +100+100 '${imageLabel}' \
-pointsize 70 -annotate +100+300 '${imageLabel}' \
$out/Pictures/output.PNG
# Different image formats
magick $out/Pictures/output.PNG $out/Pictures/output.JPG
magick $out/Pictures/output.PNG $out/Pictures/output.BMP
magick $out/Pictures/output.PNG $out/Pictures/output.GIF
# Video for dispatching
ffmpeg -loop 1 -r 1 -i $out/Pictures/output.PNG -t 100 -pix_fmt yuv420p $out/Videos/output.MP4
'';
systemPackages =
with pkgs;
[
glib # Poke thumbnailer to process media via gdbus
mpv # URI dispatching for video support
xdotool # mouse movement
]
++ (with pkgs.lomiri; [
suru-icon-theme
lomiri-gallery-app
lomiri-thumbnailer # finds new images & generates thumbnails
]);
variables = {
UITK_ICON_THEME = "suru";
};
};
# Allow us to start thumbnailer ahead-of-time, hopefully let thumbnails get processed in peace
systemd.user.services."dbus-com.lomiri.Thumbnailer" = {
serviceConfig = {
Type = "dbus";
BusName = "com.lomiri.Thumbnailer";
ExecStart = "${pkgs.lomiri.lomiri-thumbnailer}/libexec/lomiri-thumbnailer/thumbnailer-service";
};
};
fonts = {
packages = with pkgs; [
# Intended font & helps with OCR
ubuntu-classic
];
};
};
enableOCR = true;
testScript =
''
machine.wait_for_x()
machine.succeed("mkdir /root/${builtins.dirOf file}")
machine.succeed("cp -vr /etc/${imageDataDir}/${file} /root/${builtins.dirOf file}")
# Start thumbnailer, wait for idle shutdown
machine.systemctl("start dbus-com.lomiri.Thumbnailer", "root")
machine.wait_until_succeeds(
"env XDG_RUNTIME_DIR=/run/user/0 "
+ "systemctl --user is-active dbus-com.lomiri.Thumbnailer"
)
machine.wait_for_console_text("thumbnail cache:")
# Request thumbnail processing, get initial thumbnail image into cache
# This can randomly take abit longer, just run it until it succeeds
# Touch file to invalidate failure cache
machine.wait_until_succeeds(
"touch '/root/${file}' && "
+ "env XDG_RUNTIME_DIR=/run/user/0 "
+ "gdbus call -e "
+ "-d com.lomiri.Thumbnailer -o /com/lomiri/Thumbnailer "
+ "-m com.lomiri.Thumbnailer.GetThumbnail "
+ "'/root/${file}' "
# Same size as source, to reduce processing - we're very close to hitting 20s on slow hardware here
+ "'@(ii) (500,500)'"
)
machine.wait_for_console_text("Idle timeout reached")
machine.wait_until_fails(
"env XDG_RUNTIME_DIR=/run/user/0 "
+ "systemctl --user is-active dbus-com.lomiri.Thumbnailer"
)
with subtest("lomiri gallery finds files"):
machine.succeed("lomiri-gallery-app >&2 &")
machine.wait_for_console_text("qq= AlbumsOverview") # logged when album page actually gets loaded
machine.sleep(10)
machine.send_key("alt-f10")
machine.sleep(5)
machine.wait_for_text(r"(Albums|Events|Photos|${imageLabel})")
machine.succeed("xdotool mousemove 30 40 click 1") # burger menu for categories
machine.sleep(2)
machine.succeed("xdotool mousemove 30 180 click 1") # photos
machine.sleep(2)
machine.screenshot("lomiri-gallery_photos")
machine.succeed("xdotool mousemove 80 140 click 1") # select first one
machine.sleep(2)
machine.succeed("xdotool mousemove 80 140 click 1") # enable top-bar
machine.sleep(2)
''
+ (
if (customTest != null) then
customTest
else
''
with subtest("lomiri gallery handles ${format}"):
machine.succeed("xdotool mousemove ${
if buttonIsOffset then "900" else "940"
} 50 click 1") # open media information
machine.sleep(2)
machine.screenshot("lomiri-gallery_${format}_info")
machine.send_key("esc")
machine.sleep(2)
machine.wait_for_text("${imageLabel}") # make sure media shows fine
''
);
}
);
makeFormatTests =
detailsList:
builtins.listToAttrs (
builtins.map (
{
name,
file,
buttonIsOffset ? null,
customTest ? null,
}:
{
name = "format-${name}";
value = makeFormatTest {
inherit
file
buttonIsOffset
customTest
;
};
}
) detailsList
);
in
{
basic = makeTest (
{ lib, ... }:
{
name = "lomiri-gallery-app-standalone-basic";
meta.maintainers = lib.teams.lomiri.members;
nodes.machine =
{ config, pkgs, ... }:
{
imports = [ ./common/x11.nix ];
services.xserver.enable = true;
environment = {
systemPackages =
with pkgs;
[
xdotool # mouse movement
]
++ (with pkgs.lomiri; [
suru-icon-theme
lomiri-gallery-app
]);
variables = {
UITK_ICON_THEME = "suru";
};
};
i18n.supportedLocales = [ "all" ];
fonts = {
packages = with pkgs; [
# Intended font & helps with OCR
ubuntu-classic
];
};
};
};
i18n.supportedLocales = [ "all" ];
enableOCR = true;
fonts = {
packages = with pkgs; [
# Intended font & helps with OCR
ubuntu-classic
];
};
};
testScript = ''
machine.wait_for_x()
enableOCR = true;
with subtest("lomiri gallery launches"):
machine.succeed("lomiri-gallery-app >&2 &")
machine.wait_for_console_text("qq= AlbumsOverview") # logged when album page actually gets loaded
machine.sleep(10)
machine.send_key("alt-f10")
machine.sleep(5)
machine.wait_for_text(r"(Albums|Events|Photos)")
machine.screenshot("lomiri-gallery_open")
testScript =
let
imageLabel = "Image";
in
''
machine.wait_for_x()
machine.succeed("pgrep -afx lomiri-gallery-app >&2")
machine.succeed("pkill -efx lomiri-gallery-app >&2")
machine.wait_until_fails("pgrep -afx lomiri-gallery-app >&2")
with subtest("lomiri gallery launches"):
machine.succeed("lomiri-gallery-app >&2 &")
machine.sleep(2)
machine.wait_for_text(r"(Albums|Events|Photos)")
machine.screenshot("lomiri-gallery_open")
machine.succeed("pkill -f lomiri-gallery-app")
machine.succeed("mkdir /root/Pictures /root/Videos")
# Setup example data, OCR-friendly:
# - White square, black text
# - Small text for display OCR
# - Big text for gallery preview OCR
# - uppercase extension
machine.succeed(
"magick -size 500x500 -background white -fill black canvas:white "
+ "-pointsize 20 -annotate +100+100 '${imageLabel}' "
+ "-pointsize 50 -annotate +100+300 '${imageLabel}' "
+ "/root/Pictures/output.PNG"
)
# Different image formats
machine.succeed("magick /root/Pictures/output.PNG /root/Pictures/output.JPG")
machine.succeed("magick /root/Pictures/output.PNG /root/Pictures/output.BMP")
machine.succeed("magick /root/Pictures/output.PNG /root/Pictures/output.GIF")
# Video for dispatching
machine.succeed("ffmpeg -loop 1 -r 1 -i /root/Pictures/output.PNG -t 100 -pix_fmt yuv420p /root/Videos/output.MP4")
with subtest("lomiri gallery handles files"):
machine.succeed("lomiri-gallery-app >&2 &")
machine.sleep(2)
machine.wait_for_text(r"(Albums|Events|Photos|${imageLabel})")
machine.succeed("xdotool mousemove 30 40 click 1") # burger menu for categories
machine.sleep(2)
machine.succeed("xdotool mousemove 30 180 click 1") # photos
machine.sleep(2)
machine.wait_for_text("${imageLabel}") # should see thumbnail of at least one of them
machine.screenshot("lomiri-gallery_photos")
machine.succeed("xdotool mousemove 80 140 click 1") # select newest one
machine.sleep(2)
machine.succeed("xdotool mousemove 80 140 click 1") # enable top-bar
machine.sleep(2)
with subtest("lomiri gallery handles mp4"):
machine.succeed("xdotool mousemove 870 50 click 1") # open media information
machine.sleep(2)
machine.wait_for_text("MP4") # make sure we're looking at the right file
machine.screenshot("lomiri-gallery_mp4_info")
machine.send_key("esc")
machine.wait_for_text("${imageLabel}") # make sure thumbnail rendering worked
machine.succeed("xdotool mousemove 450 350 click 1") # dispatch to system's video handler
machine.wait_until_succeeds("pgrep -u root -f mpv") # wait for video to start
machine.sleep(10)
machine.succeed("pgrep -u root -f mpv") # should still be playing
machine.screenshot("lomiri-gallery_mp4_dispatch")
machine.send_key("q")
machine.wait_until_fails("pgrep mpv") # wait for video to stop
machine.send_key("right")
with subtest("lomiri gallery handles gif"):
machine.succeed("xdotool mousemove 870 50 click 1") # open media information
machine.sleep(2)
machine.wait_for_text("GIF") # make sure we're looking at the right file
machine.screenshot("lomiri-gallery_gif_info")
machine.send_key("esc")
machine.wait_for_text("${imageLabel}") # make sure media shows fine
machine.send_key("right")
with subtest("lomiri gallery handles bmp"):
machine.succeed("xdotool mousemove 840 50 click 1") # open media information (extra icon, different location)
machine.sleep(2)
machine.wait_for_text("BMP") # make sure we're looking at the right file
machine.screenshot("lomiri-gallery_bmp_info")
machine.send_key("esc")
machine.wait_for_text("${imageLabel}") # make sure media shows fine
machine.send_key("right")
with subtest("lomiri gallery handles jpg"):
machine.succeed("xdotool mousemove 840 50 click 1") # open media information (extra icon, different location)
machine.sleep(2)
machine.wait_for_text("JPG") # make sure we're looking at the right file
machine.screenshot("lomiri-gallery_jpg_info")
machine.send_key("esc")
machine.wait_for_text("${imageLabel}") # make sure media shows fine
machine.send_key("right")
with subtest("lomiri gallery handles png"):
machine.succeed("xdotool mousemove 840 50 click 1") # open media information (extra icon, different location)
machine.sleep(2)
machine.wait_for_text("PNG") # make sure we're looking at the right file
machine.screenshot("lomiri-gallery_png_info")
machine.send_key("esc")
machine.wait_for_text("${imageLabel}") # make sure media shows fine
machine.succeed("pkill -f lomiri-gallery-app")
with subtest("lomiri gallery localisation works"):
machine.succeed("env LANG=de_DE.UTF-8 lomiri-gallery-app >&2 &")
machine.wait_for_text(r"(Alben|Ereignisse|Fotos)")
machine.screenshot("lomiri-gallery_localised")
'';
with subtest("lomiri gallery localisation works"):
machine.succeed("env LANG=de_DE.UTF-8 lomiri-gallery-app >&2 &")
machine.wait_for_console_text("qq= AlbumsOverview") # logged when album page actually gets loaded
machine.sleep(10)
machine.send_key("alt-f10")
machine.sleep(5)
machine.wait_for_text(r"(Alben|Ereignisse|Fotos)")
machine.screenshot("lomiri-gallery_localised")
'';
}
);
}
// makeFormatTests [
{
name = "mp4";
file = "Videos/output.MP4";
# MP4 gets special treatment
customTest = ''
with subtest("lomiri gallery handles mp4"):
machine.succeed("xdotool mousemove 935 40 click 1") # open media information
machine.sleep(2)
machine.screenshot("lomiri-gallery_mp4_info")
machine.send_key("esc")
machine.sleep(2)
machine.wait_for_text("${imageLabel}") # make sure thumbnail processing worked
machine.screenshot("lomiri-gallery_mp4_thumbnail")
machine.succeed("xdotool mousemove 510 380 click 1") # dispatch to system's video handler
machine.wait_until_succeeds("pgrep -u root -f mpv") # wait for video to start
machine.sleep(10)
machine.succeed("pgrep -u root -f mpv") # should still be playing
machine.screenshot("lomiri-gallery_mp4_dispatch")
'';
}
{
name = "gif";
file = "Pictures/output.GIF";
buttonIsOffset = false;
}
{
name = "bmp";
file = "Pictures/output.BMP";
buttonIsOffset = true;
}
{
name = "jpg";
file = "Pictures/output.JPG";
buttonIsOffset = true;
}
{
name = "png";
file = "Pictures/output.PNG";
buttonIsOffset = true;
}
]

View File

@ -2,7 +2,6 @@
stdenv,
lib,
fetchFromGitLab,
fetchpatch,
gitUpdater,
nixosTests,
cmake,
@ -25,29 +24,15 @@
stdenv.mkDerivation (finalAttrs: {
pname = "lomiri-gallery-app";
version = "3.1.0";
version = "3.1.1";
src = fetchFromGitLab {
owner = "ubports";
repo = "development/apps/lomiri-gallery-app";
rev = "v${finalAttrs.version}";
hash = "sha256-uKGPic9XYUj0rLA05i6GjLM+n17MYgiFJMWnLXHKmIU=";
tag = "v${finalAttrs.version}";
hash = "sha256-5/mZszPEsSZqgioJ+Mc7+0gEcpUKr7n/LgyXJ20P2Zg=";
};
patches = [
# Remove when https://gitlab.com/ubports/development/apps/lomiri-gallery-app/-/merge_requests/152 merged & in release
(fetchpatch {
name = "0001-lomiri-gallery-app-bindtextdomain.patch";
url = "https://gitlab.com/ubports/development/apps/lomiri-gallery-app/-/commit/592eff118cb5056886b73e6698f8941c7a16f2e0.patch";
hash = "sha256-aR/Lnzvq4RuRLI75mMd4xTGMAcijm1adSAGVFZZ++No=";
})
(fetchpatch {
name = "0002-lomiri-gallery-app-C++ify-i18n.patch";
url = "https://gitlab.com/ubports/development/apps/lomiri-gallery-app/-/commit/a7582abbe0acef4d49c77a4395bc22dbd1707ef3.patch";
hash = "sha256-qzqTXqIYX+enoOwwV9d9fxe7tVYLuh1WkL8Ij/Qx0H0=";
})
];
postPatch = ''
# Make splash path in desktop file relative
substituteInPlace desktop/lomiri-gallery-app.desktop.in.in \
@ -118,14 +103,25 @@ stdenv.mkDerivation (finalAttrs: {
'';
passthru = {
tests.vm = nixosTests.lomiri-gallery-app;
tests = {
inherit (nixosTests.lomiri-gallery-app)
basic
format-mp4
format-gif
format-bmp
format-jpg
format-png
;
};
updateScript = gitUpdater { rev-prefix = "v"; };
};
meta = {
description = "Photo gallery application for Ubuntu Touch devices";
homepage = "https://gitlab.com/ubports/development/apps/lomiri-gallery-app";
changelog = "https://gitlab.com/ubports/development/apps/lomiri-gallery-app/-/blob/v${finalAttrs.version}/ChangeLog";
changelog = "https://gitlab.com/ubports/development/apps/lomiri-gallery-app/-/blob/${
if (!builtins.isNull finalAttrs.src.tag) then finalAttrs.src.tag else finalAttrs.src.rev
}/ChangeLog";
license = with lib.licenses; [
gpl3Only
cc-by-sa-30

View File

@ -188,7 +188,13 @@ stdenv.mkDerivation (finalAttrs: {
passthru = {
tests = {
# gallery app delegates to thumbnailer, tests various formats
gallery-app = nixosTests.lomiri-gallery-app;
inherit (nixosTests.lomiri-gallery-app)
format-mp4
format-gif
format-bmp
format-jpg
format-png
;
# music app relies on thumbnailer to extract embedded cover art
music-app = nixosTests.lomiri-music-app;