The following are introduced in 9.0.0. The client SDKs are backwards compatible and you can continue to use the 8.0.1 APIs. However, there are new features and updated behavior detailed below that could affect your application and it is best to review to determine if any changes are needed:
Replace the m2repository folder from the extracted 8.0.1 package with the same folder from the 9.0.0 package.
In the app level build.gradle file, replace all 8.0.1.x versions with 9.0.0.x
To use Tutorial App version 8.0.1 with the SDK version 9.0.0, set the version number in AppSDK/android-studio/app_tutorial_plus/app/src/main/res/raw/config.json file to "9.0.0".
Classes extending from com.noknok.android.client.utils.BaseTask must implement the new method
void handleException(RuntimeException e, final Params... params);In class
com.noknok.android.client.utils.ActivityProxy
the startActivityForResult() method now takes 2 parameters instead of 3. Remove the last (int timeout) parameter.The constructor for class:
com.noknok.android.client.appsdk.adaptive.authenticate.AuthenticationController
takes an extra argument suggestRegOpts of type HashMap <String, String>. Pass null if no options are expected.In class: com.noknok.android.client.appsdk.adaptive.authenticate.AuthenticationViewModel, the return type of the method getMethods() has changed.
Old return type: MutableLiveData<Pair<List<List<AdaptiveMethod>>, MethodUIFactory.Operation>>
New return type: MutableLiveData<AuthResultParam>In class:
com.noknok.android.client.appsdk.adaptive.register.RegistrationViewModel
the method setMethods() has two new parameters: ResultType resultType and String message.The class: com.noknok.android.client.utils.ActivityStarter has been removed. Use the class: com.noknok.android.client.utils.ActivityProxy instead.
The class: com.noknok.android.client.appsdk.adaptive.suggest.SuggestRegController has been deprecated. Use the class
com.noknok.android.client.appsdk.adaptive.suggest.SuggestRegistrationController
instead.In class: com.noknok.android.client.appsdk.adaptive.suggest.SuggestRegViewModel, the return type of the method getMethods() has changed.
Old return Type: MutableLiveData<List<List<AdaptiveMethod>>>
New return type: MutableLiveData<SuggestRegResultParam>In class: com.noknok.android.client.appsdk.adaptive.suggest.SuggestRegViewModel, the method setMethods() has two new parameters: ResultType resultType and String message.In class: com.noknok.android.client.appsdk_plus.registration.FidoRegistrationViewModel the return type of the method getFidoMethodsLiveData() has changed. Old return type: MutableLiveData<List<FidoMethod>> New return type: MutableLiveData<RegResultParam>In class: com.noknok.android.client.appsdk_plus.registration.FidoRegistrationViewModel the method setMethods() has two new parameters: ResultType resultType and String message.In class: com.noknok.android.client.appsdk_plus.management.ManageRegistrationViewModel the return type of the method getFidoMethodsLiveData() has changed. Old return Type: MutableLiveData<JSONArray> New return Type: MutableLiveData<ManageRegResultParam>In class com.noknok.android.client.appsdk_plus.management.ManageRegistrationViewModel the method setMethods() has two new parameters: ResultType resultType and String message.In interface com.noknok.android.client.appsdk_plus.IOperationResultListener, in the method onFailure(), the type of the parameter exception has changed. Old parameter type: AppSDKException New parameter type: RuntimeExceptionThe class AdaptiveAppSDK2 has been removed. Use class AppSDK2 instead.
In the abstract class:
com.noknok.android.client.appsdk.adaptive.MethodUIFactory
the method getTitle() takes one additional parameter: String name.
Old header: String getTitle(String id, Operation operation, Context context)
New header: String getTitle(String id, String name, Operation operation, Context context)
In class:
com.noknok.android.client.appsdk.adaptive.authenticate.BaseAdaptiveAuthFragment
the method enable() is deprecated. Instead, call AuthenticationController.enable() directly:
com.noknok.android.client.appsdk.adaptive.authenticate.BaseAdaptiveAuthFragment.getController().enable()
AutoStart.AUTO_ANY
The behavior of AutoStart.AUTO_ANY in class AuthenticationController is changed. If your application uses this mode for authentication then update your code to match the following behavior:
The promise returned by enable(AutoStart.AUTO_ANY) is rejected only if there is no possibility to complete authentication. If this promise is rejected, your application should not call enable(AutoStart.AUTO_NONE) because it results in an empty view.
The promise returned by enable(AutoStart.AUTO_ANY) is resolved even if authentication does not succeed and the session is still not available. If this is the case then more authentication methods can be used. Your application should call enable(AutoStart.AUTO_NONE) to get a list of all possible methods:
enable(requireActivity(), AUTO_ANY)
.then { autoAnyResult ->
if (autoAnyResult == null) {
//It is not possible to complete authentication with AUTO_ANY.
//Start AUTO_NONE to present the list of choices and continue
// authentication
showAdaptiveAuthFragment(getFragment())
controller.enable(requireActivity(), AUTO_NONE).then{}.error{}
} else {
//Authentication completed with AUTO_ANY
}
.error { failureResult ->
//It is not possible to complete authentication with any mode
//as there is not enough registered methods available to satisfy
//the adaptive ruleset.
}FidoRegistrationController and ManageRegistrationController no longer call onRefresh() after an operation is complete. If you only display the fragment from one of these controllers at a time, call onRefresh() on the respective controller when an operation is complete.
If you display the fragment from more than one controller at the same time, you need to ensure that a change in one fragment is reflected in all fragments. Instead of calling onRefresh() after each operation, create an OperationResultObserver object that implements the IOperationResultListener interface. Observe the LiveData field on the OperationResultObserver object to listen for the failure or completion of the operation. Then call the Controller.onOpCompleted() method from the observe() method to keep the fragments updated. Here is an example observe() method:
mOperationResultObserver = new OperationResultObserver();
OperationResultListener.addInstance(mOperationResultObserver);
mOperationResultObserver.getLiveData().observe(getViewLifecycleOwner(),
operationResult ->
mRegistrationController.onOpCompleted(requireActivity(),
mRegistrationViewModel, operationResult)
);A new function getIcon() is added to the MethodUIFactory protocol. If your application adopts the MethodUIFactory protocol then it must implement getIcon():
public abstract String getIcon(String id, String name, Context context)