Appcelerator で新しい Square API for Android 用のカスタム モジュールを作成しようとしています。私は思い通りにすべてを持っていますが、主な問題は、支払いが失敗した場合に、支払いが成功したことを発信者に通知できるようにしたいということです。Square API は次のように述べています。
Square が終了すると、Android はコンストラクターに渡されたアクティビティで Activity.onActivityResult() を呼び出します。このメソッドに渡されたリクエスト コードは onActivityResult() に渡されます。リザルト コードは、支払いがキャンセルされた場合は Activity.RESULT_CANCELED、支払いが成功した場合は Activity.RESULT_OK です。
TiContext.currentActivity をコンストラクターに渡しています。
public SquareModule(TiContext tiContext) {
super(tiContext);
ourSquare = new Square(tiContext.getActivity());
}
そして、実際に支払いを実行するメソッドでは、TiActivitySupportHelper クラスの registerResultHandler を使用して、渡されたコールバックを現在のアクティビティの onResult ハンドラに基本的に設定しようとします。
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);
}
また、モジュール内のメソッドを呼び出している Appcelerator JS も参照してください。
square.runPayment(2, 'Testing123', function(e) {
label1.text = 'Payment Successful!';
});