Flutter plugin that secures your secrets in keychain using biometric authentication (Fingerprint, Touch ID, Face ID...).

Overview

Flutter Locker 🔒

Locker

Flutter plugin that secures your secrets in keychain using biometric authentication (Fingerprint, Touch ID, Face ID...).

It uses:

Methods

FlutterLocker.canAuthenticate()

Checks if the devices has biometric features

FlutterLocker.save(SaveSecretRequest(key, secret, AndroidPrompt("Authenticate", "Cancel")))

Saves the secret. On Android prompt is shown, while on iOS there is no need for the prompt when saving.

FlutterLocker.retrieve(RetrieveSecretRequest(key, AndroidPrompt('Authenticate', 'Cancel'), IOsPrompt('Authenticate')))

Retrieves the secret. You need to provide a prompt for Android and iOS. Prompt for iOS is used only with TouchID. FaceID uses strings for Info.plist.

FlutterLocker.delete(key)

Deletes the key.

Errors

There are some common exceptions you can intercept and handle. We return FlutterLockerException and you can read exception.reason for these common cases:

  • secretNotFound - Happens when you try to retrieve a secret that was never saved for that key
  • authenticationCanceled - User canceled the authentication prompt
  • authenticationFailed - User failed authentication, e.g. by too many wrong attempts

There are many more specific errors that can happen on any platform. In that case you'll receive PlatformException with some more info in exception.message.

Notes and setup

Note:

  • iOS only: app will not show authentication dialog when saving (authentication will always succeed)
  • iOS only: you can't override password with new one. You need the use delete first.
  • please follow Locker's and Goldfinger's setup to prevent any issues.

iOS:

  • in order to use Locker, you need to ask permission for Face ID usage:
  • add following to your Info.plist from drop down menu
    • Privacy - Face ID usage description
    • after new field was added, provide meaningful description
  • failure to do so will result in following error
    This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSFaceIDUsageDescription key with a string value explaining to the user how the app uses this data.

Android:

