Coder Social home page Coder Social logo

smstuebe / xamarin-fingerprint Goto Github PK

View Code? Open in Web Editor NEW
492.0 31.0 117.0 7.02 MB

Xamarin and MvvMCross plugin for authenticate a user via fingerprint sensor

License: Microsoft Public License

C# 89.76% Batchfile 0.35% PowerShell 9.89%
xamarin xamarin-plugin

xamarin-fingerprint's Introduction

Biometric / Fingerprint plugin for Xamarin

Xamarin and MvvMCross plugin for accessing the fingerprint, Face ID or other biometric sensors.

Type Stable Pre release
vanilla NuGet NuGet
MvvmCross NuGet NuGet

Changelog

Support

If you like the quality and code you can support me

  • Donate

Thanks!

The plugin supports the listed platforms.

Platform Version
Xamarin.Android 6.0
Xamarin.iOS 8.0
Xamarin.Mac 10.12
Windows UWP 10

Setup

iOS

Add NSFaceIDUsageDescription to your Info.plist to describe the reason your app uses Face ID. (see Documentation). Otherwise the App will crash when you start a Face ID authentication on iOS 11.3+.

<key>NSFaceIDUsageDescription</key>
<string>Need your face to unlock secrets!</string>

Android

Set Target SDK version

The target SDK version has to be >= 6.0. I recomment to use always the latest stable SDK version, if possible. You can set the target SDK version in your Android project properties.

Install Android X Migration

Since version 2, this plugin uses Android X. You have to install Xamarin.AndroidX.Migration in your Android project.

Request the permission in AndroidManifest.xml

<uses-permission android:name="android.permission.USE_FINGERPRINT" />

Set the resolver of the current Activity

Skip this, if you use the MvvMCross Plugin or don't use the dialog.

We need the current activity to display the dialog. You can use the Current Activity Plugin from James Montemagno or implement your own functionality to retrieve the current activity. See Sample App for details.

CrossFingerprint.SetCurrentActivityResolver(() => CrossCurrentActivity.Current.Activity);

Usage

Example

vanilla

var request = new AuthenticationRequestConfiguration ("Prove you have fingers!", "Because without it you can't have access");
var result = await CrossFingerprint.Current.AuthenticateAsync(request);
if (result.Authenticated)
{
    // do secret stuff :)
}
else
{
    // not allowed to do secret stuff :(
}

using MvvMCross

var fpService = Mvx.Resolve<IFingerprint>(); // or use dependency injection and inject IFingerprint

var request = new AuthenticationRequestConfiguration ("Prove you have mvx fingers!", "Because without it you can't have access");
var result = await fpService.AuthenticateAsync(request);
if (result.Authenticated)
{
    // do secret stuff :)
}
else
{
    // not allowed to do secret stuff :(
}

mocking in unit tests

//Create mock with LigthMock (http://www.lightinject.net/)
var mockFingerprintContext = new MockContext<IFingerprint>();
var mockFingerprint = new CrossFingerprintMock(mockFingerprintContext);

mockFingerprintContext.Current = mockFingerprint;

Detailed Tutorial by @jfversluis

Youtube: Secure Your Xamarin App with Fingerprint or Face Recognition (click thumbnail)

Secure Your Xamarin App with Fingerprint or Face Recognition

API

The API is defined by the IFingerprint interface:

/// <summary>
/// Checks the availability of fingerprint authentication.
/// Checks are performed in this order:
/// 1. API supports accessing the fingerprint sensor
/// 2. Permission for accessint the fingerprint sensor granted
/// 3. Device has sensor
/// 4. Fingerprint has been enrolled
/// <see cref="FingerprintAvailability.Unknown"/> will be returned if the check failed
/// with some other platform specific reason.
/// </summary>
/// <param name="allowAlternativeAuthentication">
/// En-/Disables the use of the PIN / Passwort as fallback.
/// Supported Platforms: iOS, Mac
/// Default: false
/// </param>
Task<FingerprintAvailability> GetAvailabilityAsync(bool allowAlternativeAuthentication = false);

/// <summary>
/// Checks if <see cref="GetAvailabilityAsync"/> returns <see cref="FingerprintAvailability.Available"/>.
/// </summary>
/// <param name="allowAlternativeAuthentication">
/// En-/Disables the use of the PIN / Passwort as fallback.
/// Supported Platforms: iOS, Mac
/// Default: false
/// </param>
/// <returns><c>true</c> if Available, else <c>false</c></returns>
Task<bool> IsAvailableAsync(bool allowAlternativeAuthentication = false);

/// <summary>
/// Requests the authentication.
/// </summary>
/// <param name="reason">Reason for the fingerprint authentication request. Displayed to the user.</param>
/// <param name="cancellationToken">Token used to cancel the operation.</param>
/// <returns>Authentication result</returns>
Task<FingerprintAuthenticationResult> AuthenticateAsync(string reason, CancellationToken cancellationToken = default(CancellationToken));

/// <summary>
/// Requests the authentication.
/// </summary>
/// <param name="authRequestConfig">Configuration of the dialog that is displayed to the user.</param>
/// <param name="cancellationToken">Token used to cancel the operation.</param>
/// <returns>Authentication result</returns>
Task<FingerprintAuthenticationResult> AuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = default(CancellationToken));

The returned FingerprintAuthenticationResult contains information about the authentication.

/// <summary>
/// Indicatates whether the authentication was successful or not.
/// </summary>
public bool Authenticated { get { return Status == FingerprintAuthenticationResultStatus.Succeeded; } }

/// <summary>
/// Detailed information of the authentication.
/// </summary>
public FingerprintAuthenticationResultStatus Status { get; set; }

/// <summary>
/// Reason for the unsucessful authentication.
/// </summary>
public string ErrorMessage { get; set; }

iOS

Limitations

You can't create a custom dialog. The standard iOS Dialog will be shown.

iOS 9+ only
  • cancelable programmatically with passed CancellationToken
  • custom fallback button title
iOS 10+ only
  • custom cancel button title

UWP

Limitations

You can't use the alternative authentication method.

Testing on Simulators

iOS

Controlling the sensor on the iOS Simulator

With the Hardware menu you can

  • Toggle the enrollment status
  • Trigger valid ( M) and invalid ( N) fingerprint sensor events

Android

  • start the emulator (Android >= 6.0)
  • open the settings app
  • go to Security > Fingerprint, then follow the enrollment instructions
  • when it asks for touch
  • open command prompt
  • telnet 127.0.0.1 <emulator-id> (adb devices prints "emulator-<emulator-id>")
  • finger touch 1
  • finger touch 1

Sending fingerprint sensor events for testing the plugin can be done with the telnet commands, too.

Note for Windows users: You have to enable telnet: Programs and Features > Add Windows Feature > Telnet Client

Nice to know

Android code shrinker (Proguard & r8)

If you use the plugin with Link all, Release Mode and ProGuard/r8 enabled, you may have to do the following:

  1. Create a proguard.cfg file in your android project and add the following:
    -dontwarn com.samsung.**
    -keep class com.samsung.** {*;}
  1. Include it to your project
  2. Properties > Build Action > ProguardConfiguration

Contribution

+

xamarin-fingerprint's People

Contributors

artjomp avatar azure-pipelines[bot] avatar fedemkr avatar haavamoa avatar kevinvdburg avatar kspearrin avatar martijn00 avatar nedlinin avatar nielscup avatar seuleuzeuh avatar smstuebe avatar thomascork avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xamarin-fingerprint's Issues

sdfsdff

d

Steps to reproduce

Expected behavior

Tell us what should happen

Actual behavior

Tell us what happens instead

Default setup uses white fragment with white fingerprint icon

When I create a default setup using a light theme, the baked in fragment shows a white background with a white fingerprint icon. I'd like the ability to tint the icon to a different color if possible.

I know we can create a custom Fragment, but I'm not sure how that works within your plugin. I'd like to keep everything else exactly as it is (white background, black text), but simply color the icon something different so that it is visible.

Steps to reproduce

  1. Follow initial setup and use the following theme in your android app ``Theme.AppCompat.Light.NoActionBar

  2. Test

Expected behavior

Fingerprint image should be visible on the dialog fragment

Actual behavior

Fingerprint image is the same color as the background (white).

Configuration

Version of the Plugin: 1.4.2

Platform: Android 7.1

Device: Google Pixel XL

Xamarin fingerprint plugin issue

Version of the Plugin: 1.3.0.0
Visual Studio 2013

The plugin Reference seems to be missing. When I compile I get this error:

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3274: The primary reference "Plugin.Fingerprint, Version=1.3.0.0, Culture=neutral, processorArchitecture=MSIL" could not be resolved because it was built against the ".NETPortable,Version=v5.0" framework. This is a higher version than the currently targeted framework ".NETPortable,Version=v4.5,Profile=Profile78".

Have you seen this error and is there a resolution?

Report why IsAvailable = false (Android)

The plugin is working fine on my Android 6.0 emulators but when running on my 6.0 real device the IsAvailable flag is false. The sample app also reports false on my phone and true on the emulators.
Fingerprint authentication is set up and is used on the lock screen of the real device.
Is there a way to diagnose and report why?

Disappoint the bot

Steps to reproduce

  1. Delete issue template to make checker mad

Expected behavior

He complains

FingerPrint Plugin works in sample app but not in a PCL Marshmellow - FormsAppCompatActivity

Recently we were trying to implement app level fingerprint authentication through PCL. We used Plugin.Fingerprint nuget package and referenced it. The sample which was downloaded from the Git works but once we implement it with our PCL it just returns 'false' where it detects the fingerprint sensor when its available and works with sample application.

