Callbacks on Android

Prev Next

ExtendedObserver interface

The ExtendedObserver interface contains only one method: handleCallback(CallbackData data). The CallbackData object contains all information supplied for a given callback.

Security and priority are equally important in App Shielding. The EXIT reaction is safer than a callback and has therefore precedence over a callback. To reach the place in the code with the callback, the EXIT reaction that corresponds to this detection should be turned off.

CallbackData class

The CallbackData class serves as a base class for other classes that contain data for specific callbacks. These inherited classes reside in the no.promon.shield.callbacks package and have a ...Data suffix, for example RootingData or RepackagingData.

Each callback has a type, represented by enumCallbackType and is available via the CallbackData.getCallbackType() method call. Based on the return value of the CallbackData.getCallbackType() call, the callback handler can cast the CallbackData object to the correct descending type that contains the data for the callback.

If CallbackData.getCallbackType() returned CallbackType.ROOTING, the callback handler should cast the CallbackData object to the RootingData object and then, using methods of the RootingData class, retrieve information specific to the ROOTING callback.

For more information about callback data classes and callback types, see CallbackType enum.

Example code

Java

public class ExtendedObserverImplementation implements ExtendedObserver {
                    public void handleCallback(CallbackData data) {
                    switch (data.getCallbackType()) {
                    case ROOTING: {
                    RootingData callbackData = (RootingData) data;
                    handleRootingCallback(
                    callbackData.isDeviceCertainlyRooted(),
                    callbackData.getRootingProbability());
                    break;
                    }
                    case HOOKING_FRAMEWORKS: {
                    HookingFrameworksData callbackData = (HookingFrameworksData) data;
                    handleHookingFrameworksCallback(
                    callbackData.areHookingFrameworksPresent(),
                    callbackData.getLastUsedDetectionMethodCode());
                    break;
                    }
                    ...
                    }
                    }
                    ...
                    }
                    ...
                    ExtendedObserver observer = new ExtendedObserverImplementation();
                    CallbackManager.addObserver(context, observer);

Kotlin

class ExtendedObserverImplementation : ExtendedObserver {
                    override fun handleCallback(data: CallbackData) {
                    when (data?.callbackType) {
                    CallbackType.ROOTING -> {
                    val callbackData = data as RootingData
                    handleRootingCallback(
                    callbackData.isDeviceCertainlyRooted,
                    callbackData.rootingProbability
                    )
                    }
                    CallbackType.HOOKING_FRAMEWORKS -> {
                    val callbackData = data as HookingFrameworksData
                    handleHookingFrameworksCallback(
                    callbackData.areHookingFrameworksPresent()
                    callbackData.getLastUsedDetectionMethodCode()
                    )
                    }
                    ...
                    else -> {
                    ...
                    }
                    }
                    }
                    ...
                    }
                    ...
                    val observer: ExtendedObserver = ExtendedObserverImplementation()
                    CallbackManager.addObserver (context, observer)