@Override
  public void onCalculatorEvent(
      @Nonnull CalculatorEventData calculatorEventData,
      @Nonnull CalculatorEventType calculatorEventType,
      @Nullable Object data) {
    final Context context;

    final Object source = calculatorEventData.getSource();
    if (source instanceof Context) {
      context = ((Context) source);
    } else {
      context = App.getApplication();
    }

    switch (calculatorEventType) {
      case show_create_matrix_dialog:
        App.getUiThreadExecutor()
            .execute(
                new Runnable() {
                  @Override
                  public void run() {
                    final Intent intent = new Intent(context, CalculatorMatrixActivity.class);
                    Android.addIntentFlags(intent, false, context);
                    context.startActivity(intent);
                  }
                });
        break;
      case show_create_var_dialog:
        App.getUiThreadExecutor()
            .execute(
                new Runnable() {
                  @Override
                  public void run() {
                    CalculatorActivityLauncher.tryCreateVar(context);
                  }
                });
        break;
      case show_create_function_dialog:
        App.getUiThreadExecutor()
            .execute(
                new Runnable() {
                  @Override
                  public void run() {
                    CalculatorActivityLauncher.tryCreateFunction(context);
                  }
                });
        break;
      case show_evaluation_error:
        final String errorMessage = (String) data;
        if (errorMessage != null) {
          App.getUiThreadExecutor()
              .execute(
                  new Runnable() {
                    @Override
                    public void run() {
                      showEvaluationError(context, errorMessage);
                    }
                  });
        }
        break;
      case show_wiki_description:
        App.getUiThreadExecutor()
            .execute(
                new Runnable() {
                  @Override
                  public void run() {
                    final Intent intent = new Intent(context, CalculatorWikiActivity.class);
                    Android.addIntentFlags(intent, false, context);
                    context.startActivity(intent);
                  }
                });
        break;
      case show_message_dialog:
        final DialogData dialogData = (DialogData) data;
        if (dialogData != null) {
          App.getUiThreadExecutor()
              .execute(
                  new Runnable() {
                    @Override
                    public void run() {
                      CalculatorDialogActivity.showDialog(context, dialogData);
                    }
                  });
        }
        break;
    }
  }