While comparing the two projects we found that there is one change in the Android Project’s MainActivity Our Project: public class MainActivity : FormsAppCompatActivity {

Working Sample App: xamarin-fingerprint-master

public class MainActivity : FormsApplicationActivity {

When I do this code change in my application code, the 'object reference not found error' is displayed during load application operation. What is the difference between these code and how should we handle it to make fingerprint sensor work through our mobile app. Is this the problem or whether there is something else we are missing here ?

It will be a great help is you could help us on this. If you have a different sample using another plugin, it would also help us greatly. All we need is to implement this mostly through PCL.

MvvmCross.Platform.Exceptions.MvxException: could not load plugin assembly for type MvvmCross.Plugins.Fingerprint.Android.PluginLoader

[mono] Unhandled Exception:
[mono] MvvmCross.Platform.Exceptions.MvxException: could not load plugin assembly for type MvvmCross.Plugins.Fingerprint.Android.PluginLoader
[mono] at MvvmCross.Platform.Plugins.MvxFilePluginManager.LoadAssembly (System.Type toLoad) [0x00071] in D:\git\MvvmCross\MvvmCross\Platform\Platform\Plugins\MvxFilePluginManager.cs:76
[mono] at MvvmCross.Platform.Plugins.MvxFilePluginManager.FindPlugin (System.Type toLoad) [0x00000] in D:\git\MvvmCross\MvvmCross\Platform\Platform\Plugins\MvxFilePluginManager.cs:39
[mono] at MvvmCross.Platform.Plugins.MvxPluginManager.LoadPlugin (System.Type toLoad) [0x00000] in D:\git\MvvmCross\MvvmCross\Platform\Platform\Plugins\MvxPluginManager.cs:150
[mono] at MvvmCross.Platform.Plugins.MvxPluginManager.ExceptionWrappedLoadPlugin (System.Type toLoad) [0x00000] in D:\git\MvvmCross\MvvmCross\Platform\Platform\Plugins\MvxPluginManager.cs:122

I've followed the instructions, but I get this error while starting the app. Then it crashes. Any ideas ? I'm using the latest beta

Fingerprint grace period? Doesn't require user to enter

Hi, i have been using your fingerprint plugin, and it has been great so far, however one thing i noticed is that it doesn't ask me for my fingerprint on an device, but it does on a simulator. Let me explain the issue:

On my application i give the user the ability to turn on fingerprint login in the settings, this works fine, the dialog appears and they enable fingerprint login.
I then go to logout of the application, so that the user is prompted to login again, and the fingerprint login dialog should appear, on the simulator it does appear, and on the device it does not appear.
The device treats it as authenticated... Almost like there is some time period after initially entering a fingerprint, for which a user will no longer have to enter it. If i completely close the app and then open it again, the dialog appears, so potentially it is still in memory.

I've tried to search for any documentation on this, but i'm unable to find it, mainly because i don't know specifically what i'm searching for. I'm sorry if im wasting your time

Thanks

Function AuthenticateAsync in FingerprintImplementationBase.cs

This function currently looks like this:

public async Task<FingerprintAuthenticationResult> AuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
        {
            if(await IsAvailableAsync())
                return new FingerprintAuthenticationResult { Status = FingerprintAuthenticationResultStatus.NotAvailable };
            return await NativeAuthenticateAsync(authRequestConfig, cancellationToken);
        }

Shouldn't it read like this:

public async Task<FingerprintAuthenticationResult> AuthenticateAsync(AuthenticationRequestConfiguration authRequestConfig, CancellationToken cancellationToken = new CancellationToken())
        {
            if(await IsAvailableAsync())
                return await NativeAuthenticateAsync(authRequestConfig, cancellationToken);
            return new FingerprintAuthenticationResult { Status = FingerprintAuthenticationResultStatus.NotAvailable };
        }

SamsungFingerprintImplementation returns wrong error after failed attempts

Steps to reproduce

  1. Start the sample app on a Samsung device
  2. Press AuthenticateLocalized
  3. Authenticate with your wrong finger until the authenticationdialog disappears: you get the TooManyAttempts message: this is correct
  4. Press AuthenticateLocalized again
  5. Authenticate with your wrong finger again until the authenticationdialog disappears: now you get the failed message: this is not expected because I cannot provide the user with any useful information based on this message.
  6. Press AuthenticateLocalized again
  7. the authenticationdialog disappears: now you get the UnknownError message: this is not expected because I cannot provide the user with any useful information based on this message.

Expected behavior

The same behaviour as a non Samsung device: always show the TooManyAttempts message while fingerprint is locked due to too many attempts.

Actual behavior

see reproduction steps

Crashlog

n/a

Configuration

Version of the Plugin: 1.4.2

Platform: Android 6.0.1

Device: e.g. Tested on Samsung Galaxy S7

onSaveInstanceState exeption

I'm seeing this on my Samsung S5 but it's difficult to reproduce.
After a successful result the dialog disappears as well as the app and then it crashes.
Tends to happen after an unsuccessful or canceled action but not always...

Android Unhandled exception: Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3819/c1d1c79c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x000a7] in /Users/builder/data/lanes/3819/c1d1c79c/source/Java.Interop/src/Java.Interop/Java.Interop/JniEnvironment.g.cs:12083
at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00068] in /Users/builder/data/lanes/3819/c1d1c79c/source/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:31
at Android.App.DialogFragment.Dismiss () [0x00000] in /Users/builder/data/lanes/3819/c1d1c79c/source/monodroid/src/Mono.Android/platforms/android-24/src/generated/Android.App.DialogFragment.cs:243
at Plugin.Fingerprint.Dialog.FingerprintDialogFragment+d__20.MoveNext () [0x00098] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:128
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3819/c1d1c79c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.m__0 (System.Object state) [0x00000] in /Users/builder/data/lanes/3819/c1d1c79c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018
at Android.App.SyncContext+c__AnonStorey0.<>m__0 () [0x00000] in /Users/builder/data/lanes/3819/c1d1c79c/source/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:18
at Java.Lang.Thread+RunnableImplementor.Run () [0x0000b] in /Users/builder/data/lanes/3819/c1d1c79c/source/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36
at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in /Users/builder/data/lanes/3819/c1d1c79c/source/monodroid/src/Mono.Android/platforms/android-24/src/generated/Java.Lang.IRunnable.cs:81
at (wrapper dynamic-method) System.Object:de2042cc-35ca-4fd5-b8c6-97b660a4057e (intptr,intptr)
--- End of managed Java.Lang.IllegalStateException stack trace ---

[mono-rt] [ERROR] FATAL UNHANDLED EXCEPTION: Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState
[mono-rt] --- End of managed Java.Lang.IllegalStateException stack trace ---
[mono-rt] java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
[mono-rt] at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1428)
[mono-rt] at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1446)
[mono-rt] at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687)
[mono-rt] at android.app.BackStackRecord.commit(BackStackRecord.java:663)
[mono-rt] at android.app.DialogFragment.dismissInternal(DialogFragment.java:301)
[mono-rt] at android.app.DialogFragment.dismiss(DialogFragment.java:267)
[mono-rt] at md54832021a7e88cfc4565df97a94342004.TaskAnimationListener.n_onAnimationEnd(Native Method)
[mono-rt] at md54832021a7e88cfc4565df97a94342004.TaskAnimationListener.onAnimationEnd(TaskAnimationListener.java:41)
[mono-rt] at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1239)
[mono-rt] at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:766)
[mono-rt] at android.animation.ValueAnimator$AnimationHandler$1.run(ValueAnimator.java:801)
[mono-rt] at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
[mono-rt] at android.view.Choreographer.doCallbacks(Choreographer.java:695)
[mono-rt] at android.view.Choreographer.doFrame(Choreographer.java:628)
[mono-rt] at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
[mono-rt] at android.os.Handler.handleCallback(Handler.java:739)
[mono-rt] at android.os.Handler.dispatchMessage(Handler.java:95)
[mono-rt] at android.os.Looper.loop(Looper.java:158)
[mono-rt] at android.app.ActivityThread.main(ActivityThread.java:7224)
[mono-rt] at java.lang.reflect.Method.invoke(Native Method)
[mono-rt] at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
[mono-rt] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
[mono-rt]

TooManyAttempts status issues

Seeing these after grabbing 1.3.0-beta5

  1. Android: On a simulator and real device, on the 3rd invalid attempt:

[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] System.ArgumentOutOfRangeException: Exception of type 'System.ArgumentOutOfRangeException' was thrown.
[MonoDroid] Parameter name: status
[MonoDroid] Actual value was TooManyAttempts.
[MonoDroid] at Plugin.Fingerprint.Dialog.FingerprintDialogFragment+d__28.MoveNext () [0x001a2] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:206

  1. iOS: On a 3rd invalid attempt it does not throw an exception but the status is FingerprintAuthenticationResultStatus.Failed , not FingerprintAuthenticationResultStatus.TooManyAttempts

Fingerprint plugin crashes on iOS 7: _Wrapper type 'LocalAuthentication.LAContext' is missing its native ObjectiveC class 'LAContext'._

Fingerprint plugin crashes on iOS 7: Wrapper type 'LocalAuthentication.LAContext' is missing its native ObjectiveC class 'LAContext'.

Steps to reproduce

  1. Start app using Fingerprint plugin 1.4.0 on iOS7

Expected behavior

App starts normally

Actual behavior

App crashes

Crashlog

Wrapper type 'LocalAuthentication.LAContext' is missing its native ObjectiveC class 'LAContext'.

