riteshakya037/CustomFormViews

View on GitHub
sample/src/main/java/com/ritesh/customformviews/MainPresenterImpl.java

Summary

Maintainability
A
1 hr
Test Coverage
package com.ritesh.customformviews;

import android.os.Handler;
import android.view.View;

import com.ritesh.customfieldviews.CustomDateView;
import com.ritesh.customfieldviews.CustomSpinnerView;
import com.ritesh.customfieldviews.CustomTextView;
import com.ritesh.customfieldviews.models.BaseSpinner;
import com.ritesh.customfieldviews.validators.ServerListener;
import com.ritesh.customfieldviews.validators.ValidityClassBase;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Ritesh Shakya
 */

class MainPresenterImpl extends ValidityClassBase implements MainPresenter {
    private final MainPresenterView mView;
    private final MainPresenterMapper mMapper;

    MainPresenterImpl(MainPresenterView mView, MainPresenterMapper mMapper) {
        super();
        this.mView = mView;
        this.mMapper = mMapper;
    }

    /**
     * @param view Returns the calling view.
     * @param text Text enter in the textView.
     * @return {@code true} if the entered text is valid. {@code false} Otherwise.
     */
    @Override
    public boolean getTextValidity(CustomTextView view, String text) {
        switch (view.getId()) {
            case R.id.activity_main_text_email:
                // Check with email pattern and return validity
                Pattern VALID_EMAIL_ADDRESS_REGEX =
                        Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
                Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(text);
                return matcher.matches();
            case R.id.activity_main_text_async_check:
                // If length is equal of greater than 5 check with server. {@link CustomTextView#checkValidateFromServer}
                if (text.length() >= 5) {
                    view.checkValidityWithServer();
                }
                return view.getValidity();
        }
        return false;
    }

    /**
     * Called when a item is selected from SpinnerView.
     *
     * @param view        Returns the calling view
     * @param baseSpinner Current selection of SpinnerView.
     */
    @Override
    public void getSpinnerValidity(CustomSpinnerView view, BaseSpinner baseSpinner) {
        switch (view.getId()) {
            case R.id.activity_main_programmatically_load:
                System.out.println("Current Programmatically Selection: " + baseSpinner.name);
                break;
            case R.id.activity_main_number_of_dependents:
                System.out.println("Current Array Loaded Selection: " + baseSpinner.name);
                break;
        }
    }

    /**
     * Called when a date is selected from DatePicker.
     *
     * @param view Returns the calling view
     * @param date Selected date
     * @return {@code true} if the selected date is valid. {@code false} Otherwise.
     */
    @Override
    public boolean getDateValidity(CustomDateView view, Calendar date) {
        switch (view.getId()) {
            case R.id.activity_main_date_of_birth:
                Calendar today = Calendar.getInstance();
                today.add(Calendar.YEAR, -18);
                return today.after(date);
        }
        return false;
    }

    /**
     * Sets the Maximum possible date in their respective DatePickers
     *
     * @param view Returns the calling view
     * @return Maximum date to display.
     */
    @Override
    public long setMaxDate(CustomDateView view) {
        switch (view.getId()) {
            case R.id.activity_main_date_of_birth:
                Calendar today = Calendar.getInstance();
                today.add(Calendar.YEAR, -18);
                return today.getTime().getTime();
        }
        return 0;
    }

    @Override
    public long setMinDate(CustomDateView view) {
        switch (view.getId()) {
            case R.id.activity_main_date_of_birth:
                Calendar today = Calendar.getInstance();
                today.add(Calendar.YEAR, -60);
                return today.getTime().getTime();
        }
        return 0;
    }

    /**
     * @param view     Returns the calling view
     * @param text     Text currently in {@param view}
     * @param listener {@link ServerListener} to provide asynchronous completion of task.
     */
    @Override
    public void checkValidateFromServer(View view, final String text, final ServerListener listener) {
        switch (view.getId()) {
            case R.id.activity_main_text_async_check:
                // Your Asynchronous code here
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        // Call this with the success/failure validation
                        listener.serverTaskComplete(text.equals("Hello"));
                    }
                }, 2000);
                break;
        }
    }

    /**
     * Set default messages under the TextView to display either error or message.
     *
     * @param view Returns the Calling view.
     * @return {@link CustomTextView.Properties} to set default and error texts.
     */
    @Override
    public CustomTextView.Properties getTextErrorProperties(CustomTextView view) {
        switch (view.getId()) {
            case R.id.activity_main_text_async_check:
                return new CustomTextView.Properties("Please enter \"Hello\" exactly as it is",
                        "Type in \"Hello\"");
        }
        return null;
    }

    /**
     * Programmatically set data to spinner view.
     */
    @Override
    public void setData() {
        getView(R.id.activity_main_programmatically_load, CustomSpinnerView.class).setData(new ArrayList<>(new ArrayList<BaseSpinner>() {{
            add(new BaseSpinner("Yes"));
            add(new BaseSpinner("No"));
        }}));
    }
}