Comments
  • flutter_locker: generateDebugProto - Windows support not enabled

    flutter_locker: generateDebugProto - Windows support not enabled

    Hi, Seems this library is not supported on Windows. I continuosly see this error when trying to build my app on a windows machine.

    Can someone please check.

    Thanks Manmeet Chadha

    Logs.txt

    image

    opened by ManmeetChadha9 13
  • Build fails for Android on M1 Macs

    Build fails for Android on M1 Macs

    Build fails for Android on M1 Macs with the following error:

    Execution failed for task ':flutter_locker:generateDebugProto'.
    > Could not resolve all files for configuration ':flutter_locker:protobufToolsLocator_protoc'.
       > Could not find protoc-3.9.1-osx-aarch_64.exe (com.google.protobuf:protoc:3.9.1).
         Searched in the following locations:
             [https://jcenter.bintray.com/com/google/protobuf/protoc/3.9.1/protoc-3.9.1-osx-aarch_64.exe]()
    

    After some googling, the issue is that there are no binaries for M1 Macs, there are however x86 compatible binaries, this github issue explains how to make protobuf select the appropriate binary, I did it locally and it worked successfully.

    opened by euriasb 9
  • Flutter 3: property 'destDir' is missing an input or output annotation

    Flutter 3: property 'destDir' is missing an input or output annotation

    Can't build Android version on Flutter 3

    
    * What went wrong:
    Some problems were found with the configuration of task ':flutter_locker:extractDebugProto' (type 'ProtobufExtract').
      - In plugin 'com.google.protobuf' type 'com.google.protobuf.gradle.ProtobufExtract' property 'destDir' is missing an input or output annotation.
    
        Reason: A property without annotation isn't considered during up-to-date checking.
    
        Possible solutions:
          1. Add an input or output annotation.
          2. Mark it as @Internal.
    
        Please refer to https://docs.gradle.org/7.4.2/userguide/validation_problems.html#missing_annotation for more details about this problem.
      - In plugin 'com.google.protobuf' type 'com.google.protobuf.gradle.ProtobufExtract' property 'isTest' is missing an input or output annotation.
    
        Reason: A property without annotation isn't considered during up-to-date checking.
    
        Possible solutions:
          1. Add an input or output annotation.
          2. Mark it as @Internal.
    
        Please refer to https://docs.gradle.org/7.4.2/userguide/validation_problems.html#missing_annotation for more details about this problem.
    
    
    opened by tudor07 3
  •  E/FingerprintDialogFrag(14973): Failed to dismiss fingerprint dialog fragment. Fragment manager was null.

    E/FingerprintDialogFrag(14973): Failed to dismiss fingerprint dialog fragment. Fragment manager was null.

    Hi

    This is another pre-9 Android error, this one is generated on closing fingerprint dialog.

    Just run plugin example on any android version < 9, f.e. 8.1

    E/FingerprintDialogFrag(14973): Failed to dismiss fingerprint dialog fragment. Fragment manager was null.

    opened by petro-i 3
  • failed to build module 'System'; this SDK is not supported by the compiler - Xcode

    failed to build module 'System'; this SDK is not supported by the compiler - Xcode

    Getting this error:

    /ios/Pods/Locker/Sources/Locker/Helpers/LockerHelpers.swift:11:8: error: failed to build module 'System'; this SDK is not supported by the compiler (the SDK is built with 'Apple Swift version 5.5.2 (swiftlang-1300.0.46.202 clang-1300.0.29.30)', while this compiler is 'Apple Swift version 5.5.2 (swiftlang-1300.0.47.5 clang-1300.0.29.30)'). Please select a toolchain which matches the SDK. import System ^ remark: Incremental compilation has been disabled: it is not compatible with whole module optimization Command CompileSwiftSources failed with a nonzero exit code note: Using new build system note: Planning note: Build preparation complete note: Building targets in dependency order

    Environment flutter_locker version 2.0.3 XCode version 13.2.1 Apple Swift version 5.5.2 Flutter Channel stable, 2.8.1, on macOS 12.0.1

    opened by batkholboo 2
  • cast to Fragment Activity

    cast to Fragment Activity

    in my project , run

    FlutterLocker.save(SaveSecretRequest("passCode", "passCodeSecret", AndroidPrompt("Authenticate", "Cancel")));

    but get exception under error

    Unhandled Exception: PlatformException(error, com.bibtel.MainActivity cannot be cast to androidx.fragment.app.FragmentActivity, null, java.lang.ClassCastException: com.bibtel.MainActivity cannot be cast to androidx.fragment.app.FragmentActivity

    how fix it.

    me noob in the flutter.

    opened by alishe79 2
  • M1 mac support

    M1 mac support

    There are a lot of changes here. The example was producing errors since it was using v1 Android embedding. I recreated the example project to fix the errors (deleted the example/android and example/ios folders and re-run flutter create).

    The only changes relevant to M1 support are in android/build.gradle.

    opened by zenled 1
  • Error handling

    Error handling

    I've been trying for a while to check for which exception the user gets (as in he cancelled the auth, doesn't have biometrics, etc) but I can't see anywhere if there are ways to compare which exception has been catched (such as LockerException: Authentication canceled by user. or PlatformException(3, co.infinum.goldfinger.NoEnrolledFingerprintException: User has no enrolled fingerprint., null, null). Is there an easier way to do this other than comparing strings and checking what word it has?

    And on the subject of it, shouldn't a popup open to configure fingerprints if there aren't any configured in the android?

    Thanks in advance

    opened by guilo8914 1
  • iOS plugin fails to build after Locker iOS library update to v3

    iOS plugin fails to build after Locker iOS library update to v3

    Error:

    SwiftFlutterLockerPlugin.swift:61:23: error: initializer for conditional binding must have Optional type, not 'String'
                        guard let secret = secret else {
    

    This is because after Locker was migrated to swift in v3.0, the retrieveCurrentSecret success callback is now not optional source.

    opened by euriasb 1
  • Support null safety

    Support null safety

    Hey :) I was wondering whether you have plans to release a version of your package supporting the new null safety feature of dart.

    Thanks in advance for your reply!

    opened by Giuspepe 1
  • LockerException and LockerExceptionReason are not exported

    LockerException and LockerExceptionReason are not exported

    There is no way to import those symbols and check on the reason for a failed retrieve.

    (Also documentation to FlutterLockerException when it should be LockerException)

    opened by poitch 1
  • Touch ID and Face ID locked

    Touch ID and Face ID locked

    When using Touch ID, after 3 wrong attempts the prompt is closed and a LockerException with the authenticationFailed reason is thrown. After 2 wrong attempts more, Touch ID will be locked for all apps (it may be unlocked using PIN). After that, every time I call FlutterLocker.retrieve, an exception with the authenticationFailed reason is thrown - it's ok, but now my question is how I can differentiate between those two cases. It must be possible in some way, as there are apps that are showing a dialog with a message that Touch ID is locked and cannot be used right now.

    With Face ID it behaves similarly, but in the first case an exception with the authenticationCanceled reason is thrown.

    opened by barteksc 0
  • Error on Android < 9 - Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>: java.lang.NoClassDefFoundError:

    Error on Android < 9 - Rejecting re-init on previously-failed class java.lang.Class: java.lang.NoClassDefFoundError:

    There is error reported to log running app using plugin, including plugin example itself, on Android version less than 9.

    Just run plugin example on any android version < 9, f.e. 8.1

    Could you please have a look?

    Click to expand error output `I/zygote (14541): Rejecting re-init on previously-failed class java.lang.Class: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener; I/zygote (14541): at void androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener) (ViewCompat.java:2421) I/zygote (14541): at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:779) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:659) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:552) I/zygote (14541): at void androidx.appcompat.app.AppCompatDialog.setContentView(int) (AppCompatDialog.java:95) I/zygote (14541): at void androidx.appcompat.app.AlertController.installContent() (AlertController.java:232) I/zygote (14541): at void androidx.appcompat.app.AlertDialog.onCreate(android.os.Bundle) (AlertDialog.java:279) I/zygote (14541): at void android.app.Dialog.dispatchOnCreate(android.os.Bundle) (Dialog.java:403) I/zygote (14541): at void android.app.Dialog.show() (Dialog.java:302) I/zygote (14541): at void androidx.fragment.app.DialogFragment.onStart() (DialogFragment.java:486) I/zygote (14541): at void androidx.fragment.app.Fragment.performStart() (Fragment.java:2632) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(androidx.fragment.app.Fragment, int, int, int, boolean) (FragmentManagerImpl.java:915) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(androidx.fragment.app.Fragment) (FragmentManagerImpl.java:1238) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(int, boolean) (FragmentManagerImpl.java:1303) I/zygote (14541): at void androidx.fragment.app.BackStackRecord.executeOps() (BackStackRecord.java:439) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOps(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:2079) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:1869) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(java.util.ArrayList, java.util.ArrayList) (FragmentManagerImpl.java:1824) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.execPendingActions() (FragmentManagerImpl.java:1727) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.executePendingTransactions() (FragmentManagerImpl.java:183) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticateInternal(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:793) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticate(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:648) I/zygote (14541): at void co.infinum.goldfinger.GoldfingerImpl$3.run() (GoldfingerImpl.java:228) I/zygote (14541): at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:790) I/zygote (14541): at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) I/zygote (14541): at void android.os.Looper.loop() (Looper.java:164) I/zygote (14541): at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494) I/zygote (14541): at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) I/zygote (14541): at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438) I/zygote (14541): at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807) I/zygote (14541): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/lib/x86, /data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/base.apk!/lib/x86, /system/lib, /vendor/lib]] I/zygote (14541): at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125) I/zygote (14541): at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) I/zygote (14541): at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) I/zygote (14541): at void androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener) (ViewCompat.java:2421) I/zygote (14541): at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:779) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:659) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:552) I/zygote (14541): at void androidx.appcompat.app.AppCompatDialog.setContentView(int) (AppCompatDialog.java:95) I/zygote (14541): at void androidx.appcompat.app.AlertController.installContent() (AlertController.java:232) I/zygote (14541): at void androidx.appcompat.app.AlertDialog.onCreate(android.os.Bundle) (AlertDialog.java:279) I/zygote (14541): at void android.app.Dialog.dispatchOnCreate(android.os.Bundle) (Dialog.java:403) I/zygote (14541): at void android.app.Dialog.show() (Dialog.java:302) I/zygote (14541): at void androidx.fragment.app.DialogFragment.onStart() (DialogFragment.java:486) I/zygote (14541): at void androidx.fragment.app.Fragment.performStart() (Fragment.java:2632) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(androidx.fragment.app.Fragment, int, int, int, boolean) (FragmentManagerImpl.java:915) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(androidx.fragment.app.Fragment) (FragmentManagerImpl.java:1238) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(int, boolean) (FragmentManagerImpl.java:1303) I/zygote (14541): at void androidx.fragment.app.BackStackRecord.executeOps() (BackStackRecord.java:439) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOps(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:2079) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:1869) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(java.util.ArrayList, java.util.ArrayList) (FragmentManagerImpl.java:1824) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.execPendingActions() (FragmentManagerImpl.java:1727) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.executePendingTransactions() (FragmentManagerImpl.java:183) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticateInternal(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:793) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticate(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:648) I/zygote (14541): at void co.infinum.goldfinger.GoldfingerImpl$3.run() (GoldfingerImpl.java:228) I/zygote (14541): at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:790) I/zygote (14541): at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) I/zygote (14541): at void android.os.Looper.loop() (Looper.java:164) I/zygote (14541): at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494) I/zygote (14541): at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) I/zygote (14541): at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438) I/zygote (14541): at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807) I/zygote (14541): I/zygote (14541): Rejecting re-init on previously-failed class java.lang.Class: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener; I/zygote (14541): at void androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener) (ViewCompat.java:2421) I/zygote (14541): at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:779) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:659) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:552) I/zygote (14541): at void androidx.appcompat.app.AppCompatDialog.setContentView(int) (AppCompatDialog.java:95) I/zygote (14541): at void androidx.appcompat.app.AlertController.installContent() (AlertController.java:232) I/zygote (14541): at void androidx.appcompat.app.AlertDialog.onCreate(android.os.Bundle) (AlertDialog.java:279) I/zygote (14541): at void android.app.Dialog.dispatchOnCreate(android.os.Bundle) (Dialog.java:403) I/zygote (14541): at void android.app.Dialog.show() (Dialog.java:302) I/zygote (14541): at void androidx.fragment.app.DialogFragment.onStart() (DialogFragment.java:486) I/zygote (14541): at void androidx.fragment.app.Fragment.performStart() (Fragment.java:2632) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(androidx.fragment.app.Fragment, int, int, int, boolean) (FragmentManagerImpl.java:915) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(androidx.fragment.app.Fragment) (FragmentManagerImpl.java:1238) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(int, boolean) (FragmentManagerImpl.java:1303) I/zygote (14541): at void androidx.fragment.app.BackStackRecord.executeOps() (BackStackRecord.java:439) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOps(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:2079) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:1869) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(java.util.ArrayList, java.util.ArrayList) (FragmentManagerImpl.java:1824) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.execPendingActions() (FragmentManagerImpl.java:1727) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.executePendingTransactions() (FragmentManagerImpl.java:183) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticateInternal(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:793) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticate(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:648) I/zygote (14541): at void co.infinum.goldfinger.GoldfingerImpl$3.run() (GoldfingerImpl.java:228) I/zygote (14541): at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:790) I/zygote (14541): at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) I/zygote (14541): at void android.os.Looper.loop() (Looper.java:164) I/zygote (14541): at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494) I/zygote (14541): at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) I/zygote (14541): at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438) I/zygote (14541): at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807) I/zygote (14541): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/lib/x86, /data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/base.apk!/lib/x86, /system/lib, /vendor/lib]] I/zygote (14541): at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125) I/zygote (14541): at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) I/zygote (14541): at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) I/zygote (14541): at void androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener) (ViewCompat.java:2421) I/zygote (14541): at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:779) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:659) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:552) I/zygote (14541): at void androidx.appcompat.app.AppCompatDialog.setContentView(int) (AppCompatDialog.java:95) I/zygote (14541): at void androidx.appcompat.app.AlertController.installContent() (AlertController.java:232) I/zygote (14541): at void androidx.appcompat.app.AlertDialog.onCreate(android.os.Bundle) (AlertDialog.java:279) I/zygote (14541): at void android.app.Dialog.dispatchOnCreate(android.os.Bundle) (Dialog.java:403) I/zygote (14541): at void android.app.Dialog.show() (Dialog.java:302) I/zygote (14541): at void androidx.fragment.app.DialogFragment.onStart() (DialogFragment.java:486) I/zygote (14541): at void androidx.fragment.app.Fragment.performStart() (Fragment.java:2632) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(androidx.fragment.app.Fragment, int, int, int, boolean) (FragmentManagerImpl.java:915) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(androidx.fragment.app.Fragment) (FragmentManagerImpl.java:1238) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(int, boolean) (FragmentManagerImpl.java:1303) I/zygote (14541): at void androidx.fragment.app.BackStackRecord.executeOps() (BackStackRecord.java:439) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOps(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:2079) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:1869) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(java.util.ArrayList, java.util.ArrayList) (FragmentManagerImpl.java:1824) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.execPendingActions() (FragmentManagerImpl.java:1727) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.executePendingTransactions() (FragmentManagerImpl.java:183) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticateInternal(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:793) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticate(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:648) I/zygote (14541): at void co.infinum.goldfinger.GoldfingerImpl$3.run() (GoldfingerImpl.java:228) I/zygote (14541): at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:790) I/zygote (14541): at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) I/zygote (14541): at void android.os.Looper.loop() (Looper.java:164) I/zygote (14541): at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494) I/zygote (14541): at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) I/zygote (14541): at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438) I/zygote (14541): at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807) I/zygote (14541): I/zygote (14541): Rejecting re-init on previously-failed class java.lang.Class: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener; I/zygote (14541): at void androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener) (ViewCompat.java:2421) I/zygote (14541): at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:779) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:659) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:552) I/zygote (14541): at void androidx.appcompat.app.AppCompatDialog.setContentView(int) (AppCompatDialog.java:95) I/zygote (14541): at void androidx.appcompat.app.AlertController.installContent() (AlertController.java:232) I/zygote (14541): at void androidx.appcompat.app.AlertDialog.onCreate(android.os.Bundle) (AlertDialog.java:279) I/zygote (14541): at void android.app.Dialog.dispatchOnCreate(android.os.Bundle) (Dialog.java:403) I/zygote (14541): at void android.app.Dialog.show() (Dialog.java:302) I/zygote (14541): at void androidx.fragment.app.DialogFragment.onStart() (DialogFragment.java:486) I/zygote (14541): at void androidx.fragment.app.Fragment.performStart() (Fragment.java:2632) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(androidx.fragment.app.Fragment, int, int, int, boolean) (FragmentManagerImpl.java:915) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(androidx.fragment.app.Fragment) (FragmentManagerImpl.java:1238) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(int, boolean) (FragmentManagerImpl.java:1303) I/zygote (14541): at void androidx.fragment.app.BackStackRecord.executeOps() (BackStackRecord.java:439) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOps(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:2079) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:1869) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(java.util.ArrayList, java.util.ArrayList) (FragmentManagerImpl.java:1824) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.execPendingActions() (FragmentManagerImpl.java:1727) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.executePendingTransactions() (FragmentManagerImpl.java:183) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticateInternal(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:793) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticate(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:648) I/zygote (14541): at void co.infinum.goldfinger.GoldfingerImpl$3.run() (GoldfingerImpl.java:228) I/zygote (14541): at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:790) I/zygote (14541): at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) I/zygote (14541): at void android.os.Looper.loop() (Looper.java:164) I/zygote (14541): at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494) I/zygote (14541): at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) I/zygote (14541): at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438) I/zygote (14541): at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807) I/zygote (14541): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/lib/x86, /data/app/com.example.flutter_locker_example-aN0cfjmoIpx7akkDLyfw5g==/base.apk!/lib/x86, /system/lib, /vendor/lib]] I/zygote (14541): at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:125) I/zygote (14541): at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) I/zygote (14541): at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) I/zygote (14541): at void androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener) (ViewCompat.java:2421) I/zygote (14541): at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:779) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:659) I/zygote (14541): at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:552) I/zygote (14541): at void androidx.appcompat.app.AppCompatDialog.setContentView(int) (AppCompatDialog.java:95) I/zygote (14541): at void androidx.appcompat.app.AlertController.installContent() (AlertController.java:232) I/zygote (14541): at void androidx.appcompat.app.AlertDialog.onCreate(android.os.Bundle) (AlertDialog.java:279) I/zygote (14541): at void android.app.Dialog.dispatchOnCreate(android.os.Bundle) (Dialog.java:403) I/zygote (14541): at void android.app.Dialog.show() (Dialog.java:302) I/zygote (14541): at void androidx.fragment.app.DialogFragment.onStart() (DialogFragment.java:486) I/zygote (14541): at void androidx.fragment.app.Fragment.performStart() (Fragment.java:2632) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(androidx.fragment.app.Fragment, int, int, int, boolean) (FragmentManagerImpl.java:915) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(androidx.fragment.app.Fragment) (FragmentManagerImpl.java:1238) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.moveToState(int, boolean) (FragmentManagerImpl.java:1303) I/zygote (14541): at void androidx.fragment.app.BackStackRecord.executeOps() (BackStackRecord.java:439) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOps(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:2079) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:1869) I/zygote (14541): at void androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(java.util.ArrayList, java.util.ArrayList) (FragmentManagerImpl.java:1824) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.execPendingActions() (FragmentManagerImpl.java:1727) I/zygote (14541): at boolean androidx.fragment.app.FragmentManagerImpl.executePendingTransactions() (FragmentManagerImpl.java:183) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticateInternal(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:793) I/zygote (14541): at void androidx.biometric.BiometricPrompt.authenticate(androidx.biometric.BiometricPrompt$PromptInfo, androidx.biometric.BiometricPrompt$CryptoObject) (BiometricPrompt.java:648) I/zygote (14541): at void co.infinum.goldfinger.GoldfingerImpl$3.run() (GoldfingerImpl.java:228) I/zygote (14541): at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:790) I/zygote (14541): at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:99) I/zygote (14541): at void android.os.Looper.loop() (Looper.java:164) I/zygote (14541): at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6494) I/zygote (14541): at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) I/zygote (14541): at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:438) I/zygote (14541): at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:807)`
    opened by petro-i 2
  • How to identify biometric type installed on device?

    How to identify biometric type installed on device?

    Hi, Thank you for this very useful plugin!!!

    There is one feature missing, as for me, to identify the biometric type, for sure it is needed for iOS only (at this moment). Use case of this feature - to show user appropriate text in settings to enable Touch/Face ID.

    Could you please try to implement such functionality?

    enhancement 
    opened by petro-i 1
Releases(v1.0.1)
Owner
Infinum
We're an independent design & development agency of 350 people, creating beautiful software for 16 years.
Infinum
Flutterbiometric - A sample app showing how to implement biometric authentication in flutter

Flutter Tutorial - Fingerprint & Touch ID - Local Auth By using Flutter Local Au

null 0 Jan 1, 2022
Face Mask Detection mobile application built with Flutter and TensorFlow lite in order to detect face masks using images and live camera.

Face Mask Detector App Face Mask Detection mobile application built with Flutter and TensorFlow lite in order to detect face masks using images and li

Yousef Shaban 3 Aug 15, 2022
Face Mask Detection with Tensorflow(Flutter)Face Mask Detection with Tensorflow(Flutter)

Face Mask Detection with Tensorflow(Flutter) Face Mask Detection With TFlite Info An app made with flutter and tensor flow lite for face mask detectio

Mohsen Mirdar 1 May 23, 2022
A group of overlapping round avatars are called face piles, a face pile is a series of overlapping avatar images that come and go as users join and leave a given group.

Flutter Face Pile A group of overlapping round avatars are called face piles. A face pile is a series of overlapping avatar images that come and go as

Amine Chamkh 3 Sep 22, 2022
Simple face recognition authentication (Sign up + Sign in) written in Flutter using Tensorflow Lite and Firebase ML vision library.

FaceNetAuthentication Simple face recognition authentication (Sign up + Sign in) written in Flutter using Tensorflow Lite and Google ML Kit library. S

Marcos Carlomagno 279 Jan 9, 2023
This app can solve your problem! Play with fluids with a touch of your fingers

Feel bored or anxious? This app can solve your problem! Play with fluids with a touch of your fingers. Play and experiment with these swirling substances. Gorgeous visuals will take your breath away and help you to relieve stress.

Naser 17 Dec 30, 2022
ESP-Touch Dart API for Flutter. Platform-specific implementation for Android (Java) and iOS (Objective-C).

esptouch_flutter Flutter plugin for ESP-Touch to configure network for ESP-8266 and ESP-32 devices. Runs on iOS and Android. esptouch_flutter is Flutt

SMAHO Engineering OSS 86 Dec 10, 2022
Alarm app where user setting with touch gesture by moving the hand clock

Alarm App Using Flutter Flutter alarm app where user setting with touch gesture by moving the hand clock How to run Clone this repository Run flutter

null 3 Sep 3, 2022
Parallax - A parallax package for touch-based devices, providing a visually appealing user experience

Parallax A parallax package for touch-based devices, providing a visually appeal

MEDAFOX 4 Sep 28, 2022
Drag and Drop for Dart web apps with mouse and touch support.

Dart Drag and Drop Drag and Drop for Dart web apps with mouse and touch support. GitHub | Pub | Demos and Examples Features Use any HTML Element as Dr

Marco Jakob 136 Nov 18, 2022
A simple project demonstrating how to build a face filter app using Flutter and Deep AR

flutter_deepar This is a simple project that will help you learn how to build a simple face filter app with Flutter and Deep AR You can read an articl

Promise Amadi 32 Jan 1, 2023
Aditya 93 Dec 25, 2022
Mask Aware Face Attendance App built using Flutter

Face Attendance An App Made with Face SDK record.mp4 Before we get started ?? For now, Our app does support only Android platform (arm64). ?? You will

FaceOnLive 113 Dec 30, 2022
A Flutter clock face with moving bars

BarBar Clock | Web demo ?? Listed in Honorable Mentions at flutter.dev/clock ?? Clock face for the Flutter Clock Challenge. This clock face shows time

Alexander Troshkov 19 Jun 29, 2022
This is my entry for the Flutter Clock Face Contest.

Star Clock This is my entry for the Flutter Clock Face Contest. Build instructions below. TLRD: Clone with --recurse-submodules Here's a small demo vi

Philipp Bauer 47 Oct 22, 2022
Face detection app built with Flutter and Firebase ML Kit

Flutter Face Detection Flutter Face Detection with Firebase ML Kit and CustomPainter. Read the article on Medium Made with ?? by Akora-IngDKB. Follow

Akora Ing. Debrah Kwesi Buabeng 44 Sep 29, 2022
SimplyTimeClock - Clock face with a minimalistic interface made with Flutter.

Simply Time Clock Overview Description Simply Time Clock is a Clockface for the Lenovo Smart Clock using Flutter. Made during the Flutter Clock Challe

Ralph Placide 0 Dec 30, 2019
Gradi clock - Gradi Clock face for Flutter Clock challenge

Gradi Clock Clock face made for Flutter Clock challenge. About There is an abundant body of research that suggests that people are sensory creatures w

Janko Djuric 4 Sep 29, 2021
Simple alarm app - An alarm with analog clock face and digital indicator in the center for flutter

simple_alarm_app A new Flutter project. Getting Started It's an alarm with analo

null 1 Mar 14, 2022