@Override public void run() { // Note: If an unhandled error occurs in a scheduled exception // it causes all future requests to be suppressed // We want to alert the user to a failure and keep active // to avoid "silent failures" try { // It if we are in the await state then we use a client // call (e.g. initialise()) to poke the device to elicit // a low level message response context.getState().await(context); } catch (RuntimeException e) { log.error("Unexpected error transitioning between states", e); // Trigger a failure mode context.resetToFailed(); } } },
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case DEVICE_FAILED: context.resetToFailed(); break; case DEVICE_DETACHED: // Do nothing break; case DEVICE_ATTACHED: context.resetToAttached(); break; default: handleUnexpectedMessageEvent(context, event); } } }
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case FEATURES: Features features = (Features) event.getMessage().get(); context.setFeatures(features); // Verify the Features through the client if (!client.verifyFeatures(features)) { features.setSupported(false); context.resetToFailed(); } else { features.setSupported(true); context.resetToInitialised(); } break; case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
@Override public void transition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { // Handle low level message events for the device switch (event.getEventType()) { case DEVICE_ATTACHED: context.resetToAttached(); return; case DEVICE_DETACHED: client.softDetach(); context.resetToDetached(); return; case DEVICE_CONNECTED: context.resetToConnected(); return; case DEVICE_DISCONNECTED: context.resetToDisconnected(); return; case DEVICE_FAILED: context.resetToFailed(); return; } // Must be unhandled to be here so rely on internal handler // provided by implementation internalTransition(client, context, event); }