Promise<Object> (final PlaybackContext context, final String text) { final ActionCallback result = new ActionCallback(); inWriteSafeContext(() -> { TypingTarget typingTarget = findTarget(context); if (typingTarget != null) { typingTarget.type(text).doWhenDone(result.createSetDoneRunnable()).doWhenRejected(() -> typeByRobot(context.getRobot(), text).notify(result)); } else { typeByRobot(context.getRobot(), text).notify(result); } }); return Promises.toPromise(result); }