blob: 9567b992101fbfc6c620372d9308a8b6620b0dde [file] [log] [blame]
package org.apache.fineract.ui.online.customers.createcustomer.formcustomeraddress;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TextInputLayout;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import com.stepstone.stepper.Step;
import com.stepstone.stepper.VerificationError;
import org.apache.fineract.R;
import org.apache.fineract.data.models.customer.Address;
import org.apache.fineract.data.models.customer.Customer;
import org.apache.fineract.ui.base.MifosBaseActivity;
import org.apache.fineract.ui.base.MifosBaseFragment;
import org.apache.fineract.ui.base.Toaster;
import org.apache.fineract.ui.online.customers.createcustomer.CustomerAction;
import org.apache.fineract.ui.online.customers.createcustomer.OnNavigationBarListener;
import org.apache.fineract.utils.ConstantKeys;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* @author Rajan Maurya
* On 25/07/17.
*/
public class FormCustomerAddressFragment extends MifosBaseFragment implements Step, TextWatcher,
FormCustomerAddressContract.View, View.OnFocusChangeListener {
@BindView(R.id.til_street)
TextInputLayout tilStreet;
@BindView(R.id.et_street)
EditText etStreet;
@BindView(R.id.til_city)
TextInputLayout tilCity;
@BindView(R.id.et_city)
EditText etCity;
@BindView(R.id.til_postal_code)
TextInputLayout tilPostalCode;
@BindView(R.id.et_postal_code)
EditText etPostalCode;
@BindView(R.id.til_country)
TextInputLayout tilCountry;
@BindView(R.id.et_country)
AutoCompleteTextView etCountry;
@BindView(R.id.til_region)
TextInputLayout tilRegion;
@BindView(R.id.et_region)
EditText etRegion;
View rootView;
@Inject
FormCustomerAddressPresenter formCustomerAddressPresenter;
private String [] countries;
private Customer customer;
private CustomerAction customerAction;
private OnNavigationBarListener.CustomerAddress onNavigationBarListener;
public static FormCustomerAddressFragment newInstance(Customer customer,
CustomerAction action) {
FormCustomerAddressFragment fragment = new FormCustomerAddressFragment();
Bundle args = new Bundle();
args.putParcelable(ConstantKeys.CUSTOMER, customer);
args.putSerializable(ConstantKeys.CUSTOMER_ACTION, action);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MifosBaseActivity) getActivity()).getActivityComponent().inject(this);
setRetainInstance(true);
if (getArguments() != null) {
customer = getArguments().getParcelable(ConstantKeys.CUSTOMER);
customerAction = (CustomerAction) getArguments().getSerializable(
ConstantKeys.CUSTOMER_ACTION);
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_form_customer_address, container, false);
ButterKnife.bind(this, rootView);
formCustomerAddressPresenter.attachView(this);
showUserInterface();
if (customerAction == CustomerAction.EDIT) {
showPreviousAddress();
}
formCustomerAddressPresenter.fetchCountries();
return rootView;
}
public void showUserInterface() {
etStreet.addTextChangedListener(this);
etCity.addTextChangedListener(this);
etCountry.addTextChangedListener(this);
etCountry.setOnFocusChangeListener(this);
}
public void showPreviousAddress() {
Address address = customer.getAddress();
etStreet.setText(address.getStreet());
etCity.setText(address.getCity());
if (address.getPostalCode() != null) {
etPostalCode.setText(address.getPostalCode());
}
etCountry.setText(address.getCountry());
showTextInputLayoutError(tilCountry, null);
if (address.getRegion() != null) {
etRegion.setText(address.getRegion());
}
}
@Override
public VerificationError verifyStep() {
if (!validateStreet() || !validateCity() || !validateCountry()) {
return new VerificationError(null);
} else {
Address address = new Address();
address.setStreet(etStreet.getText().toString().trim());
address.setCity(etCity.getText().toString().trim());
address.setCountry(etCountry.getText().toString().trim());
address.setPostalCode(etPostalCode.getText().toString().trim());
address.setRegion(etRegion.getText().toString().trim());
address.setCountryCode(formCustomerAddressPresenter
.getCountryCode(etCountry.getText().toString().trim()));
onNavigationBarListener.setAddress(address);
}
return null;
}
@Override
public void onSelected() {
}
@Override
public void onError(@NonNull VerificationError error) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if ((etCountry.getText().hashCode() == s.hashCode())) {
etCountry.post(new Runnable() {
@Override
public void run() {
etCountry.showDropDown();
validateCountry();
}
});
}
}
@Override
public void afterTextChanged(Editable s) {
if ((etStreet.getText().hashCode() == s.hashCode())) {
validateStreet();
} else if (etCity.getText().hashCode() == s.hashCode()) {
validateCity();
} else if (etCountry.getText().hashCode() == s.hashCode()) {
validateCountry();
}
}
public boolean validateStreet() {
if (TextUtils.isEmpty(etStreet.getText().toString().trim())) {
showTextInputLayoutError(tilStreet, getString(R.string.required));
return false;
}
showTextInputLayoutError(tilStreet, null);
return true;
}
public boolean validateCity() {
if (TextUtils.isEmpty(etCity.getText().toString().trim())) {
showTextInputLayoutError(tilCity, getString(R.string.required));
return false;
}
showTextInputLayoutError(tilCity, null);
return true;
}
public boolean validateCountry() {
if (TextUtils.isEmpty(etCountry.getText().toString().trim())) {
showTextInputLayoutError(tilCountry, getString(R.string.required));
return false;
} else if (!formCustomerAddressPresenter.isCountryNameValid(
etCountry.getText().toString().trim())) {
showTextInputLayoutError(tilCountry, getString(R.string.invalid_country));
return false;
}
showTextInputLayoutError(tilCountry, null);
return true;
}
public void showTextInputLayoutError(TextInputLayout textInputLayout, String errorMessage) {
textInputLayout.setErrorEnabled(true);
textInputLayout.setError(errorMessage);
}
@Override
public void showCounties(List<String> countries) {
this.countries = countries.toArray(new String[0]);
ArrayAdapter<String> customerAdapter = new ArrayAdapter<>(getActivity(),
android.R.layout.simple_list_item_1, this.countries);
etCountry.setAdapter(customerAdapter);
}
@Override
public void showError(String message) {
Toaster.show(rootView, message);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity activity = context instanceof Activity ? (Activity) context : null;
try {
onNavigationBarListener = (OnNavigationBarListener.CustomerAddress) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnNavigationBarListener.CustomerAddress");
}
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
hideKeyboard(etCountry, getActivity());
etCountry.post(new Runnable() {
@Override
public void run() {
etCountry.showDropDown();
}
});
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putStringArray(ConstantKeys.COUNTRIES, countries);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
countries = savedInstanceState.getStringArray(ConstantKeys.COUNTRIES);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
formCustomerAddressPresenter.detachView();
}
}