Saltar al contenido

Crear una fase asincrónica personalizada en Flow

Haga clic derecho en el paquete com.sap.flows y seleccione Nuevo> Actividad> Actividad vacía. Nombra la actividad CustomActivity.

Reemplazar el código CustomActivity con el código de abajo.

package com.sap.flows;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class CustomActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom);
    }

    public void onFinishSuccess(View v){
        setResult(-1);
        finish();
    }

    public void onFinishFailure(View v){
        setResult(1);
        finish();
    }
}

El es CustomActivity la clase aplica métodos que serán llamados cuando se realicen los pasos del flujo. El es onSuccess la llamada debe ser -1 setResult argumento, mientras que otras funciones pueden tener un número entero positivo.

Agrega el contenido de res/layout/activity_custom.xml con el siguiente código.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CustomActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/finishSuccess"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Finish with Success"
        android:onClick="onFinishSuccess"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="0dp" />
    <Button
        android:id="@+id/finishFail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Finish with Failure"
        android:onClick="onFinishFailure"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="0dp" />
</LinearLayout>

Esto crea un diseño de pantalla de actividad que consta de 2 botones para probar la actividad personalizada.

Crea una clase llamada CustomStep y reemplace el código generado con lo siguiente.

package com.sap.flows;

import com.sap.cloud.mobile.flow.AsyncResultStep;
import com.sap.cloud.mobile.flow.FlowContext;
import com.sap.cloud.mobile.flow.FlowManagerException;
import com.sap.cloud.mobile.flow.ResultActionHandler;
import com.sap.cloud.mobile.flow.StepActionHandler;
import com.sap.cloud.mobile.flow.StepName;
import com.sap.cloud.mobile.flow.onboarding.OnboardingContext;
import com.sap.cloud.mobile.flow.onboarding.presenter.FlowPresentationActionHandler;
import com.sap.cloud.mobile.flow.onboarding.presenter.FlowPresentationContext;

public class CustomStep implements AsyncResultStep {
    private OnboardingContext context;
    private StepActionHandler actionHandler;

    @StepName("custom")
    public void launchActivity(FlowContext flowContext, StepActionHandler stepActionHandler){
        context = (OnboardingContext) flowContext;
        actionHandler = stepActionHandler;
        FlowPresentationActionHandler flowPresentationActionHandler = context.getFlowPresenationActionHandler();
        if (flowPresentationActionHandler != null) {
            flowPresentationActionHandler.present(10000, CustomActivity.class.getName());
        } else {
            actionHandler.onFailure(new IllegalArgumentException("FlowPresentationActionHandler Expected"));
        }
    }

    @Override
    public ResultActionHandler getResultActionHandler() {
        return new ResultActionHandler() {
            @Override
            public void onResult(FlowContext flowContext) {
                if (((FlowPresentationContext) flowContext).getResultCode() == -1) {
                    actionHandler.onSuccess(context);
                } else {
                    actionHandler.onFailure(new FlowManagerException("Failed",flowContext));
                }
            }
        };
    }
  }

Tenga en cuenta que en el CustomStep clases @StepName se agrega la anotación. El método se ejecutará cuando CustomStep clase incluida en el flujo con nombre nombrado.

Agrega los siguientes métodos MainActivity.java.

private void startCustomFlow() {
    Flow flow = new Flow("custom");
    flow.setSteps(new Step[] {
        new CustomStep()  // shows finish on success or failure button screen
    });

    flowManagerService.execute(flow, flowContext, new FlowActionHandler() {
        @Override
        public void onFailure(Throwable t) {
            LOGGER.debug("onFailure in custom called: " + t);
            showAlertDialog("Custom", t);
        }

        @Override
        public void onSuccess(FlowContext result) {
            LOGGER.debug("Custom flow completed successfully.");
        }
    });
}

public void onCustom(View v) {
    startCustomFlow();
}

Agrega el siguiente código activity_main.xml debajo de las etiquetas de Otros botones.

<Button
    android:id="@+id/b_custom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onCustom"
    android:text="Custom" />