package com.cheikh.lazywaimai.controller; import com.cheikh.lazywaimai.model.bean.Feedback; import com.cheikh.lazywaimai.model.bean.ResponseError; import com.cheikh.lazywaimai.model.bean.Setting; import com.cheikh.lazywaimai.network.RequestCallback; import com.cheikh.lazywaimai.network.RestApiClient; import com.cheikh.lazywaimai.repository.SettingManager; import com.google.common.base.Preconditions; import javax.inject.Inject; import com.cheikh.lazywaimai.base.BaseController; import com.cheikh.lazywaimai.ui.Display; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * author: cheikh.wang on 17/1/5 * email: wanghonghi@126.com */ public class MainController extends BaseController<MainController.MainUi, MainController.MainUiCallbacks> { private final UserController mUserController; private final AddressController mAddressController; private final BusinessController mBusinessController; private final OrderController mOrderController; private final RestApiClient mRestApiClient; private final SettingManager mSettingManager; @Inject public MainController(UserController userController, AddressController addressController, BusinessController businessController, OrderController orderController, RestApiClient restApiClient, SettingManager settingManager) { super(); mUserController = Preconditions.checkNotNull(userController, "userController cannot be null"); mAddressController = Preconditions.checkNotNull(addressController, "addressController cannot be null"); mBusinessController = Preconditions.checkNotNull(businessController, "businessController cannot be null"); mOrderController = Preconditions.checkNotNull(orderController, "orderController cannot be null"); mRestApiClient = Preconditions.checkNotNull(restApiClient, "restApiClient cannot be null"); mSettingManager = Preconditions.checkNotNull(settingManager, "settingManager cannot be null"); } @Override protected void onInited() { super.onInited(); mUserController.init(); mAddressController.init(); mBusinessController.init(); mOrderController.init(); } @Override protected void onSuspended() { mUserController.suspend(); mAddressController.suspend(); mBusinessController.suspend(); mOrderController.suspend(); super.onSuspended(); } public void attachDisplay(Display display) { Preconditions.checkNotNull(display, "display is null"); Preconditions.checkState(getDisplay() == null, "we currently have a display"); setDisplay(display); } public void detachDisplay(Display display) { Preconditions.checkNotNull(display, "display is null"); Preconditions.checkState(getDisplay() == display, "display is not attached"); setDisplay(null); } @Override public void setDisplay(Display display) { super.setDisplay(display); mUserController.setDisplay(display); mAddressController.setDisplay(display); mBusinessController.setDisplay(display); mOrderController.setDisplay(display); } @Override protected void populateUi(MainUi ui) { if (ui instanceof MainHomeUi) { populateMainHomeUi((MainHomeUi) ui); } } private void populateMainHomeUi(MainHomeUi ui) { doFetchSetting(getId(ui)); } /** * 获取应用配置 * @param callingId */ private void doFetchSetting(final int callingId) { mRestApiClient.commonService() .settings() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new RequestCallback<Setting>() { @Override public void onResponse(Setting setting) { mSettingManager.saveOrUpdate(setting); } }); } /** * 提交意见反馈 * @param callingId */ private void doFeedback(final int callingId, Feedback feedback) { mRestApiClient.commonService() .feedback(feedback) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new RequestCallback<Feedback>() { @Override public void onResponse(Feedback result) { MainUi ui = findUi(callingId); if (ui instanceof MainFeedbackUi) { ((MainFeedbackUi) ui).onFeedbackFinish(); } } @Override public void onFailure(ResponseError error) { MainUi ui = findUi(callingId); if (ui instanceof MainFeedbackUi) { ui.onResponseError(error); } } }); } /** * 当返回键被按下时 */ public void onBackButtonPressed() { Display display = getDisplay(); if (display != null) { if (!display.popTopFragmentBackStack()) { display.navigateUp(); } } } @Override protected MainUiCallbacks createUiCallbacks(final MainUi ui) { return new MainUiCallbacks() { @Override public void feedback(Feedback feedback) { doFeedback(getId(ui), feedback); } }; } public final UserController getUserController() { return mUserController; } public final BusinessController getBusinessController() { return mBusinessController; } public final AddressController getAddressController() { return mAddressController; } public final OrderController getOrderController() { return mOrderController; } public interface MainUi extends BaseController.Ui<MainUiCallbacks> { } public interface MainHomeUi extends MainUi {} public interface MainFeedbackUi extends MainUi { void onFeedbackFinish(); } public interface MainUiCallbacks { void feedback(Feedback feedback); } }