unit PMA.ScreenGuard; { FLAG_SECURE : interdit la capture d'ecran et l'apparition du contenu dans l'apercu des applications recentes. COMPLEMENTAIRE, pas redondant, avec le masquage sur WillBecomeInactive : celui-ci traite l'apercu des recentes, celui-la traite en plus les captures manuelles, l'enregistrement d'ecran et la duplication vers un ecran externe - qu'aucun code applicatif ne peut intercepter. ACTIF EN RELEASE SEULEMENT. En debug le drapeau empeche aussi les captures d'ecran de developpement, ce qui rend le diagnostic penible pour un gain nul sur un appareil de test. Le verifier demande donc une compilation Release. } 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)} uses // System.SysUtils : sans elle, TAndroidHelper.GetJActivity reste un appel // non expanse et le compilateur le signale a chaque usage. System.SysUtils, Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android; 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 begin TAndroidHelper.Activity.getWindow.setFlags( TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE, TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE); end); {$ENDIF} end; {$ELSE} procedure SecureScreen; begin // 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} end.