@Override protected boolean startInternal() { HardwareWalletEvents.subscribe(this); isRegistered = true; return false; }
/** * <p>Unsubscribe all subscribers from events</p> * <p>This approach ensures all subscribers will be correctly removed during a shutdown or wizard hide event</p> */ @SuppressWarnings("unchecked") public static void unsubscribeAll() { Set allSubscribers = Sets.newHashSet(); allSubscribers.addAll(hardwareWalletEventBusSubscribers); for (Object subscriber : allSubscribers) { unsubscribe(subscriber); } allSubscribers.clear(); log.info("All subscribers removed"); }
/** * <p>Reset the context back to the initialised state (standard awaiting state with features)</p> */ public void resetToInitialised() { log.debug("Reset to 'initialised'"); // Clear relevant information resetAllButFeatures(); // Perform the state change currentState = HardwareWalletStates.newInitialisedState(); // Fire the high level event HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_DEVICE_READY, features.get(), client.name()); }
/** * <p>Stop the service</p> */ public void stopAndWait() { log.debug("Service {} stopping...", this.getClass().getSimpleName()); context.resetToStopped(); // Ensure downstream subscribers are purged HardwareWalletEvents.unsubscribeAll(); MessageEvents.unsubscribeAll(); try { clientMonitorService.awaitTermination(1, TimeUnit.SECONDS); } catch (InterruptedException e) { log.warn("Client monitor thread did not terminate within the allowed time"); } stopped = true; }
public void stop() { log.debug("Stopping MultiBit HD"); mainController = null; // Final purge in case anything gets missed ViewEvents.unsubscribeAll(); ControllerEvents.unsubscribeAll(); CoreEvents.unsubscribeAll(); HardwareWalletEvents.unsubscribeAll(); }
/** * @param wizardModel The overall wizard data model containing the aggregate information of all components in the wizard * @param isExiting True if the exit button should trigger an application shutdown * @param wizardParameter An optional parameter that can be referenced during construction * @param escapeIsCancel A press of the ESC key cancels the wizard */ protected AbstractHardwareWalletWizard(M wizardModel, boolean isExiting, Optional wizardParameter, boolean escapeIsCancel) { super(wizardModel, isExiting, wizardParameter, escapeIsCancel); // All hardware wallet wizards can receive hardware wallet events HardwareWalletEvents.subscribe(this); }
/** * <p>Reset the context back to a detached state (no device information)</p> */ public void resetToDetached() { log.debug("Reset to 'detached'"); // Clear relevant information resetAll(); // Perform the state change currentState = HardwareWalletStates.newDetachedState(); // Fire the high level event HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_DEVICE_DETACHED, client.name()); }
/** * Unregister from hardware wallet events - called during the hide process */ @Override public void unsubscribe() { super.unsubscribe(); HardwareWalletEvents.unsubscribe(this); }
private void create(KeepKeyV1HidHardwareWallet hardwareWallet, int portNumber) { this.hardwareWallet = hardwareWallet; this.portNumber = portNumber; // Subscribe to the high level events from the client HardwareWalletEvents.subscribe(this); serverExecutorService.submit( new Runnable() { @Override public void run() { start(); } }); }
/** * <p>Reset the context back to a failed state (retain device information but prevent further communication)</p> */ public void resetToFailed() { log.debug("Reset to 'failed'"); // Clear relevant information resetAllButFeatures(); // Perform the state change currentState = HardwareWalletStates.newFailedState(); // Fire the high level event HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_DEVICE_FAILED, client.name()); }
@Override protected boolean shutdownNowInternal(ShutdownEvent.ShutdownType shutdownType) { switch (shutdownType) { case HARD: case SOFT: if (isRegistered) { // Unsubscribe from hardware wallet events HardwareWalletEvents.unsubscribe(this); isRegistered = false; } // Allow ongoing cleanup return true; case SWITCH: // Clear all the events to prevent inaccurate UI latestBitcoinNetworkChangedEvent = Optional.absent(); latestExchangeRateChangedEvent = Optional.absent(); latestHardwareWalletEvent = Optional.absent(); latestEnvironmentEvent = Optional.absent(); // Avoid ongoing cleanup return false; default: throw new IllegalStateException("Unsupported state: " + shutdownType.name()); } }
private void create(TrezorV1HidHardwareWallet hardwareWallet, int portNumber) { this.hardwareWallet = hardwareWallet; this.portNumber = portNumber; // Subscribe to the high level events from the client HardwareWalletEvents.subscribe(this); serverExecutorService.submit( new Runnable() { @Override public void run() { start(); } }); }
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case PIN_MATRIX_REQUEST: // Device is asking for a PIN matrix to be displayed (user must read the screen carefully) HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); // Further state transitions will occur after the user has provided the PIN via the service break; case PASSPHRASE_REQUEST: // Device is asking for a passphrase screen to be displayed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PASSPHRASE_ENTRY, client.name()); // Further state transitions will occur after the user has provided the passphrase via the service break; case ENTROPY_REQUEST: // Device is asking for additional entropy from the user HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.PROVIDE_ENTROPY, client.name()); // Further state transitions will occur after the user has provided the entropy via the service break; case FAILURE: // User has cancelled or operation failed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
/** * Unsubscribe from events (this controller is no longer required) */ public void unsubscribe() { ControllerEvents.unsubscribe(this); CoreEvents.unsubscribe(this); HardwareWalletEvents.unsubscribe(this); }
public AbstractView() { // All views are registered for ViewEvents ViewEvents.subscribe(this); // All views are registered for Controller events ControllerEvents.subscribe(this); // All views are registered for hardware events HardwareWalletEvents.subscribe(this); }
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case PIN_MATRIX_REQUEST: // Device is asking for a PIN matrix to be displayed (user must read the screen carefully) HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); // Further state transitions will occur after the user has provided the PIN via the service break; case PASSPHRASE_REQUEST: // Device is asking for a passphrase screen to be displayed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PASSPHRASE_ENTRY, client.name()); // Further state transitions will occur after the user has provided the passphrase via the service break; case PUBLIC_KEY: // Device has completed the operation and provided a public key HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.PUBLIC_KEY, event.getMessage().get(), client.name()); break; case FAILURE: // User has cancelled or operation failed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
public void unregister() { ViewEvents.unsubscribe(this); ControllerEvents.unsubscribe(this); HardwareWalletEvents.unsubscribe(this); }
public AbstractController() { // All controllers are registered for Controller events ControllerEvents.subscribe(this); // All controllers are registered for Core events CoreEvents.subscribe(this); // All controllers are registered for hardware events // this allows easier targeting of specific event state // handling (e.g. alerts for attach/detach, wizards for PIN etc) HardwareWalletEvents.subscribe(this); }
case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PASSPHRASE_ENTRY, client.name()); HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.PUBLIC_KEY_FOR_IDENTITY, event.getMessage().get(), client.name()); break; case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
public KeepKeyService() { wallet = HardwareWallets.newUsbInstance( KeepKeyV1HidHardwareWallet.class, Optional.<Integer>absent(), Optional.<Integer>absent(), Optional.<String>absent() ); // Wrap the hardware wallet in a suitable client to simplify message API client = new KeepKeyHardwareWalletClient(wallet); deviceLabel = AgentConstants.KEEPKEY_LABEL; // set default name before real one is obtained from HW // Wrap the client in a service for high level API suitable for downstream applications hardwareWalletService = new HardwareWalletService(client); hardwareWalletService.start(); HardwareWalletEvents.subscribe(this); asyncKeyData = new ReadDeviceData<String>(); asyncSignData = new ReadDeviceData<byte[]>(); Logger.getLogger(KeepKeyService.class.getName()).log(Level.INFO, "KeepKey Service Started"); }