package com.cheikh.lazywaimai.base;
import android.util.Log;
import com.google.common.base.Preconditions;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import com.cheikh.lazywaimai.context.AppConfig;
import com.cheikh.lazywaimai.model.bean.ResponseError;
import com.cheikh.lazywaimai.ui.Display;
/**
* author: cheikh.wang on 17/1/5
* email: wanghonghi@126.com
*/
public abstract class BaseController<U extends BaseController.Ui<UC>, UC> {
private final Set<U> mUis;
private final Set<U> mUnmodifiableUis;
private Display mDisplay;
private boolean mInited;
public BaseController() {
mUis = new CopyOnWriteArraySet<>();
mUnmodifiableUis = Collections.unmodifiableSet(mUis);
}
public final void init() {
Preconditions.checkState(!mInited, "Already inited");
onInited();
mInited = true;
}
public final void suspend() {
Preconditions.checkState(mInited, "Not inited");
onSuspended();
mInited = false;
}
protected void onInited() {}
protected void onSuspended() {}
public final boolean isInited() {
return mInited;
}
protected abstract UC createUiCallbacks(U ui);
public synchronized final void attachUi(U ui) {
Preconditions.checkArgument(ui != null, "ui cannot be null");
Preconditions.checkState(!mUis.contains(ui), "UI is already attached");
mUis.add(ui);
ui.setCallbacks(createUiCallbacks(ui));
}
public synchronized final void startUi(U ui) {
Preconditions.checkArgument(ui != null, "ui cannot be null");
Preconditions.checkState(mUis.contains(ui), "ui is not attached");
populateUi(ui);
}
public synchronized final void detachUi(U ui) {
Preconditions.checkArgument(ui != null, "ui cannot be null");
Preconditions.checkState(mUis.contains(ui), "ui is not attached");
ui.setCallbacks(null);
mUis.remove(ui);
}
protected synchronized void populateUi(U ui) {}
protected synchronized final void populateUis() {
if (AppConfig.DEBUG) {
Log.d(getClass().getSimpleName(), "populateUis");
}
for (U ui : mUis) {
populateUi(ui);
}
}
protected final Set<U> getUis() {
return mUnmodifiableUis;
}
protected int getId(U ui) {
return ui.hashCode();
}
protected synchronized U findUi(final int id) {
for (U ui : mUis) {
if (getId(ui) == id) {
return ui;
}
}
return null;
}
public void setDisplay(Display display) {
mDisplay = display;
}
public final Display getDisplay() {
return mDisplay;
}
public interface Ui<UC> {
void setCallbacks(UC callbacks);
UC getCallbacks();
void onResponseError(ResponseError error);
}
public interface ListUi<T, UC> extends Ui<UC> {
void onStartRequest(int page);
void onFinishRequest(List<T> items, int page, boolean haveNextPage);
}
public interface SubUi {}
}