at Registrar.DynamicRegistrar.OnRegisterType (Registrar.Registrar+ObjCType type) [0x00113] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/ObjCRuntime/DynamicRegistrar.cs:796
at Registrar.Registrar.RegisterTypeUnsafe (System.Type type, System.Collections.Generic.List1[System.Exception]& exceptions) [0x010b5] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/ObjCRuntime/Registrar.cs:1890 at Registrar.Registrar.RegisterType (System.Type type, System.Collections.Generic.List1[System.Exception]& exceptions) [0x00011] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/ObjCRuntime/Registrar.cs:1064
at Registrar.DynamicRegistrar.Register (System.Type type) [0x00002] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/ObjCRuntime/DynamicRegistrar.cs:1138
at ObjCRuntime.Class.Register (System.Type type) [0x00000] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/ObjCRuntime/Class.cs:161
at ObjCRuntime.Class.GetHandle (System.Type type) [0x00000] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/ObjCRuntime/Class.cs:129
at Plugin.Fingerprint.FingerprintImplementation.CreateLaContext () [0x00001] in <0ce2e501fec54f098d84537f3088c448>:0
at Plugin.Fingerprint.FingerprintImplementation..ctor () [0x00008] in <0ce2e501fec54f098d84537f3088c448>:0
at Plugin.Fingerprint.CrossFingerprint.CreateFingerprint () [0x00001] in <0ce2e501fec54f098d84537f3088c448>:0
at System.Lazy`1[T].CreateValue () [0x00075] in <15e850188d9f425bbeae90f0bbc51e17>:0
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.m__0 (System.Object state) [0x00000] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018
at UIKit.UIKitSynchronizationContext+c__AnonStorey0.<>m__0 () [0x00000] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/UIKit/UIKitSynchronizationContext.cs:24
at Foundation.NSAsyncActionDispatcher.Apply () [0x00000] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/Foundation/NSAction.cs:163
at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/UIKit/UIApplication.cs:79
at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/3969/7beaef43/source/xamarin-macios/src/UIKit/UIApplication.cs:63

Configuration

**Version of the Plugin: 1.4.0

**Platform: iOS7

**Device: any with iOS7

Plugin Not Supported in .NET cross platform Xamarin.Forms Portable Project

Steps to reproduce

  1. Install the Latest Version of Plugin.FingerPrint 1.4.2 (Problem exists from 1.3.0) into Xamarin.Forms Portable Project.

  2. Refer Plugin.Fingerprint.Abstractions in a class and Compile.

  3. Build fails and Says that "The primary reference "Plugin.Fingerprint.Abstractions, Version=1.4.2.0, Culture=neutral, processorArchitecture=MSIL" could not be resolved because it was built against the ".NETPortable,Version=v5.0" framework. This is a higher version than the currently targeted framework ".NETPortable,Version=v4.5,Profile=Profile259"

Expected behavior

It should compile successfully.

Actual behavior

Exception pasted in the 3rd Step. Verified the source code and it's targeted to .NET Portable Version only. But Plugin.FingerPrint is targeted to .NETStandard 1.0.

Crashlog

Not There Yet.

Android: Don't show dialog while TooManyAttempts error is active

Steps to reproduce

Using the SMS.Fingerprint.Sample.Droid app with MyCustomDialogFragment on a Samsung device

  1. Start app
  2. Press AuthenticateLocalized
  3. Authenticate with wrong finger until dialog disappears and TooManyAttempts message shows
  4. Press AuthenticateLocalized again
    Result: Dialog appears => dialog disappears => TooManyAttempts message shows.

Expected behavior

On a non Samsung device the dialog does not appear. I would prefer/expect this behaviour for a Samsung device as well.

Actual behavior

Dialog appears => dialog disappears => TooManyAttempts message shows.

Crashlog

n/a

Configuration

Version of the Plugin: 1.4.2

Platform: Android 6.0.1

Device: Galaxy S7

Plugin crashes when used on iPhone 4 (iOS 7)

LAContext is not available before iOS8, so the plugin (and the app using the plugin) crashes on an iPhone4 with the following error: Wrapper type 'LocalAuthentication.LAContext' is missing its native ObjectiveC class 'LAContext'.

Unable to build XForms (Portable, .NET Framework 4.5) with v1.3.0

It looks like the nuget is published after converting to .NET Standard and I'm not able to compile my normal PCL project (targeting .NET 4.5) after I update to v1.3.0. I need the fixes for Samsung and I can't convert the existing project to use .NET Standard libraries.

Output:
1>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3274: The primary reference "D:\Dev\Xamarin\xamarin-fingerprint\src\Plugin.Fingerprint.Abstractions\bin\Debug\Plugin.Fingerprint.Abstractions.dll" could not be resolved because it was built against the ".NETPortable,Version=v5.0" framework. This is a higher version than the currently targeted framework ".NETPortable,Version=v4.5,Profile=Profile78".

1>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3275: The primary reference "D:\Dev\Xamarin\xamarin-fingerprint\src\Plugin.Fingerprint\bin\Debug\Plugin.Fingerprint.dll" could not be resolved because it has an indirect dependency on the assembly "Plugin.Fingerprint.Abstractions, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" which was built against the ".NETPortable,Version=v5.0" framework. This is a higher version than the currently targeted framework ".NETPortable,Version=v4.5,Profile=Profile78".

1>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3274: The primary reference "D:\Dev\Xamarin\xamarin-fingerprint\src\Plugin.Fingerprint\bin\Debug\Plugin.Fingerprint.dll" could not be resolved because it was built against the ".NETPortable,Version=v5.0" framework. This is a higher version than the currently targeted framework ".NETPortable,Version=v4.5,Profile=Profile78".

1>D:\Dev\Xamarin\xamarin-fingerprint\src\Sample\SMS.Fingerprint.Sample\MainView.xaml.cs(4,7,4,13): error CS0246: The type or namespace name 'Plugin' could not be found (are you missing a using directive or an assembly reference?)

1>D:\Dev\Xamarin\xamarin-fingerprint\src\Sample\SMS.Fingerprint.Sample\MainView.xaml.cs(43,43,43,74): error CS0246: The type or namespace name 'FingerprintAuthenticationResult' could not be found (are you missing a using directive or an assembly reference?)

Unable to activate instance of type Plugin.Fingerprint.Dialog.DialogFingerprintAuthenticationCallback from native handle 0xbfb8e10c (key_handle 0xa9cb158).

Tapping cancel in the fingerprint dialog in Android results in the following error:

Unable to activate instance of type Plugin.Fingerprint.Dialog.DialogFingerprintAuthenticationCallback from native handle 0xbfb8e10c (key_handle 0xa9cb158).

I get this error in version 1.3.0-beta1, this worked fine in version 1.2.0

Additional info:
InnerException message: No constructor found for Plugin.Fingerprint.Dialog.DialogFingerprintAuthenticationCallback::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership)

Expose LocalizedFallbackTitle for TouchID

Hi, I've come across the need of customizing the text of the LocalizedFallbackTitle for TouchID and noticed there's no way of doing it with the plugin. Once you fail reading a finger for the first time the option "Enter Password" is shown, but I can't customize the text or even hide it in an easy way.

This is controlled by LAContext.LocalizedFallbackTitle property.

Luckily, I have no problems using the standard behavior, but I wonder if I want something a bit more custom I'd have to do it directly with Xamarin.iOS apis.

My suggestion would be to expose this property on the IFingerprint interface and reusing it on both platforms.

Allow regular login via password on Android

Currently for the default FingerprintDialog fragment button second_dialog_button is commented out.

On iOS we have the ability to drive the user to a regular login page by using a fallback. The idea would be to have the same for Android.

What about exposing FallbackAction to IFingerprint where I can register to?

Disappoint the bot

Steps to reproduce

  1. Delete issue template to make checker mad

Expected behavior

He complains

unable to build ufter upgrading nuget to 1.3

The primary reference "Plugin.Fingerprint, Version=1.3.0.0, Culture=neutral, processorArchitecture=MSIL" could not be resolved because it has an indirect dependency on the assembly "Plugin.Fingerprint.Abstractions, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" which was built against the ".NETPortable,Version=v5.0" framework. This is a higher version than the currently targeted framework ".NETPortable,Version=v4.5,Profile=Profile111".

Switch to fail early approach for wrong installed nuget packages

I think this will keep away the people who do not install the packages correctly:

  • throw exception in PCL Create Instance
  • create projects for platforms that we do not support and return FakeAdapter there

It's then the same approach that James uses in his plugins.

UWP build, missing file

When building for UWP I'm receiving this error. Using VS 2015 on Win10 machine:

Payload file 'C:\Users[me].nuget\packages\Plugin.Fingerprint\1.4.2\lib\UAP10\Plugin.Fingerprint\Properties\Plugin.Fingerprint.UWP.rd.xml' does not exist.

Authentication dialog not shown on non-Samsung devices

The plugin is working pretty well in all samsung devices where I have tested so far but I'm getting an error in all non samsung devices where I have tested.

[SamsungFingerprintImplementation] com.samsung.android.sdk.SsdkUnsupportedException: This is not Samsung device.
[SamsungFingerprintImplementation] at com.samsung.android.sdk.pass.Spass.initialize(Unknown Source)

I have notice in your code that in the CreateFingerprint method inside the CrossFingerprint's class, you are asking for if it is compatible or not, and seem like the app is crashing there. Maybe in the constructor of SamsungFingerprintImplementation because inside that constructor it is when you are checking and setting the IsCompatible attribute.

Null Refference in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:96

Hi Guys,

This just started happening in my latest build. I don't have a clear indication of what is causing it, but the fingerprint scanner stopped working and started throwing the following error. Maybe if you've seen this before you can give me an indication of why it's not working. It's just the basic usage of your plugin.

CrossFingerprint.SetCurrentActivityResolver(() => CrossCurrentActivity.Current.Activity);

in my main activity

var result = await CrossFingerprint.Current.AuthenticateAsync("Use your fingerprint scanner to authenticate");

when I want to scan for a fingerprint and it crashes, with the log below. Sorry for the bad reproduce steps, i'm not doing anything fancy and it crashes.

Steps to reproduce

  1. Install the package

  2. Try basic usage

  3. Observe crash

Expected behavior

I just want the fingerprint scanning to start, Show the dialog, or with the config, just wait for a scan.

Actual behavior

Tell us what happens instead

##Crashlog
System.AggregateException: One or more errors occurred. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at Plugin.Fingerprint.Dialog.FingerprintDialogFragment+d__19.MoveNext () [0x00032] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:96
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128
at System.Runtime.CompilerServices.TaskAwaiter1[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 at Plugin.Fingerprint.Contract.AndroidFingerprintImplementationBase+<NativeAuthenticateAsync>d__0.MoveNext () [0x00040] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Contract\AndroidFingerprintImplementationBase.cs:17 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 at System.Runtime.CompilerServices.TaskAwaiter1[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357
at Plugin.Fingerprint.Abstractions.FingerprintImplementationBase+d__1.MoveNext () [0x000aa] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Abstractions\FingerprintImplementationBase.cs:18
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128
at System.Runtime.CompilerServices.TaskAwaiter1[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 at OTP.Droid.AndroidDeviceCommandService+<ListenForFingerprintAuthentication>c__async0.MoveNext () [0x0007a] in /Users/danemackier/MyFiles/Work/Clients/DevEnterprise/SharePointOTP/OTP.Droid/Services/AndroidDeviceCommandService.cs:25 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 at OTP.Shared.ViewModels.OtpViewModel+<ListenForFingerprintAuthentication>c__asyncC.MoveNext () [0x00054] in /Users/danemackier/MyFiles/Work/Clients/DevEnterprise/SharePointOTP/OTP.Shared/ViewModels/OtpViewModel.cs:286 --- End of inner exception stack trace --- ---> (Inner Exception #0) System.NullReferenceException: Object reference not set to an instance of an object. at Plugin.Fingerprint.Dialog.FingerprintDialogFragment+<ShowAsync>d__19.MoveNext () [0x00032] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:96 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 at System.Runtime.CompilerServices.TaskAwaiter1[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357
at Plugin.Fingerprint.Contract.AndroidFingerprintImplementationBase+d__0.MoveNext () [0x00040] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Contract\AndroidFingerprintImplementationBase.cs:17
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128
at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357
at Plugin.Fingerprint.Abstractions.FingerprintImplementationBase+d__1.MoveNext () [0x000aa] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Abstractions\FingerprintImplementationBase.cs:18
--- End of stack trace from previous location where exception was thrown ---

If something causes an exception paste full stack trace + Exception here

Configuration

Runtime:
Mono 4.8.0 (mono-4.8.0-branch/e4a3cf3) (64-bit)
GTK+ 2.24.23 (Raleigh theme)

Package version: 408000495

Xamarin.Android
Version: 7.1.0.41 (Xamarin Studio Community)
Android SDK: /Users/danemackier/Library/Developer/Xamarin/android-sdk-macosx
Supported Android versions:
5.1 (API level 22)
6.0 (API level 23)
7.0 (API level 24)
7.1 (API level 25)

SDK Tools Version: 25.1.7
SDK Platform Tools Version: 24.0.1
SDK Build Tools Version: 24.0.2

Java SDK: /usr
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

Android Designer EPL code available here:
https://github.com/xamarin/AndroidDesigner.EPL

Version of the Plugin: 1.4.2

Platform: Android 7.1.1

Device: e.g. LG Nexus 5x

GetAvailabilityAsync() is not returning any enum value running upon device with nosensor.

I am running the sample code (GetAvailabilityAsync) to check behavior on device with no fingerprint sensor.
It is throwing me exception rather than returning me enum value as NoSensor .

Exception:
[SamsungFingerprintImplementation] com.samsung.android.sdk.SsdkUnsupportedException: This device does not provide FingerprintService.
[SamsungFingerprintImplementation] at com.samsung.android.sdk.pass.Spass.initialize(Unknown Source)

Code:
public async Task FingerPrintAuthentication() { var availability = await CrossFingerprint.Current.GetAvailabilityAsync(); }

Task.Run(async () => { await FingerPrintAuthentication(); });

Manifest:
<uses-sdk android:minSdkVersion="16" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />

Device details:
Device name: Samsung Galaxy S4(GT-19500)
OS : 5.0.1
Sensor : No

.NET Standard and Regular PCL support

Steps to reproduce

  1. Add the plugin to a non .net-standard project (PCL).

  2. Try to compile.

Expected behavior

It should compile.

Actual behavior

It errors with the following:

/Library/Frameworks/Mono.framework/Versions/4.8.0/lib/mono/4.5/Microsoft.Common.targets(3,3): Warning MSB3274: The primary reference "Plugin.Fingerprint.Abstractions" could not be resolved because it was built against the ".NETPortable,Version=v5.0" framework. This is a higher version than the currently targeted framework ".NETPortable,Version=v4.5,Profile=Profile78". (MSB3274) (Mobile.Core)

Crashlog

If something causes an exception paste full stack trace + Exception here

Configuration

Version of the Plugin: 1.4.2

Platform: Xamarin Studio 6.3

Device: Mac

App crash after tap twice in Cancel button in the fingerprint dialog.

Steps to reproduce

  1. Open an app with fingerprint integrated.

  2. When you see the fingerprint dialog, tap 2 or 3 time in the "Cancel" button or tap twice in the "Use Fallback" button.

  3. The app will crash.

Expected behavior

The app should not crash.

Actual behavior

The app Crash.

Crashlog

System.InvalidOperationException: An attempt was made to transition a task to a final state when it had already completed.
at System.Threading.Tasks.TaskCompletionSource`1[TResult].SetResult (TResult result) [0x0000c] in /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/TaskCompletionSource.cs:322
at Plugin.Fingerprint.Dialog.FingerprintDialogFragment+d__20.MoveNext () [0x00082] in C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android\Dialog\FingerprintDialogFragment.cs:127
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.m__0 (System.Object state) [0x00000] in /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018
at Android.App.SyncContext+c__AnonStorey0.<>m__0 () [0x00000] in /Users/builder/data/lanes/3511/501e63ce/source/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:18
at Java.Lang.Thread+RunnableImplementor.Run () [0x0000b] in /Users/builder/data/lanes/3511/501e63ce/source/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36
at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in /Users/builder/data/lanes/3511/501e63ce/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Java.Lang.IRunnable.cs:81
at at (wrapper dynamic-method) System.Object:3507f35d-d544-499c-814c-5b8a75e1249c (intptr,intptr)

