feat(android): the system bars join the gradient
The app sat in a frame that did not belong to it: a grey status bar above, a WHITE navigation bar below, under a blue background. The reference bathes both in the same gradient, and that is what makes an app look like it occupies the screen rather than being placed on it. Each bar takes one end of the gradient - top colour above, bottom colour below - so the continuity is exact. The FLAG_SECURE condition moved from the uses clause into the body of SecureScreen, since the same JNI imports now serve the bars, which must work in debug too. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -15,12 +15,23 @@ unit PMA.ScreenGuard;
|
|||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
System.UITypes;
|
||||||
|
|
||||||
/// A appeler une fois, au demarrage, depuis le thread principal.
|
/// A appeler une fois, au demarrage, depuis le thread principal.
|
||||||
procedure SecureScreen;
|
procedure SecureScreen;
|
||||||
|
|
||||||
|
/// Teinte les barres systeme - etat en haut, navigation en bas.
|
||||||
|
///
|
||||||
|
/// Sans cela l'application flotte dans un cadre qui ne lui appartient pas :
|
||||||
|
/// barre d'etat grise, barre de navigation BLANCHE sous un fond bleu. La
|
||||||
|
/// reference les fait baigner dans le meme degrade, et c'est ce qui donne
|
||||||
|
/// l'impression que l'application occupe l'ecran plutot que d'y etre posee.
|
||||||
|
procedure TintSystemBars(ATop, ABottom: TAlphaColor);
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
{$IF DEFINED(ANDROID) AND NOT DEFINED(DEBUG)}
|
{$IF DEFINED(ANDROID)}
|
||||||
uses
|
uses
|
||||||
// System.SysUtils : sans elle, TAndroidHelper.GetJActivity reste un appel
|
// System.SysUtils : sans elle, TAndroidHelper.GetJActivity reste un appel
|
||||||
// non expanse et le compilateur le signale a chaque usage.
|
// non expanse et le compilateur le signale a chaque usage.
|
||||||
@@ -29,6 +40,9 @@ uses
|
|||||||
|
|
||||||
procedure SecureScreen;
|
procedure SecureScreen;
|
||||||
begin
|
begin
|
||||||
|
// La condition est ICI, dans le corps, et non sur la clause uses : celle-ci
|
||||||
|
// sert aussi a TintSystemBars, qui doit fonctionner en debug.
|
||||||
|
{$IFNDEF DEBUG}
|
||||||
// setFlags touche la fenetre : thread d'interface obligatoire.
|
// setFlags touche la fenetre : thread d'interface obligatoire.
|
||||||
CallInUIThread(
|
CallInUIThread(
|
||||||
procedure
|
procedure
|
||||||
@@ -37,11 +51,37 @@ begin
|
|||||||
TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE,
|
TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE,
|
||||||
TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
|
TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
|
||||||
end);
|
end);
|
||||||
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
procedure SecureScreen;
|
procedure SecureScreen;
|
||||||
begin
|
begin
|
||||||
// Rien a faire : ni Windows ni une compilation de debogage.
|
// Rien a faire : ce n'est pas Android.
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IF DEFINED(ANDROID)}
|
||||||
|
procedure TintSystemBars(ATop, ABottom: TAlphaColor);
|
||||||
|
begin
|
||||||
|
CallInUIThread(
|
||||||
|
procedure
|
||||||
|
var
|
||||||
|
LWindow: JWindow;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
LWindow := TAndroidHelper.Activity.getWindow;
|
||||||
|
// Les deux couleurs different : le haut prend le depart du degrade,
|
||||||
|
// le bas son arrivee, pour que la continuite soit exacte.
|
||||||
|
LWindow.setStatusBarColor(Integer(ATop));
|
||||||
|
LWindow.setNavigationBarColor(Integer(ABottom));
|
||||||
|
except
|
||||||
|
// Une barre non teintee n'empeche rien de fonctionner.
|
||||||
|
end;
|
||||||
|
end);
|
||||||
|
end;
|
||||||
|
{$ELSE}
|
||||||
|
procedure TintSystemBars(ATop, ABottom: TAlphaColor);
|
||||||
|
begin
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
|||||||
@@ -240,6 +240,9 @@ begin
|
|||||||
// Qualifie : TForm a deja une methode PaintBackground, sans parametre, qui
|
// Qualifie : TForm a deja une methode PaintBackground, sans parametre, qui
|
||||||
// masque celle de l'unite.
|
// masque celle de l'unite.
|
||||||
PMA.Theme.PaintBackground(Fill);
|
PMA.Theme.PaintBackground(Fill);
|
||||||
|
// Les barres systeme prennent les deux extremites du degrade, pour que
|
||||||
|
// l'ecran soit d'un seul tenant.
|
||||||
|
TintSystemBars(COL_BG_TOP, COL_BG);
|
||||||
SecureScreen; // avant tout affichage de contenu
|
SecureScreen; // avant tout affichage de contenu
|
||||||
FVault := TVault.Create;
|
FVault := TVault.Create;
|
||||||
FIcons := TObjectDictionary<Integer, TBitmap>.Create([doOwnsValues]);
|
FIcons := TObjectDictionary<Integer, TBitmap>.Create([doOwnsValues]);
|
||||||
|
|||||||
Reference in New Issue
Block a user