Files
Password-Manager/pmserverApk.dpr
T
r-zakarya 8c1cabb5bd feat(android): the list and the detail move to HTML
The FMX controls lost this one on merit. Every screen re-taught the same lessons: a template missing from the loaded style, an alignment order left to chance, a HitTest swallowing a tap, a native view painting over everything. The engine draws the same interface in forty lines of CSS and shapes Arabic on its own.

The bridge needs no local server, so no port is open on the device: evaluateJavascript carries the data down, an intercepted cmd:// navigation carries the actions up. Through a throwaway iframe - FMX always tells the engine it did not handle the navigation, which on an unknown scheme replaces the page with an error screen.

Secrets do not travel over that bridge. The list gets names, sites and usernames, which are already on screen; copying from a row sends an index and Delphi reads the vault itself. Only the open entry has its values in the JS heap, and PM.wipe clears them on lock.

Folders become a row of chips with counts instead of a full-screen panel: one tap, and the count says what to expect.

Also gone: about eight hundred lines of the screen this replaces.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 23:57:46 +01:00

42 lines
1.7 KiB
ObjectPascal

program pmserverApk;
uses
System.StartUpCopy,
FMX.Forms,
// Skia remplace le moteur de rendu de FMX. Ce n'est pas un choix esthetique :
// celui d'origine ne met pas en forme les ecritures complexes - pas de
// reordonnancement bidirectionnel, pas de liaison des lettres arabes - et un
// nom de piece jointe en arabe s'affichait donc en desordre. Skia embarque
// HarfBuzz et fait ce travail correctement.
//
// Le prix est libsk4d.so, 25 Mo, a poser dans lib/arm64-v8a de l'APK. Le
// deploiement automatique s'en chargerait ; ici il ne deploie rien, donc la
// bibliotheque est mise en place a la main comme le manifeste et les .dex.
FMX.Skia,
mainApk in 'mainApk.pas' {Form8},
PMA.Crypto in 'android-client\PMA.Crypto.pas',
PMA.TestVector in 'android-client\PMA.TestVector.pas',
PMA.SyncClient in 'android-client\PMA.SyncClient.pas',
PMA.Store in 'android-client\PMA.Store.pas',
PMA.Biometric in 'android-client\PMA.Biometric.pas',
PMA.Vault in 'android-client\PMA.Vault.pas',
PMA.Totp in 'android-client\PMA.Totp.pas',
PMA.ScreenGuard in 'android-client\PMA.ScreenGuard.pas',
PMA.Clipboard in 'android-client\PMA.Clipboard.pas',
PMA.Theme in 'android-client\PMA.Theme.pas',
PMA.WebUI in 'android-client\PMA.WebUI.pas';
{$R *.res}
begin
// AVANT Application.Initialize : le canevas est choisi a l'initialisation,
// et le basculer ensuite ne rattrape pas ce qui est deja construit.
GlobalUseSkia := True;
Application.Initialize;
// Le style se pose apres l'initialisation mais avant la forme : l'appliquer
// plus tard laisserait les controles deja construits avec l'ancien.
ApplyDarkTheme;
Application.CreateForm(TForm8, Form8);
Application.Run;
end.