8dc0840e03
The prompt raised ActivityNotFoundException: FMX does not show BiometricPrompt from our NativeActivity, it launches its own BiometricFragmentActivity, which lives in fmx.dex.jar but has to be declared in the manifest. Given a translucent framework theme - it hosts the system dialog and draws nothing itself, and the generated resources contain no AppCompat. Then the read failed and the cache vanished with no trace. LoadVault sorted 'key lost' from 'not authenticated' on the exception message and deleted the file when it guessed the former - so a wrong guess destroyed the cache and the only record of why. It now reports through LastStoreError and deletes nothing; the caller has the log and the context. OpenLocalNow shows the reason, after ShowUnlock rather than before, which was overwriting it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
100 lines
4.9 KiB
XML
100 lines
4.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- BEGIN_INCLUDE(manifest) -->
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
xmlns:tools="http://schemas.android.com/tools"
|
|
package="%package%"
|
|
android:versionCode="%versionCode%"
|
|
android:versionName="%versionName%"
|
|
android:installLocation="%installLocation%">
|
|
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
|
|
<%uses-permission%>
|
|
<!-- Absente de la liste par defaut de Delphi, et sans elle BiometricPrompt
|
|
leve java.lang.SecurityException a la premiere invite - pas au
|
|
demarrage, donc le defaut ne se voit qu'en essayant d'ouvrir le coffre.
|
|
USE_FINGERPRINT couvre les versions anterieures a Android 9, ou
|
|
BiometricPrompt n'existe pas encore. -->
|
|
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
|
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
|
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
|
<queries>
|
|
<%queries-child-elements%>
|
|
</queries>
|
|
<!-- usesCleartextTraffic : TEST UNIQUEMENT. Android bloque le trafic en
|
|
clair depuis la version 9, y compris vers 127.0.0.1 ; sans cet
|
|
attribut l'essai local via "adb reverse" echoue avec une erreur
|
|
reseau opaque. A RETIRER avant diffusion : l'endpoint de production
|
|
est en HTTPS, et le jeton Bearer circule dans un en-tete a chaque
|
|
appel. -->
|
|
<!-- allowBackup=false : le repertoire prive contient vault.bin, c'est-a-dire
|
|
le coffre entier. Il est chiffre par une cle qui ne quitte pas la puce,
|
|
donc ce qui sortirait serait inexploitable - mais il sortirait, et une
|
|
sauvegarde cloud n'a rien a faire dans le chemin d'un gestionnaire de
|
|
mots de passe. fullBackupContent et dataExtractionRules ne sont pas
|
|
necessaires une fois la sauvegarde refusee en bloc. -->
|
|
<application
|
|
android:allowBackup="false"
|
|
android:usesCleartextTraffic="true"
|
|
android:persistent="%persistent%"
|
|
android:restoreAnyVersion="%restoreAnyVersion%"
|
|
android:label="%label%"
|
|
android:debuggable="%debuggable%"
|
|
android:largeHeap="%largeHeap%"
|
|
android:icon="%icon%"
|
|
android:theme="%theme%"
|
|
android:hardwareAccelerated="%hardwareAccelerated%"
|
|
android:resizeableActivity="true"
|
|
android:requestLegacyExternalStorage="true">
|
|
<%provider%>
|
|
<%application-meta-data%>
|
|
<%uses-libraries%>
|
|
<!-- Trigger Google Play services to install the backported photo picker module. -->
|
|
<service
|
|
android:name="com.google.android.gms.metadata.ModuleDependencies"
|
|
android:enabled="false"
|
|
android:exported="false"
|
|
tools:ignore="MissingClass">
|
|
<intent-filter>
|
|
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
|
|
</intent-filter>
|
|
|
|
<meta-data android:name="photopicker_activity:0:required" android:value="" />
|
|
</service>
|
|
<%services%>
|
|
<!-- Our activity is a subclass of the built-in NativeActivity framework class.
|
|
This will take care of integrating with our NDK code. -->
|
|
<activity
|
|
android:name="com.embarcadero.firemonkey.FMXNativeActivity"
|
|
android:exported="true"
|
|
android:label="%activityLabel%"
|
|
android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"
|
|
android:launchMode="singleTask">
|
|
<!-- Tell NativeActivity the name of our .so -->
|
|
<meta-data android:name="android.app.lib_name" android:value="%libNameValue%" />
|
|
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
</activity>
|
|
<!-- FMX n'affiche pas BiometricPrompt depuis notre NativeActivity : il
|
|
lance SA PROPRE activite, qui heberge le fragment androidx. Elle
|
|
vit dans fmx.dex.jar, mais Android exige qu'elle soit declaree ici
|
|
- sinon android.content.ActivityNotFoundException a la premiere
|
|
invite, et nulle part avant.
|
|
|
|
Theme translucide du framework : cette activite ne dessine rien
|
|
d'elle-meme, elle ne fait qu'heberger le dialogue systeme. Sans
|
|
cela elle recouvrirait l'ecran d'une surface opaque le temps de
|
|
l'authentification. On prend un theme @android: et non AppCompat,
|
|
absent des ressources generees. -->
|
|
<activity
|
|
android:name="com.embarcadero.firemonkey.biometricauth.BiometricFragmentActivity"
|
|
android:exported="false"
|
|
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
|
|
<%activity%>
|
|
<%receivers%>
|
|
</application>
|
|
</manifest>
|
|
<!-- END_INCLUDE(manifest) -->
|