package com.cheikh.lazywaimai.controller; import android.text.TextUtils; import com.google.common.base.Preconditions; import java.util.List; import javax.inject.Inject; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.schedulers.Schedulers; import com.cheikh.lazywaimai.base.BaseController; import com.cheikh.lazywaimai.model.bean.Address; import com.cheikh.lazywaimai.model.bean.ResponseError; import com.cheikh.lazywaimai.model.bean.User; import com.cheikh.lazywaimai.network.RequestCallback; import com.cheikh.lazywaimai.network.RestApiClient; import com.cheikh.lazywaimai.ui.Display; public class AddressController extends BaseController<AddressController.AddressUi, AddressController.AddressUiCallbacks> { private final RestApiClient mRestApiClient; @Inject public AddressController(RestApiClient restApiClient) { super(); mRestApiClient = Preconditions.checkNotNull(restApiClient, "restApiClient cannot be null"); } @Override protected void populateUi(AddressUi ui) { if (ui instanceof AddressListUi) { populateAddressListUi((AddressListUi) ui); } } private void populateAddressListUi(AddressListUi ui) { fetchAddressList(getId(ui)); } private void fetchAddressList(final int callingId) { mRestApiClient.addressService() .addresses() .subscribeOn(Schedulers.io()) .doOnSubscribe(new Action0() { @Override public void call() { AddressUi ui = findUi(callingId); if (ui instanceof AddressListUi) { ((AddressListUi) ui).onStartRequest(0); } } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new RequestCallback<List<Address>>() { @Override public void onResponse(List<Address> addresses) { AddressUi ui = findUi(callingId); if (ui instanceof AddressListUi) { ((AddressListUi) ui).onFinishRequest(addresses, 0, false); } } @Override public void onFailure(ResponseError error) { AddressUi ui = findUi(callingId); if (ui instanceof AddressListUi) { ui.onResponseError(error); } } }); } private void doCreateAddress(final int callingId, Address address) { mRestApiClient.addressService() .create(address) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new RequestCallback<Address>() { @Override public void onResponse(Address response) { AddressUi ui = findUi(callingId); if (ui instanceof UpdateAddressUi) { ((UpdateAddressUi) ui).updateFinish(); } } @Override public void onFailure(ResponseError error) { AddressUi ui = findUi(callingId); if (ui instanceof UpdateAddressUi) { ui.onResponseError(error); } } }); } private void doChangeAddress(final int callingId, Address address) { mRestApiClient.addressService() .change(address.getId(), address) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new RequestCallback<Address>() { @Override public void onResponse(Address response) { AddressUi ui = findUi(callingId); if (ui instanceof UpdateAddressUi) { ((UpdateAddressUi) ui).updateFinish(); } } @Override public void onFailure(ResponseError error) { AddressUi ui = findUi(callingId); if (ui instanceof UpdateAddressUi) { ui.onResponseError(error); } } }); } private void doDeleteAddress(final int callingId, final Address address) { mRestApiClient.addressService() .delete(address.getId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new RequestCallback<Object>() { @Override public void onResponse(Object response) { AddressUi ui = findUi(callingId); if (ui instanceof AddressListUi) { ((AddressListUi) ui).deleteFinish(address); } } @Override public void onFailure(ResponseError error) { AddressUi ui = findUi(callingId); if (ui instanceof AddressListUi) { ui.onResponseError(error); } } }); } private void doSetDefaultAddress(final int callingId, final Address address) { mRestApiClient.accountService() .setLastAddress(address.getUserId(), address.getId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new RequestCallback<User>() { @Override public void onResponse(User response) { AddressUi ui = findUi(callingId); if (ui instanceof AddressListUi) { ((AddressListUi) ui).setDefaultFinish(); } } @Override public void onFailure(ResponseError error) { AddressUi ui = findUi(callingId); if (ui instanceof AddressListUi) { ui.onResponseError(error); } } }); } @Override protected AddressUiCallbacks createUiCallbacks(final AddressUi ui) { return new AddressUiCallbacks() { @Override public void refresh() { if (ui instanceof AddressListUi) { fetchAddressList(getId(ui)); } } @Override public boolean isNameValid(String name) { return !TextUtils.isEmpty(name); } @Override public boolean isMobileValid(String phone) { return !TextUtils.isEmpty(phone); } @Override public boolean isSummaryValid(String summary) { return !TextUtils.isEmpty(summary); } @Override public boolean isDetailValid(String detail) { return !TextUtils.isEmpty(detail); } @Override public void create(Address address) { doCreateAddress(getId(ui), address); } @Override public void change(Address address) { doChangeAddress(getId(ui), address); } @Override public void delete(Address address) { doDeleteAddress(getId(ui), address); } @Override public void setDefaultAddress(Address address) { doSetDefaultAddress(getId(ui), address); } @Override public void showChangeAddress(Address address) { Display display = getDisplay(); if (display != null) { display.showChangeAddress(address); } } @Override public void showCreateAddress() { Display display = getDisplay(); if (display != null) { display.showCreateAddress(); } } }; } public interface AddressUiCallbacks { void refresh(); boolean isNameValid(String name); boolean isMobileValid(String phone); boolean isSummaryValid(String summary); boolean isDetailValid(String detail); void delete(Address address); void create(Address address); void change(Address address); void setDefaultAddress(Address address); void showChangeAddress(Address address); void showCreateAddress(); } /** * UI界面必须实现的接口,留给控制器调用 */ public interface AddressUi extends BaseController.Ui<AddressUiCallbacks> {} public interface AddressListUi extends AddressUi, ListUi<Address, AddressUiCallbacks> { void deleteFinish(Address address); void setDefaultFinish(); } public interface UpdateAddressUi extends AddressUi { void updateFinish(); } }