Configuration

Version of the Plugin: 1.4.1

Platform: Android 6.0.1

Device: Samsung Galaxy S6

Adding more FingerprintAuthenticationResultStatus

I've come across the need of registering custom analytics events for result statuses that are unknown, like TouchIDLockout. I think some statuses can be exposed so the plugin provides the developer a custom way to handle results from the OS.

Build Error in Release mode: Tool Exited with code: 1. Output: ProGuard, version 5.3.2

Since I updated to version 1.4.1 I get the following build error only in release mode: Tool Exited with code: 1. Output: ProGuard, version 5.3.2

Everthing works fine in debug.

Does this sound familiar to anybody?

Steps to reproduce

  1. Update to xamarin-fingerprint 1.4.1

  2. Build Release

Expected behavior

no build errors

Actual behavior

build error only in release mode: Tool Exited with code: 1. Output: ProGuard, version 5.3.2

Crashlog

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets: Error: Tool exited with code: 1. Output: ProGuard, version 5.3.2
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.appindexing.AppIndex'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.appdatasearch.GetRecentContextCall'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.appdatasearch.zzk'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.appindexing.AppIndexApi$ActionResult'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.appindexing.AppIndexApi'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.appindexing.Thing'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.search.SearchAuthApi$GoogleNowAuthResult'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.search.SearchAuthApi'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.search.SearchAuth'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.CardViewDelegate'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RoundRectDrawableWithShadow$RoundRectHelper'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.DefaultItemAnimator$ChangeInfo'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.DefaultItemAnimator$MoveInfo'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.helper.ItemTouchUIUtil'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.helper.ItemTouchHelper$ItemTouchHelperGestureListener'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.helper.ItemTouchHelper$ViewDropHandler'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$AdapterDataObserver'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$ChildDrawingOrderCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$ItemAnimator$AdapterChanges'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$ItemAnimator$ItemAnimatorFinishedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.RecyclerView_ItemAnimator_ItemAnimatorFinishedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$ItemDecoration'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$OnChildAttachStateChangeListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.RecyclerView_OnChildAttachStateChangeListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$OnItemTouchListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.RecyclerView_OnItemTouchListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$OnScrollListener'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$RecyclerListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.RecyclerView_RecyclerListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$RecyclerViewDataObserver'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$SavedState'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.RecyclerView$ViewHolder'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.StaggeredGridLayoutManager$AnchorInfo'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.StaggeredGridLayoutManager$LazySpanLookup'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.CrashManagerListener'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.FeedbackManagerListener'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.FeedbackActivityInterface'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.UpdateActivityInterface'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.UpdateInfoListener'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.StringListener'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.UpdateManagerListener'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.listeners.DownloadFileListener'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.listeners.SendFeedbackListener'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.utils.ConnectionManager$ConnectionManagerHolder'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.utils.DeviceUtils$DeviceUtilsHolder'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.utils.FeedbackParser$FeedbackParserHolder'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.utils.PrefsUtil$PrefsUtilHolder'
Note: the configuration doesn't specify which class members to keep for class 'net.hockeyapp.android.utils.UiThreadUtil$WbUtilHolder'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.AdListener'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.doubleclick.AppEventListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.doubleclick.AppEventListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.doubleclick.CustomRenderedAd'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.doubleclick.OnCustomRenderedAdLoadedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.doubleclick.OnCustomRenderedAdLoadedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.formats.NativeCustomTemplateAd$OnCustomClickListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.formats.NativeCustomTemplateAd_OnCustomClickListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.formats.NativeCustomTemplateAd$OnCustomTemplateAdLoadedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.formats.NativeCustomTemplateAd_OnCustomTemplateAdLoadedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.formats.NativeCustomTemplateAd'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.formats.NativeAd'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.formats.NativeAdView'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.formats.NativeAppInstallAd$OnAppInstallAdLoadedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.formats.NativeAppInstallAd_OnAppInstallAdLoadedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.formats.NativeContentAd$OnContentAdLoadedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.formats.NativeContentAd_OnContentAdLoadedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.customevent.CustomEvent'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.customevent.CustomEventBanner'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.customevent.CustomEventBannerListener'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.customevent.CustomEventInterstitial'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.customevent.CustomEventInterstitialListener'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.customevent.CustomEventListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.mediation.customevent.CustomEventListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.customevent.CustomEventNative'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.customevent.CustomEventNativeListener'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationAdRequest'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationAdRequest'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationBannerAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationBannerListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.mediation.MediationBannerListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationInterstitialAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationInterstitialListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.mediation.MediationInterstitialListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationNativeAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.MediationNativeListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.mediation.MediationNativeListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.NativeMediationAdRequest'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.NetworkExtras'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.NativeAdMapper'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.NativeAppInstallAdMapper'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.mediation.NativeContentAdMapper'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.purchase.InAppPurchase'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.purchase.InAppPurchase'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.purchase.InAppPurchaseListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.purchase.InAppPurchaseListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.purchase.InAppPurchaseResult'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.purchase.PlayStorePurchaseListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.purchase.PlayStorePurchaseListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.reward.RewardItem'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.reward.RewardedVideoAd'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.reward.RewardedVideoAdListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.reward.RewardedVideoAdListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.reward.mediation.MediationRewardedVideoAdAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.ads.reward.mediation.MediationRewardedVideoAdListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.ads.reward.mediation.MediationRewardedVideoAdListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.AdRequest'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.AbstractAdViewAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.customevent.CustomEvent'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.customevent.CustomEventBanner'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.customevent.CustomEventBannerListener'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.customevent.CustomEventInterstitial'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.customevent.CustomEventInterstitialListener'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.customevent.CustomEventListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.ads.mediation.customevent.CustomEventListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.MediationAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.MediationBannerAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.MediationBannerListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.ads.mediation.MediationBannerListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.MediationInterstitialAdapter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.MediationInterstitialListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.ads.mediation.MediationInterstitialListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.NetworkExtras'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.MediationServerParameters$Parameter'
Note: the configuration doesn't specify which class members to keep for class 'com.google.ads.mediation.MediationServerParameters'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxExpandableListView'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxFrameControl'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxDatePicker'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxGridView'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxAutoCompleteTextView'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxRadioGroup'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxSpinner'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxLinearLayout'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxListItemView'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxListView'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxImageView'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxTimePicker'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxRelativeLayout'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxFrameLayout'
Note: the configuration doesn't specify which class members to keep for class 'cirrious.mvvmcross.binding.droid.views.MvxTableLayout'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationCompat$Action$Extender'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationCompat$Extender'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationCompat$Style'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewPager$Decor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewPager$ItemInfo'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewPager$MyAccessibilityDelegate'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewPager$OnPageChangeListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.view.ViewPager_OnPageChangeListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewPager$PageTransformer'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewPager$PagerObserver'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.FragmentActivity$NonConfigurationInstances'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.NestedScrollView$AccessibilityDelegate'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.NestedScrollView$OnScrollChangeListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.widget.NestedScrollView_OnScrollChangeListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.SwipeRefreshLayout$OnRefreshListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.widget.SwipeRefreshLayout_OnRefreshListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.animation.AnimatorCompatHelper'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.animation.AnimatorListenerCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.animation.AnimatorUpdateListenerCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.animation.ValueAnimatorCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.ActionBarDrawerToggle$Delegate'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.ActionBarDrawerToggle$DelegateProvider'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.ActivityCompat$OnRequestPermissionsResultCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.ActivityOptionsCompat$ActivityOptionsImpl21'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.ActivityOptionsCompat$ActivityOptionsImplJB'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.FragmentManager$BackStackEntry'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.FragmentManager$OnBackStackChangedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.app.FragmentManager_OnBackStackChangedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.FragmentTabHost$SavedState'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.FragmentTabHost$TabInfo'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationBuilderWithBuilderAccessor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.INotificationSideChannel'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.LoaderManager$LoaderCallbacks'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationCompatBase$Action$Factory'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationCompatBase$UnreadConversation$Factory'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationCompatBase$UnreadConversation'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationCompatExtras'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.NotificationManagerCompat$Task'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.RemoteInputCompatBase$RemoteInput$Factory'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.RemoteInputCompatBase'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.ServiceCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.SharedElementCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.app.TaskStackBuilder$SupportParentable'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.FileProvider$PathStrategy'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.Loader$OnLoadCanceledListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.content.Loader_OnLoadCanceledListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.Loader$OnLoadCompleteListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.content.Loader_OnLoadCompleteListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.LocalBroadcastManager$BroadcastRecord'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.LocalBroadcastManager$ReceiverRecord'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.ModernAsyncTask$AsyncTaskResult'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.pm.ActivityInfoCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.PermissionChecker$PermissionResult'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.content.SharedPreferencesCompat$EditorCompat$Helper'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.graphics.drawable.DrawableWrapper'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory$DefaultRoundedBitmapDrawable'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.hardware.fingerprint.FingerprintManagerCompat$AuthenticationCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.IMediaBrowserServiceCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.IMediaBrowserServiceCompatCallbacks'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaBrowserCompat$ItemCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase$Subscription'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaBrowserCompat$MediaItem$Flags'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaBrowserCompat$SubscriptionCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaBrowserServiceCompat$ConnectionRecord'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaMetadataCompat$BitmapKey'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaMetadataCompat$LongKey'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaMetadataCompat$RatingKey'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.MediaMetadataCompat$TextKey'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.RatingCompat$StarStyle'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.RatingCompat$Style'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.session.IMediaControllerCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.session.IMediaSession'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.session.MediaControllerCompat$Callback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.session.MediaSessionCompat$Callback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.session.MediaSessionCompat$OnActiveChangeListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.media.session.MediaSessionCompat_OnActiveChangeListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.session.MediaSessionCompat$SessionFlags'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.session.PlaybackStateCompat$Actions'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.session.PlaybackStateCompat$State'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.VolumeProviderCompat$ControlType'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.media.VolumeProviderCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.net.TrafficStatsCompat$BaseTrafficStatsCompatImpl$SocketTags'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.os.CancellationSignal$OnCancelListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.os.CancellationSignal_OnCancelListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.os.ParcelableCompatCreatorCallbacks'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.os.IResultReceiver'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.print.PrintHelper$OnPrintFinishCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.text.BidiFormatter$DirectionalityEstimator'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.text.TextDirectionHeuristicCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.text.TextDirectionHeuristicsCompat$TextDirectionAlgorithm'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.util.Pools$Pool'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.util.Pools'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ActionProvider$SubUiVisibilityListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.view.ActionProvider_SubUiVisibilityListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ActionProvider$VisibilityListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.view.ActionProvider_VisibilityListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.animation.LookupTableInterpolator'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.GestureDetectorCompat$GestureDetectorCompatImplBase$GestureHandler'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.LayoutInflaterFactory'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.NestedScrollingChild'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.NestedScrollingParent'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.OnApplyWindowInsetsListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.view.OnApplyWindowInsetsListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ScrollingView'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.TintableBackgroundView'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewPropertyAnimatorListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.view.ViewPropertyAnimatorListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewPropertyAnimatorUpdateListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.view.ViewPropertyAnimatorUpdateListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.MenuItemCompat$OnActionExpandListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.view.MenuItemCompat_OnActionExpandListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.view.ViewCompat$ScrollIndicators'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.CursorAdapter$MyDataSetObserver'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.DrawerLayout$AccessibilityDelegate'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.DrawerLayout$ChildAccessibilityDelegate'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.DrawerLayout$DrawerListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.widget.DrawerLayout_DrawerListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.DrawerLayout$SimpleDrawerListener'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.ExploreByTouchHelper$ExploreByTouchNodeProvider'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.TintableCompoundButton'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.SearchViewCompat$OnCloseListenerCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.SearchViewCompat$OnQueryTextListenerCompat'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.SimpleCursorAdapter$CursorToStringConverter'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.SimpleCursorAdapter$ViewBinder'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.SlidingPaneLayout$PanelSlideListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v4.widget.SlidingPaneLayout_PanelSlideListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v4.widget.SlidingPaneLayout$SavedState'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.actions.ItemListIntents'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.actions.NoteIntents'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.actions.ReserveIntents'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.actions.SearchIntents'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.data.DataBuffer'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.data.DataBufferObserver$Observable'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.data.DataBufferObserver'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.data.Freezable'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.data.zzc'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.data.zzf'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.images.ImageManager$OnImageLoadedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.common.images.ImageManager_OnImageLoadedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.GoogleApiClient$ConnectionCallbacks'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.GoogleApiClient$ConnectionCallbacks'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.GoogleApiClient$OnConnectionFailedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.common.api.GoogleApiClient_OnConnectionFailedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.GoogleApiClient$ServerAuthCodeCallbacks'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.auth.api.Auth$AuthCredentialsOptions'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.auth.api.Auth'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.auth.api.credentials.CredentialRequestResult'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.auth.api.credentials.CredentialsApi'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.auth.api.credentials.CredentialsApi'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.auth.api.proxy.ProxyApi$ProxyResult'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.auth.api.proxy.ProxyApi'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.annotation.KeepName'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.Api$ApiOptions$HasOptions'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.Api$ApiOptions$NoOptions'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.Api$ApiOptions$NotRequiredOptions'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.Api$ApiOptions$Optional'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.Api$ApiOptions'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.BatchResultToken'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.Releasable'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.Result'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.api.ResultCallback'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.internal.safeparcel.SafeParcelable'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.internal.safeparcel.SafeParcelable'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.Scopes'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.common.server.response.FastJsonResponse'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.dynamic.LifecycleDelegate'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.security.ProviderInstaller$ProviderInstallListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.security.ProviderInstaller_ProviderInstallListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'DallinEvans.MvvmCross.Droid.MvxRecyclerView'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.gcm.GcmListenerService'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.gcm.Task'
Note: the configuration doesn't specify which class members to keep for class 'com.daimajia.swipe.SwipeLayout$DoubleClickListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.daimajia.swipe.SwipeLayout_DoubleClickListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.daimajia.swipe.SwipeLayout$OnLayout'
Note: the configuration doesn't specify which class members to keep for class 'com.daimajia.swipe.SwipeLayout$OnRevealListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.daimajia.swipe.SwipeLayout_OnRevealListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.daimajia.swipe.SwipeLayout$SwipeDenier'
Note: the configuration doesn't specify which class members to keep for class 'com.daimajia.swipe.SwipeLayout$SwipeListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.daimajia.swipe.SwipeLayout_SwipeListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.daimajia.swipe.interfaces.SwipeAdapterInterface'
Note: the configuration doesn't specify which class members to keep for class 'com.daimajia.swipe.interfaces.SwipeItemMangerInterface'
Note: the configuration doesn't specify which class members to keep for class 'com.squareup.okhttp.Authenticator'
Note: the configuration doesn't specify which class members to keep for class 'com.squareup.okhttp.Callback'
Note: the configuration doesn't specify which class members to keep for class 'com.squareup.okhttp.Interceptor$Chain'
Note: the configuration doesn't specify which class members to keep for class 'com.squareup.okhttp.Interceptor'
Note: the configuration doesn't specify which class members to keep for class 'okio.ForwardingSink'
Note: the configuration doesn't specify which class members to keep for class 'okio.ForwardingSource'
Note: the configuration doesn't specify which class members to keep for class 'okio.BufferedSink'
Note: the configuration doesn't specify which class members to keep for class 'okio.BufferedSource'
Note: the configuration doesn't specify which class members to keep for class 'okio.Sink'
Note: the configuration doesn't specify which class members to keep for class 'okio.Source'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.analytics.ExceptionParser'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.analytics.Logger'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.tagmanager.Container$FunctionCallMacroCallback'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.tagmanager.Container$FunctionCallTagCallback'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.tagmanager.ContainerHolder$ContainerAvailableListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.google.android.gms.tagmanager.ContainerHolder_ContainerAvailableListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.google.android.gms.tagmanager.ContainerHolder'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.Toolbar$OnMenuItemClickListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.Toolbar_OnMenuItemClickListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.ActionBar$DisplayOptions'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.ActionBar$NavigationMode'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.ActionBar$OnMenuVisibilityListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.app.ActionBar_OnMenuVisibilityListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.ActionBar$OnNavigationListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.app.ActionBar_OnNavigationListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.ActionBar$TabListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.app.ActionBar_TabListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.ActionBarDrawerToggle$Delegate'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.ActionBarDrawerToggle$DelegateProvider'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.ActionBarDrawerToggle$DrawerToggle'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.app.AppCompatCallback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.graphics.drawable.DrawerArrowDrawable$ArrowDirection'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.view.ActionMode$Callback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.view.CollapsibleActionView'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.view.menu.BaseMenuPresenter'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.view.menu.MenuView'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.view.menu.MenuBuilder$Callback'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.view.menu.MenuWrapperFactory'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.ActionMenuView$ActionMenuChildView'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.ActionMenuView$OnMenuItemClickListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.ActionMenuView_OnMenuItemClickListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.AppCompatDrawableManager$InflateDelegate'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.ContentFrameLayout$OnAttachListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.ContentFrameLayout_OnAttachListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.FitWindowsViewGroup$OnFitSystemWindowsListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.FitWindowsViewGroup_OnFitSystemWindowsListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.FitWindowsViewGroup'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.ThemedSpinnerAdapter'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.LinearLayoutCompat$DividerMode'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.LinearLayoutCompat$OrientationMode'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.ListPopupWindow$PopupDataSetObserver'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.PopupMenu$OnDismissListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.PopupMenu_OnDismissListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.PopupMenu$OnMenuItemClickListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.PopupMenu_OnMenuItemClickListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.SearchView$AutoCompleteTextViewReflector'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.SearchView$OnCloseListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.SearchView_OnCloseListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.SearchView$OnQueryTextListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.SearchView_OnQueryTextListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.SearchView$OnSuggestionListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.SearchView_OnSuggestionListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.ShareActionProvider$OnShareTargetSelectedListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.ShareActionProvider_OnShareTargetSelectedListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.ShareActionProvider$ShareActivityChooserModelPolicy'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.SwitchCompat$ThumbAnimation'
Note: the configuration doesn't specify which class members to keep for class 'android.support.v7.widget.ViewStubCompat$OnInflateListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.android.support.v7.widget.ViewStubCompat_OnInflateListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.samsung.android.sdk.pass.SpassFingerprint$IdentifyListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.samsung.android.sdk.pass.SpassFingerprint_IdentifyListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.samsung.android.sdk.pass.SpassFingerprint$RegisterListener'
Note: the configuration doesn't specify which class members to keep for class 'mono.com.samsung.android.sdk.pass.SpassFingerprint_RegisterListenerImplementor'
Note: the configuration doesn't specify which class members to keep for class 'com.samsung.android.sdk.pass.support.IFingerprintManagerProxy'
Note: there were 423 '-keepclassmembers' options that didn't specify class
members. You should specify at least some class members or consider
if you just need '-keep'.
(http://proguard.sourceforge.net/manual/troubleshooting.html#classmembers)
Reading input...
Reading program jar [/Users/nielscup/Documents/SVN/CoreApp/Droid/obj/RNL-Release/proguard/proguard_input.jar]
Reading program jar [/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.2-42/lib/xbuild-frameworks/MonoAndroid/v7.0/mono.android.jar]
Reading program jar [/Users/nielscup/Documents/SVN/CoreApp/Droid/obj/RNL-Release/library_projects/AndroidSwipeLayout/library_project_imports/bin/classes.jar]
Reading program jar [/Users/nielscup/Documents/SVN/CoreApp/Droid/obj/RNL-Release/library_projects/HockeyApp.Android/library_project_imports/HockeyApp.Android.Jars.HockeySDK-3.0.2.jar]
Reading program jar [/Users/nielscup/Documents/SVN/CoreApp/Droid/obj/RNL-Release/library_projects/OkHttp/library_project_imports/okhttp-2.3.0-jar-with-dependencies.jar]
Reading program jar [/Users/nielscup/Documents/SVN/CoreApp/Droid/obj/RNL-Release/library_projects/Plugin.Fingerprint.Android.Samsung/library_project_imports/__reference__pass-v1.2.0.jar]
Reading program jar [/Users/nielscup/Documents/SVN/CoreApp/Droid/obj/RNL-Release/library_projects/Plugin.Fingerprint.Android.Samsung/library_project_imports/__reference__sdk-v1.0.0.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.GooglePlayServices.Basement/8.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.GooglePlayServices.AppIndexing/8.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.GooglePlayServices.Ads/8.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.GooglePlayServices.Analytics/8.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.Android.Support.v4/23.1.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.Android.Support.v4/23.1.1.0/embedded/libs/internal_impl-23.1.1.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.Android.Support.v7.AppCompat/23.1.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.Android.Support.v7.CardView/23.1.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.Android.Support.v7.RecyclerView/23.1.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.GooglePlayServices.Base/8.1.0/embedded/classes.jar]
Reading program jar [/Users/nielscup/.local/share/Xamarin/Xamarin.GooglePlayServices.Gcm/8.1.0/embedded/classes.jar]
Reading library jar [/Users/nielscup/Library/Developer/Xamarin/android-sdk-macosx/platforms/android-25/android.jar]
Initializing...
Note: the configuration refers to the unknown class 'com.google.vending.licensing.ILicensingService'
Note: the configuration refers to the unknown class 'com.android.vending.licensing.ILicensingService'
Note: the configuration refers to the unknown class 'android.support.annotation.Keep'
Note: the configuration refers to the unknown class 'android.support.annotation.Keep'
Note: the configuration refers to the unknown class 'android.support.annotation.Keep'
Note: the configuration refers to the unknown class 'android.support.annotation.Keep'
Note: the configuration refers to the unknown class 'android.support.annotation.Keep'
Note: the configuration refers to the unknown class 'Object'
Maybe you meant the fully qualified name 'java.lang.Object'?
Note: android.support.v4.app.NotificationCompatJellybean calls 'Field.getType'
Note: com.google.android.gms.internal.zzsf calls 'Field.getType'
Note: com.samsung.android.sdk.pass.support.SdkSupporter calls 'Field.getType'
Warning: com.samsung.android.sdk.pass.SpassFingerprint$b: can't find superclass or interface com.samsung.android.fingerprint.IFingerprintClient$Stub
Warning: com.samsung.android.sdk.pass.SpassFingerprint$c: can't find superclass or interface com.samsung.android.fingerprint.FingerprintIdentifyDialog$FingerprintListener
Warning: com.samsung.android.sdk.pass.b: can't find superclass or interface com.samsung.android.fingerprint.FingerprintManager$EnrollFinishListener
Warning: com.samsung.android.sdk.pass.SpassFingerprint: can't find referenced class com.samsung.android.fingerprint.FingerprintIdentifyDialog
Warning: com.samsung.android.sdk.pass.SpassFingerprint: can't find referenced class com.samsung.android.fingerprint.FingerprintIdentifyDialog$FingerprintListener
Warning: com.samsung.android.sdk.pass.SpassFingerprint: can't find referenced class com.samsung.android.fingerprint.FingerprintManager
Warning: com.samsung.android.sdk.pass.SpassFingerprint: can't find referenced class com.samsung.android.fingerprint.FingerprintManager$EnrollFinishListener
Warning: com.samsung.android.sdk.pass.SpassFingerprint: can't find referenced class com.samsung.android.fingerprint.IFingerprintClient
Warning: com.samsung.android.sdk.pass.SpassFingerprint: can't find referenced class com.samsung.android.fingerprint.IFingerprintClient
Warning: com.samsung.android.sdk.pass.SpassFingerprint: can't find referenced class com.samsung.android.fingerprint.IFingerprintClient
Warning: com.samsung.android.sdk.pass.SpassFingerprint$b: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.SpassFingerprint$b: can't find referenced class com.samsung.android.fingerprint.IFingerprintClient
Warning: com.samsung.android.sdk.pass.SpassFingerprint$b: can't find referenced class com.samsung.android.fingerprint.IFingerprintClient$Stub
Warning: com.samsung.android.sdk.pass.SpassFingerprint$b: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.SpassFingerprint$b: can't find referenced class com.samsung.android.fingerprint.IFingerprintClient$Stub
Warning: com.samsung.android.sdk.pass.SpassFingerprint$b: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.SpassFingerprint$c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.SpassFingerprint$c: can't find referenced class com.samsung.android.fingerprint.FingerprintIdentifyDialog
Warning: com.samsung.android.sdk.pass.SpassFingerprint$c: can't find referenced class com.samsung.android.fingerprint.FingerprintIdentifyDialog$FingerprintListener
Warning: com.samsung.android.sdk.pass.SpassFingerprint$c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.SpassFingerprint$c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.SpassFingerprint$c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.b: can't find referenced class com.samsung.android.fingerprint.FingerprintManager
Warning: com.samsung.android.sdk.pass.b: can't find referenced class com.samsung.android.fingerprint.FingerprintManager$EnrollFinishListener
Warning: com.samsung.android.sdk.pass.c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.c: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.d: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.d: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.d: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.d: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.e: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.e: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.e: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.e: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.e: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.e: can't find referenced class com.samsung.android.fingerprint.FingerprintEvent
Warning: com.samsung.android.sdk.pass.support.IFingerprintManagerProxy: can't find referenced class com.samsung.android.fingerprint.FingerprintIdentifyDialog
Warning: com.samsung.android.sdk.pass.support.IFingerprintManagerProxy: can't find referenced class com.samsung.android.fingerprint.FingerprintIdentifyDialog$FingerprintListener
Warning: com.samsung.android.sdk.pass.support.IFingerprintManagerProxy: can't find referenced class com.samsung.android.fingerprint.FingerprintManager
Warning: com.samsung.android.sdk.pass.support.IFingerprintManagerProxy: can't find referenced class com.samsung.android.fingerprint.FingerprintManager$EnrollFinishListener
Warning: com.samsung.android.sdk.pass.support.IFingerprintManagerProxy: can't find referenced class com.samsung.android.fingerprint.IFingerprintClient
Warning: com.samsung.android.sdk.pass.support.IFingerprintManagerProxy: can't find referenced class com.samsung.android.fingerprint.FingerprintIdentifyDialog$FingerprintListener
Warning: com.samsung.android.sdk.pass.support.IFingerprintManagerProxy: can't find referenced class com.samsung.android.fingerprint.FingerprintManager$EnrollFinishListener
Warning: com.samsung.android.sdk.pass.support.IFingerprintManagerProxy: can't find referenced class com.samsung.android.fingerprint.IFingerprintClient
Note: android.support.v4.text.ICUCompatApi23: can't find dynamically referenced class libcore.icu.ICU
Note: android.support.v4.text.ICUCompatIcs: can't find dynamically referenced class libcore.icu.ICU
Note: android.support.v7.widget.DrawableUtils: can't find dynamically referenced class android.graphics.Insets
Note: com.samsung.android.sdk.pass.SpassFingerprint: can't find dynamically referenced class com.samsung.android.fingerprint.FingerprintManager
Note: com.samsung.android.sdk.pass.SpassFingerprint: can't find dynamically referenced class com.samsung.android.fingerprint.FingerprintManager
Note: com.samsung.android.sdk.pass.SpassFingerprint: can't find dynamically referenced class com.samsung.android.fingerprint.FingerprintManager
Note: com.samsung.android.sdk.pass.support.v1.FingerprintManagerProxyFactory: can't find dynamically referenced class com.samsung.android.fingerprint.FingerprintManager
Note: com.squareup.okhttp.internal.Platform: can't find dynamically referenced class com.android.org.conscrypt.OpenSSLSocketImpl
Note: com.squareup.okhttp.internal.Platform: can't find dynamically referenced class org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl
Note: android.support.v4.app.NotificationCompatJellybean accesses a declared field 'icon' dynamically
Maybe this is program field 'android.support.v4.R$attr { int icon; }'
Maybe this is program field 'android.support.v4.R$drawable { int icon; }'
Maybe this is program field 'android.support.v4.R$id { int icon; }'
Maybe this is program field 'android.support.v4.app.NotificationCompat$Action { int icon; }'
Maybe this is program field 'android.support.v7.appcompat.R$attr { int icon; }'
Maybe this is program field 'android.support.v7.appcompat.R$drawable { int icon; }'
Maybe this is program field 'android.support.v7.appcompat.R$id { int icon; }'
Maybe this is program field 'android.support.v7.cardview.R$attr { int icon; }'
Maybe this is program field 'android.support.v7.cardview.R$drawable { int icon; }'
Maybe this is program field 'android.support.v7.cardview.R$id { int icon; }'
Maybe this is program field 'android.support.v7.recyclerview.R$attr { int icon; }'
Maybe this is program field 'android.support.v7.recyclerview.R$drawable { int icon; }'
Maybe this is program field 'android.support.v7.recyclerview.R$id { int icon; }'
Maybe this is program field 'com.daimajia.swipe.R$attr { int icon; }'
Maybe this is program field 'com.daimajia.swipe.R$drawable { int icon; }'
Maybe this is program field 'com.daimajia.swipe.R$id { int icon; }'
Maybe this is program field 'com.google.android.gms.R$attr { int icon; }'
Maybe this is program field 'com.google.android.gms.R$drawable { int icon; }'
Maybe this is program field 'com.google.android.gms.R$id { int icon; }'
Maybe this is program field 'com.google.android.gms.ads.R$attr { int icon; }'
Maybe this is program field 'com.google.android.gms.ads.R$drawable { int icon; }'
Maybe this is program field 'com.google.android.gms.ads.R$id { int icon; }'
Maybe this is program field 'com.google.android.gms.analytics.R$attr { int icon; }'
Maybe this is program field 'com.google.android.gms.analytics.R$drawable { int icon; }'
Maybe this is program field 'com.google.android.gms.analytics.R$id { int icon; }'
Maybe this is program field 'com.google.android.gms.appindexing.R$attr { int icon; }'
Maybe this is program field 'com.google.android.gms.appindexing.R$drawable { int icon; }'
Maybe this is program field 'com.google.android.gms.appindexing.R$id { int icon; }'
Maybe this is program field 'com.google.android.gms.base.R$attr { int icon; }'
Maybe this is program field 'com.google.android.gms.base.R$drawable { int icon; }'
Maybe this is program field 'com.google.android.gms.base.R$id { int icon; }'
Maybe this is program field 'com.google.android.gms.gcm.R$attr { int icon; }'
Maybe this is program field 'com.google.android.gms.gcm.R$drawable { int icon; }'
Maybe this is program field 'com.google.android.gms.gcm.R$id { int icon; }'
Maybe this is library field 'android.R$attr { int icon; }'
Maybe this is library field 'android.R$id { int icon; }'
Maybe this is library field 'android.app.LauncherActivity$ListItem { android.graphics.drawable.Drawable icon; }'
Maybe this is library field 'android.app.Notification { int icon; }'
Maybe this is library field 'android.app.Notification$Action { int icon; }'
Maybe this is library field 'android.appwidget.AppWidgetProviderInfo { int icon; }'
Maybe this is library field 'android.content.pm.PackageItemInfo { int icon; }'
Maybe this is library field 'android.content.pm.ResolveInfo { int icon; }'
Maybe this is library field 'android.inputmethodservice.Keyboard$Key { android.graphics.drawable.Drawable icon; }'
Maybe this is library field 'android.service.notification.Condition { int icon; }'
Maybe this is library field 'android.speech.tts.TextToSpeech$EngineInfo { int icon; }'
Note: android.support.v4.app.NotificationCompatJellybean accesses a declared field 'title' dynamically
Maybe this is program field 'android.support.v4.R$attr { int title; }'
Maybe this is program field 'android.support.v4.R$id { int title; }'
Maybe this is program field 'android.support.v4.app.NotificationCompat$Action { java.lang.CharSequence title; }'
Maybe this is program field 'android.support.v7.appcompat.R$attr { int title; }'
Maybe this is program field 'android.support.v7.appcompat.R$id { int title; }'
Maybe this is program field 'android.support.v7.cardview.R$attr { int title; }'
Maybe this is program field 'android.support.v7.cardview.R$id { int title; }'
Maybe this is program field 'android.support.v7.recyclerview.R$attr { int title; }'
Maybe this is program field 'android.support.v7.recyclerview.R$id { int title; }'
Maybe this is program field 'com.daimajia.swipe.R$attr { int title; }'
Maybe this is program field 'com.daimajia.swipe.R$id { int title; }'
Maybe this is program field 'com.google.android.gms.R$attr { int title; }'
Maybe this is program field 'com.google.android.gms.R$id { int title; }'
Maybe this is program field 'com.google.android.gms.ads.R$attr { int title; }'
Maybe this is program field 'com.google.android.gms.ads.R$id { int title; }'
Maybe this is program field 'com.google.android.gms.analytics.R$attr { int title; }'
Maybe this is program field 'com.google.android.gms.analytics.R$id { int title; }'
Maybe this is program field 'com.google.android.gms.appindexing.R$attr { int title; }'
Maybe this is program field 'com.google.android.gms.appindexing.R$id { int title; }'
Maybe this is program field 'com.google.android.gms.base.R$attr { int title; }'
Maybe this is program field 'com.google.android.gms.base.R$id { int title; }'
Maybe this is program field 'com.google.android.gms.gcm.R$attr { int title; }'
Maybe this is program field 'com.google.android.gms.gcm.R$id { int title; }'
Maybe this is library field 'android.R$attr { int title; }'
Maybe this is library field 'android.R$id { int title; }'
Maybe this is library field 'android.app.Notification$Action { java.lang.CharSequence title; }'
Maybe this is library field 'android.preference.PreferenceActivity$Header { java.lang.CharSequence title; }'
Note: android.support.v4.app.NotificationCompatJellybean accesses a declared field 'actionIntent' dynamically
Maybe this is program field 'android.support.v4.app.NotificationCompat$Action { android.app.PendingIntent actionIntent; }'
Maybe this is library field 'android.app.Notification$Action { android.app.PendingIntent actionIntent; }'
Note: com.daimajia.swipe.SwipeLayout accesses a field 'gravity' dynamically
Maybe this is program field 'android.support.v4.view.ViewPager$LayoutParams { int gravity; }'
Maybe this is program field 'android.support.v4.widget.DrawerLayout$LayoutParams { int gravity; }'
Maybe this is program field 'android.support.v7.app.ActionBar$LayoutParams { int gravity; }'
Maybe this is program field 'android.support.v7.app.AppCompatDelegateImplV7$PanelFeatureState { int gravity; }'
Maybe this is program field 'android.support.v7.widget.LinearLayoutCompat$LayoutParams { int gravity; }'
Maybe this is library field 'android.R$attr { int gravity; }'
Maybe this is library field 'android.app.ActionBar$LayoutParams { int gravity; }'
Maybe this is library field 'android.content.pm.ActivityInfo$WindowLayout { int gravity; }'
Maybe this is library field 'android.view.WindowManager$LayoutParams { int gravity; }'
Maybe this is library field 'android.widget.FrameLayout$LayoutParams { int gravity; }'
Maybe this is library field 'android.widget.LinearLayout$LayoutParams { int gravity; }'
Note: the configuration keeps the entry point 'com.google.android.gms.ads.AdLoader$Builder { AdLoader$Builder(android.content.Context,com.google.android.gms.ads.internal.client.zzq); }', but not the descriptor class 'com.google.android.gms.ads.internal.client.zzq'
Note: the configuration keeps the entry point 'com.google.android.gms.appdatasearch.UsageInfo { UsageInfo(com.google.android.gms.appdatasearch.DocumentId,long,int,java.lang.String,com.google.android.gms.appdatasearch.DocumentContents,boolean,int,int,com.google.android.gms.appdatasearch.UsageInfo$1); }', but not the descriptor class 'com.google.android.gms.appdatasearch.UsageInfo$1'
Note: the configuration keeps the entry point 'com.google.android.gms.common.data.DataHolder { DataHolder(com.google.android.gms.common.data.DataHolder$zza,int,android.os.Bundle); }', but not the descriptor class 'com.google.android.gms.common.data.DataHolder$zza'
Note: the configuration keeps the entry point 'com.google.android.gms.iid.InstanceIDListenerService { void zza(android.content.Context,com.google.android.gms.iid.zzd); }', but not the descriptor class 'com.google.android.gms.iid.zzd'
Note: the configuration keeps the entry point 'com.squareup.okhttp.Request$Builder { Request$Builder(com.squareup.okhttp.Request,com.squareup.okhttp.Request$1); }', but not the descriptor class 'com.squareup.okhttp.Request$1'
Note: the configuration keeps the entry point 'com.squareup.okhttp.Response$Builder { Response$Builder(com.squareup.okhttp.Response,com.squareup.okhttp.Response$1); }', but not the descriptor class 'com.squareup.okhttp.Response$1'
Note: the configuration explicitly specifies 'org.apache.http.' to keep library class 'org.apache.http.conn.ConnectTimeoutException'
Note: the configuration explicitly specifies 'org.apache.http.
' to keep library class 'org.apache.http.conn.scheme.HostNameResolver'
Note: the configuration explicitly specifies 'org.apache.http.' to keep library class 'org.apache.http.conn.scheme.LayeredSocketFactory'
Note: the configuration explicitly specifies 'org.apache.http.
' to keep library class 'org.apache.http.conn.scheme.SocketFactory'
Note: the configuration explicitly specifies 'org.apache.http.' to keep library class 'org.apache.http.conn.ssl.SSLSocketFactory'
Note: the configuration explicitly specifies 'org.apache.http.
' to keep library class 'org.apache.http.conn.ssl.X509HostnameVerifier'
Note: the configuration explicitly specifies 'org.apache.http.' to keep library class 'org.apache.http.params.CoreConnectionPNames'
Note: the configuration explicitly specifies 'org.apache.http.
' to keep library class 'org.apache.http.params.HttpConnectionParams'
Note: the configuration explicitly specifies 'org.apache.http.**' to keep library class 'org.apache.http.params.HttpParams'
Note: there were 8 references to unknown classes.
Warning: there were 48 unresolved references to classes or interfaces.
You should check your configuration for typos.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)
You may need to add missing library jars or update their versions.
Note: there were 3 classes trying to access generic signatures using reflection.
If your code works fine without the missing classes, you can suppress
You should consider keeping the signature attributes
the warnings with '-dontwarn' options.
(using '-keepattributes Signature').
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
(http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)
Note: there were 6 unkept descriptor classes in kept class members.
You should consider explicitly keeping the mentioned classes
(using '-keep').
java.io.IOException: Please correct the above warnings first.
(http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)
Note: there were 9 library classes explicitly being kept.
at proguard.Initializer.execute(Initializer.java:473)
You don't need to keep library classes; they are already left unchanged.
at proguard.ProGuard.initialize(ProGuard.java:233)
(http://proguard.sourceforge.net/manual/troubleshooting.html#libraryclass)
at proguard.ProGuard.execute(ProGuard.java:98)
Note: there were 9 unresolved dynamic references to classes or interfaces.
at proguard.ProGuard.main(ProGuard.java:538)
You should check if you need to specify additional program jars.
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)
Note: there were 4 accesses to class members by means of introspection.
You should consider explicitly keeping the mentioned class members
(using '-keep' or '-keepclassmembers').
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclassmember)
(CoreApp.Droid)

