diff --git a/android-client/PMA.ScreenGuard.pas b/android-client/PMA.ScreenGuard.pas index 1a227b0..09b1a1b 100644 --- a/android-client/PMA.ScreenGuard.pas +++ b/android-client/PMA.ScreenGuard.pas @@ -15,12 +15,23 @@ unit PMA.ScreenGuard; interface +uses + System.UITypes; + /// A appeler une fois, au demarrage, depuis le thread principal. 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 -{$IF DEFINED(ANDROID) AND NOT DEFINED(DEBUG)} +{$IF DEFINED(ANDROID)} uses // System.SysUtils : sans elle, TAndroidHelper.GetJActivity reste un appel // non expanse et le compilateur le signale a chaque usage. @@ -29,6 +40,9 @@ uses procedure SecureScreen; 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. CallInUIThread( procedure @@ -37,11 +51,37 @@ begin TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE, TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE); end); +{$ENDIF} end; {$ELSE} procedure SecureScreen; 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; {$ENDIF} diff --git a/mainApk.pas b/mainApk.pas index 229f8ce..d70a77e 100644 --- a/mainApk.pas +++ b/mainApk.pas @@ -240,6 +240,9 @@ begin // Qualifie : TForm a deja une methode PaintBackground, sans parametre, qui // masque celle de l'unite. 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 FVault := TVault.Create; FIcons := TObjectDictionary.Create([doOwnsValues]);