Пользовательский модуль Appcelerator, получающий обратный вызов для onActivityResult - PullRequest
2 голосов
/ 07 марта 2011

Я пытаюсь создать собственный модуль в Appcelerator для нового Square API для Android.У меня все так, как я хочу, но главная проблема в том, что я хочу иметь возможность уведомить звонящего о том, что платеж прошел успешно, если он не прошел.API-интерфейс Square говорит следующее:

После завершения Square Android вызывает Activity.onActivityResult () для действия, переданного конструктору.Код запроса, переданный этому методу, будет передан onActivityResult ().Код результата - Activity.RESULT_CANCELED, если платеж был отменен, или Activity.RESULT_OK, если платеж прошел успешно.

Я передал TiContext.currentActivity конструктору:

public SquareModule(TiContext tiContext) {
    super(tiContext);

    ourSquare = new Square(tiContext.getActivity());
}   

И затем в методе, который фактически выполняет платеж, у меня есть то, что в основном пытается установить переданный обратный вызов для обработчиков onResult текущего действия, используя registerResultHandler в классе TiActivitySupportHelper.

    public void runPayment(KrollInvocation invocation, int price, String description, KrollCallback handler) {
        Log.i(LCAT, "runPayment called");

        // Register the passed in function as a handler on the onResult stack

        this.resultCallback = handler;
        Activity activity = invocation.getTiContext().getActivity();
        TiActivitySupportHelper support = new TiActivitySupportHelper(activity);
        int code = support.getUniqueResultCode();
        support.registerResultHandler(code, this);

                // Some of the payment work here

        ourSquare.squareUp(Bill.containing(advice), code);
    }

Класс основного модуля реализует TiActivityResultHandler и реализует onResult и onError.Эти методы не вызываются вообще.И, конечно, переданный метод также не вызывается.

Для полноты информации см. Реализацию обработчиков onResult и onError:

@Override
public void onResult(Activity activity, int requestCode, int resultCode, Intent data)
{
    Log.i(LCAT, "onResult Called");
    if (resultCallback == null) return;
    KrollDict event = new KrollDict();
    event.put(TiC.EVENT_PROPERTY_REQUEST_CODE, requestCode);
    event.put(TiC.EVENT_PROPERTY_RESULT_CODE, resultCode);
    event.put(TiC.EVENT_PROPERTY_INTENT, new IntentProxy(getTiContext(), data));
    event.put(TiC.EVENT_PROPERTY_SOURCE, this);
    resultCallback.callAsync(event);
}

@Override
public void onError(Activity activity, int requestCode, Exception e)
{
    Log.i(LCAT, "onError Called");
    if (resultCallback == null) return;
    KrollDict event = new KrollDict();
    event.put(TiC.EVENT_PROPERTY_REQUEST_CODE, requestCode);
    event.put(TiC.EVENT_PROPERTY_ERROR, e.getMessage());
    event.put(TiC.EVENT_PROPERTY_SOURCE, this);
    resultCallback.callAsync(event);
}

А также посмотрите, как JS Appcelerator вызываетМетод в модуле:

square.runPayment(2, 'Testing123', function(e) {
    label1.text = 'Payment Successful!';
});

1 Ответ

4 голосов
/ 11 марта 2011

Для тех, кто сталкивается с этим вопросом. Ответ можно найти в модуле здесь: https://github.com/hidef/Appcelerator-Square-Module (см. Класс LaunchSquare.java)

По сути, я использовал объект Activity, который я создал, чтобы получать обновление onResult от Square API. Затем я смог передать это обратно классу модуля и передать обратно через обратный вызов вызывающему приложению.

...