Configuration

Version of the Plugin: 1.4.1

Platform: Android

Device: any

Galaxy S5 Neo

I noticed a Google Play crash report for a Galaxy S5 Neo device. AFAIK this device does not have a fingerprint scanner. I don't own a Galaxy S5 Neo so I am unable to reproduce/debug this directly but I found the same crash report for this device in TestCloud.

Steps to reproduce

  1. Start fingerprint on Samsung Galaxy S5 Neo

Expected behavior

Fingerprint is not available and app should continue

Actual behavior

App crashes

Crashlog

MvvmCross.Platform.Exceptions.MvxException: Failed to construct and initialize ViewModel for type SetupWizardViewModel from locator MvxDefaultViewModelLocator - check InnerException for more information ---> MvvmCross.Platform.Exceptions.MvxException: Problem running viewModel lifecycle of type SetupWizardViewModel ---> System.AggregateException: One or more errors occurred. ---> Java.Lang.RuntimeException: Fingerprint Service is not running on the device.
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()(<01d641b861aa41a08c3977d4970a5f65>: 0)
at Java.Interop.JniEnvironment+InstanceMethods.CallBooleanMethod(Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method)(<49e0625717b449b49bb626c364463a5a>: 0)
at Android.Runtime.JNIEnv.CallBooleanMethod(System.IntPtr jobject, System.IntPtr jmethod)(<40271dd77dc34a1db428a92c6619a155>: 0)
at Com.Samsung.Android.Sdk.Pass.SpassFingerprint.get_HasRegisteredFinger()(C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Android.Samsung\obj\Release\generated\src\Com.Samsung.Android.Sdk.Pass.SpassFingerprint.cs: 482)
at Plugin.Fingerprint.Samsung.SamsungFingerprintImplementation+d__10.MoveNext()(<7c1c577fb1eb46b3b300c7b2befdf740>: 0)
at --- End of stack trace from previous location where exception was thrown ---(Async call boundary: )
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()(<01d641b861aa41a08c3977d4970a5f65>: 0)
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task task)(<01d641b861aa41a08c3977d4970a5f65>: 0)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task task)(<01d641b861aa41a08c3977d4970a5f65>: 0)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task task)(<01d641b861aa41a08c3977d4970a5f65>: 0)
at System.Runtime.CompilerServices.TaskAwaiter1[TResult].GetResult()(<01d641b861aa41a08c3977d4970a5f65>: 0) at Plugin.Fingerprint.Abstractions.FingerprintImplementationBase+<IsAvailableAsync>d__2.MoveNext()(C:\Projekte\xamarin-fingerprint\src\Plugin.Fingerprint.Abstractions\FingerprintImplementationBase.cs: 23) at --- End of stack trace from previous location where exception was thrown ---(Async call boundary: ) at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()(<01d641b861aa41a08c3977d4970a5f65>: 0) at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task task)(<01d641b861aa41a08c3977d4970a5f65>: 0) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task task)(<01d641b861aa41a08c3977d4970a5f65>: 0) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task task)(<01d641b861aa41a08c3977d4970a5f65>: 0) at System.Runtime.CompilerServices.TaskAwaiter1[TResult].GetResult()(<01d641b861aa41a08c3977d4970a5f65>: 0)
at SetupWizardViewModel+c__AnonStorey6+c__async5.MoveNext()(/Repos/SetupWizard/SetupWizardViewModel.cs: 95)
:
at System.Threading.Tasks.Task.ThrowIfExceptional(System.Boolean includeTaskCanceledExceptions)(<01d641b861aa41a08c3977d4970a5f65>: 0)
at System.Threading.Tasks.Task.Wait(System.Int32 millisecondsTimeout, System.Threading.CancellationToken cancellationToken)(<01d641b861aa41a08c3977d4970a5f65>: 0)
at System.Threading.Tasks.Task.Wait()(<01d641b861aa41a08c3977d4970a5f65>: 0)
atSetupWizardViewModel.InitWizardViewModels()(/Repos/SetupWizardViewModel.cs: 100)
at ViewModels.BaseWizardPresentingViewModel.Start()(/Repos/BaseWizardPresentingViewModel.cs: 17)
at SetupWizardViewModel.Start()(/Repos/SetupWizardViewModel.cs: 36)
at MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.RunViewModelLifecycle(MvvmCross.Core.ViewModels.IMvxViewModel viewModel, MvvmCross.Core.ViewModels.IMvxBundle parameterValues, MvvmCross.Core.ViewModels.IMvxBundle savedState)(<69bce0378e8e413982d3b552d7e387a8>: 0)
:
at MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.RunViewModelLifecycle(MvvmCross.Core.ViewModels.IMvxViewModel viewModel, MvvmCross.Core.ViewModels.IMvxBundle parameterValues, MvvmCross.Core.ViewModels.IMvxBundle savedState)(<69bce0378e8e413982d3b552d7e387a8>: 0)
at MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load(System.Type viewModelType, MvvmCross.Core.ViewModels.IMvxBundle parameterValues, MvvmCross.Core.ViewModels.IMvxBundle savedState)(<69bce0378e8e413982d3b552d7e387a8>: 0)
at MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel(MvvmCross.Core.ViewModels.MvxViewModelRequest request, MvvmCross.Core.ViewModels.IMvxBundle savedState, MvvmCross.Core.ViewModels.IMvxViewModelLocator viewModelLocator)(<69bce0378e8e413982d3b552d7e387a8>: 0)
:
at MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel(MvvmCross.Core.ViewModels.MvxViewModelRequest request, MvvmCross.Core.ViewModels.IMvxBundle savedState, MvvmCross.Core.ViewModels.IMvxViewModelLocator viewModelLocator)(<69bce0378e8e413982d3b552d7e387a8>: 0)
at MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel(MvvmCross.Core.ViewModels.MvxViewModelRequest request, MvvmCross.Core.ViewModels.IMvxBundle savedState)(<69bce0378e8e413982d3b552d7e387a8>: 0)
at MvvmCross.Droid.Views.MvxAndroidViewsContainer.ViewModelFromRequest(MvvmCross.Core.ViewModels.MvxViewModelRequest viewModelRequest, MvvmCross.Core.ViewModels.IMvxBundle savedState)(: 0)
at MvvmCross.Droid.Views.MvxAndroidViewsContainer.CreateViewModelFromIntent(Android.Content.Intent intent, MvvmCross.Core.ViewModels.IMvxBundle savedState)(: 0)
at MvvmCross.Droid.Views.MvxAndroidViewsContainer.Load(Android.Content.Intent intent, MvvmCross.Core.ViewModels.IMvxBundle savedState, System.Type viewModelTypeHint)(: 0)
at MvvmCross.Droid.Views.MvxActivityViewExtensions.LoadViewModel(MvvmCross.Droid.Views.IMvxAndroidView androidView, MvvmCross.Core.ViewModels.IMvxBundle savedState)(: 0)
at MvvmCross.Droid.Views.MvxActivityViewExtensions+<>c__DisplayClass1_0.b__1()(: 0)
at MvvmCross.Core.Views.MvxViewExtensionMethods.OnViewCreate(MvvmCross.Core.Views.IMvxView view, System.Func1[TResult] viewModelLoader)(<69bce0378e8e413982d3b552d7e387a8>: 0) at MvvmCross.Droid.Views.MvxActivityViewExtensions.OnViewCreate(MvvmCross.Droid.Views.IMvxAndroidView androidView, Android.OS.Bundle bundle)(<f6aebf863dc84be7b380cfec8d459508>: 0) at MvvmCross.Droid.Views.MvxActivityAdapter.EventSourceOnCreateCalled(System.Object sender, MvvmCross.Platform.Core.MvxValueEventArgs1[T] eventArgs)(: 0)
at (wrapper delegate-invoke) System.EventHandler1[MvvmCross.Platform.Core.MvxValueEventArgs1[Android.OS.Bundle]]:invoke_void_object_TEventArgs(object,MvvmCross.Platform.Core.MvxValueEventArgs1<Android.OS.Bundle>)(: ) at MvvmCross.Platform.Core.MvxDelegateExtensionMethods.Raise[T](System.EventHandler1[TEventArgs] eventHandler, System.Object sender, T value)(D:\git\MvvmCross\MvvmCross\Platform\Platform\Core\MvxDelegateExtensionMethods.cs: 21)
at MvvmCross.Droid.Support.V4.EventSource.MvxEventSourceFragmentActivity.OnCreate(Android.OS.Bundle bundle)(: 0)
at MvvmCross.Droid.Support.V4.MvxCachingFragmentActivity.OnCreate(Android.OS.Bundle bundle)(: 0)
at MvxStateSavingCompatView1[T].OnCreate(Android.OS.Bundle savedInstanceState)(/Repos/MvxStateSavingCompatView.cs: 48) at BaseView1[T].OnCreate(Android.OS.Bundle savedInstanceState)(/Repos/BaseView.cs: 83)
at SetupWizardView.OnCreate(Android.OS.Bundle savedInstanceState)(/Repos/SetupWizardView.cs: 55)
at Android.Support.V4.App.FragmentActivity.n_OnCreate_Landroid_os_Bundle_(System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState)(<7a2a36256f1648ecbd0c15a75bc5a349>: 0)
at (wrapper dynamic-method) System.Object:d30270a0-8b89-4200-aa88-2dde3d5f4a32(intptr,intptr,intptr)(: )
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1199)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method: )
at java.lang.reflect.Method.invoke(Method.java: 372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1404)
at ... 1 more(: )
CRASH: Crash in native code
============PushLog. stop!
[1][CommonFeature] ###versionCode : 115073101, CONTACT_PROFILE_SERVICE_ENABLE : true, FREE_MESSAGE_ENABLE : false
[1][CommonFeature] ###versionCode : 115073101, CONTACT_PROFILE_SERVICE_ENABLE : true, FREE_MESSAGE_ENABLE : false
[ELog][1][EasySignUp] [NotRegistered][012c34e954a8aa3a7bfe65a18da7d33ff7516ef282]

