Managing OkCollect start requirements

How to ensure all conditions are met before starting the address creation process

Managing start requirements

For OkCollect to run effectively the following conditions must be met:

  1. User grants location permission

  2. Location services must be turned on

  3. Google Play Services must be available

Luckily the OkHiCore library has helper methods to assist you with these requirements.

Configure OkCollect to receive permissions and activity results

public class MainActivity extends AppCompatActivity {
  
    private OkHi okhi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        okhi = new OkHi(this);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // Pass permission results to okcollect
        okhi.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Pass activity results results to okcollect
        okhi.onActivityResult(requestCode, resultCode, data);
    }
}

Check and request for OkCollect start requirements

public class MainActivity extends AppCompatActivity {
    OkCollect okCollect;
    OkHi okhi;

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

        OkHiTheme theme = new OkHiTheme.Builder("#ba0c2f")
                .setAppBarLogo("https://cdn.okhi.co/icon.png")
                .setAppBarColor("#ba0c2f")
                .build();

        OkHiConfig config = new OkHiConfig.Builder()
                .withStreetView()
                .build();

        try {
            okhi = new OkHi(this);
            okCollect = new OkCollect.Builder(this)
                .withTheme(theme)
                .withConfig(config)
                .build();
        } catch (OkHiException exception) {
            exception.printStackTrace();
        }
    }

    //start the address creation flow
    private void launchOkCollect(){
        boolean canStartOkCollect = canStartAddressCreation();
        if(canStartOkCollect) {
            final OkHiUser user = new OkHiUser.Builder("+254711234567")
                    .withFirstName("Juliet")
                    .withLastName("Zuri")
                    .build();
            okCollect.launch(user, new OkCollectCallback<OkHiUser, OkHiLocation>() {
                @Override
                public void onSuccess(OkHiUser user, OkHiLocation location) {
                    showMessage(user.getPhone() + " " + location.getId());
                }

                @Override
                public void onError(OkHiException e) {
                    showMessage(e.getCode() + " " + e.getMessage());
                }
            });
        }
    }
    private void showMessage(String log){
        Toast.makeText(MainActivity.this,log,Toast.LENGTH_LONG).show();
    }

    //handler class that extends OkHiRequestHandler
    class Handler implements OkHiRequestHandler<Boolean> {
        @Override
        public void onResult(Boolean result) {
            if (result) launchOkCollect();
        }
        @Override
        public void onError(OkHiException exception) {
            showMessage(exception.getMessage());
        }
    }

    // Define a method you'll use to check if conditions are met to start address creation
    private boolean canStartAddressCreation() {
        Handler requestHandler = new Handler();
        // Check and request user to enable location services
        if (!OkHi.isLocationServicesEnabled(getApplicationContext())) {
            okhi.requestEnableLocationServices(requestHandler);
        } else if (!OkHi.isGooglePlayServicesAvailable(getApplicationContext())) {
            // Check and request user to enable google play services
            okhi.requestEnableGooglePlayServices(requestHandler);
        } else if (!OkHi.isLocationPermissionGranted(getApplicationContext())) {
            // Check and request user to grant location permission
            okhi.requestLocationPermission("Hey we need location permissions", "Pretty please..", requestHandler);
        } else {
            return true;
        }
        return false;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // Pass permission results to okcollect
        okhi.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Pass activity results results to okcollect
        okhi.onActivityResult(requestCode, resultCode, data);
    }

    public void handleButtonTap(View view) {
        launchOkCollect();
    }
}

Last updated