Configuration

Version of the Plugin:
1.4.2

Platform:
Android 5.1.1

Device:
Samsung Galaxy S5 Neo

A few small recommendations

First, this is awesome!

Just reading through at a high level the implementation and code could I recommend some of the following:

  1. Current Activity Resolver: I think this may be a bit problematic as the Activity can change from time to time. Would it just be easier to have it use CrossCurrentActivity and have no additional setup?
  2. Is it necessary to actually have the Mvx Plugin? If you do ^ then there would be no need and no need to manage multiple nuget packages since all Plugins for Xamarin are Mvx Compatible.
  3. Add Permission Automatically: See how I do it here for Android: https://github.com/jamesmontemagno/Xamarin.Plugins/blob/master/Contacts/Contacts/Contacts.Plugin.Android/Properties/AssemblyInfo.cs#L32 and this would get ride of your checks in "CheckAvailability" in your android project
  4. Perhaps breaking IsAvailable into multiple bool properties for "HasSensor", "IsEnrolled" and IsAvailable would be all of these combined.
  5. Adjust logo based on branding guidelines: https://xamarin.com/branding I would just use the fingerprint logo without the xamagon.
  6. Add blank implementations for anything not supported (this way it doesn't throw an exception) and would just return false or is not available. You can see what I did with my permissions plugin.

The other things that would be nice if just naming convention to match what I am trying to have everyone standardize on to make it really easy for devs to get running:

  1. Namespace: Plugin.Fingerprint
  2. Singleton Class: I really like "Cross"+FeatureName, but that is me, so "CrossFingerprint" not sure why I went with this originally, but it kind of stuck.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.