package com.think.tlr;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import com.think.tlr.TLRLinearLayout.LoadStatus;
import com.think.tlr.TLRLinearLayout.RefreshStatus;
/**
* @author borney
* @date 4/28/17
* @see TLRCalculator
*/
class TLRStatusController {
private TLRCalculator mCalculator;
/**
* 刷新状态机
*/
private RefreshStatus mRefreshStatus = RefreshStatus.IDLE;
/**
* 加载状态机
*/
private LoadStatus mLoadStatus = LoadStatus.IDLE;
/**
* 是否释放刷新/加载
*/
private boolean isReleaseRefresh = true, isReleaseLoad = true;
/**
* 是否是自动刷新
*/
private boolean isAutoRefreshing = false;
private boolean isRefreshing = false, isLoading = false;
private TLRUIHandler mTLRUiHandler;
TLRStatusController(TLRCalculator calculator, Context context, AttributeSet attrs) {
mCalculator = calculator;
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TLRLinearLayout);
if (array == null) {
TLRLog.e("initAttrs array is null");
return;
}
try {
final int N = array.getIndexCount();
for (int i = 0; i < N; i++) {
int index = array.getIndex(i);
if (index == R.styleable.TLRLinearLayout_releaseRefresh) {
isReleaseRefresh = array.getBoolean(index, isReleaseRefresh);
} else if (index == R.styleable.TLRLinearLayout_releaseLoad) {
isReleaseLoad = array.getBoolean(index, isReleaseLoad);
}
}
} finally {
array.recycle();
}
}
/**
* calculate refresh view status
*
* @param moveDown view is move down now
*/
public void calculateMoveRefreshStatus(boolean moveDown) {
int totalOffsetY = mCalculator.getTotalOffsetY();
if (!mCalculator.tLRLinearLayout.isEnableRefresh()) {
return;
}
//y 方向移动正值,切Load为初始状态
if (totalOffsetY > 0 && mLoadStatus == LoadStatus.IDLE) {
if (moveDown) {//view向下运动
if (mRefreshStatus == RefreshStatus.IDLE && !isRefreshing) {
notifyRefreshStatusChanged(RefreshStatus.PULL_DOWN);
}
if (totalOffsetY >= mCalculator.refreshThresholdHeight && mRefreshStatus == RefreshStatus.PULL_DOWN) {
notifyRefreshStatusChanged(RefreshStatus.RELEASE_REFRESH);
if (isAutoRefreshing) {
notifyRefreshStatusChanged(RefreshStatus.REFRESHING);
notifyRefreshStatusChanged(RefreshStatus.IDLE);
}
}
} else {//view向上运动
if (totalOffsetY < mCalculator.refreshThresholdHeight && mRefreshStatus == RefreshStatus.RELEASE_REFRESH) {
notifyRefreshStatusChanged(RefreshStatus.PULL_DOWN);
}
if (mRefreshStatus == RefreshStatus.PULL_DOWN) {
notifyRefreshStatusChanged(RefreshStatus.IDLE);
}
}
}
}
/**
* calculate load view status
*
* @param moveUp view is move up now
*/
public void calculateMoveLoadStatus(boolean moveUp) {
int totalOffsetY = mCalculator.getTotalOffsetY();
if (!mCalculator.tLRLinearLayout.isEnableLoad()) {
return;
}
if (totalOffsetY < 0 && mRefreshStatus == RefreshStatus.IDLE) {
if (moveUp) {//view向上运动
if (mLoadStatus == LoadStatus.IDLE && !isLoading) {
notifyLoadStatusChanged(LoadStatus.PULL_UP);
}
if (Math.abs(totalOffsetY) >= mCalculator.loadThresholdHeight && mLoadStatus == LoadStatus.PULL_UP) {
notifyLoadStatusChanged(LoadStatus.RELEASE_LOAD);
}
} else {//view向下运动
if (Math.abs(totalOffsetY) < mCalculator.loadThresholdHeight && mLoadStatus == LoadStatus.RELEASE_LOAD) {
notifyLoadStatusChanged(LoadStatus.PULL_UP);
}
if (mLoadStatus == LoadStatus.PULL_UP) {
notifyLoadStatusChanged(LoadStatus.IDLE);
}
}
}
}
/**
* calculate refresh view status when up motionevent
*/
public void calculatorUpRefreshStatus() {
if (!mCalculator.tLRLinearLayout.isEnableRefresh()) {
return;
}
if (mRefreshStatus == RefreshStatus.RELEASE_REFRESH) {
if (isReleaseRefresh) {
notifyRefreshStatusChanged(RefreshStatus.REFRESHING);
}
notifyRefreshStatusChanged(RefreshStatus.IDLE);
} else if (mRefreshStatus != RefreshStatus.IDLE) {
notifyRefreshStatusChanged(RefreshStatus.IDLE);
}
}
/**
* calculate load view status when up motionevent
*/
public void calculatorUpLoadStatus() {
if (!mCalculator.tLRLinearLayout.isEnableLoad()) {
return;
}
if (mLoadStatus == LoadStatus.RELEASE_LOAD) {
if (isReleaseLoad) {
notifyLoadStatusChanged(LoadStatus.LOADING);
}
notifyLoadStatusChanged(LoadStatus.IDLE);
} else if (mLoadStatus != LoadStatus.IDLE) {
notifyLoadStatusChanged(LoadStatus.IDLE);
}
}
private void notifyRefreshStatusChanged(RefreshStatus status) {
if (mRefreshStatus == status) {
return;
}
mRefreshStatus = status;
if (mRefreshStatus == RefreshStatus.REFRESHING) {
isRefreshing = true;
}
mTLRUiHandler.onRefreshStatusChanged(mCalculator.tLRLinearLayout.getTouchView(), mRefreshStatus);
}
private void notifyLoadStatusChanged(LoadStatus status) {
if (mLoadStatus == status) {
return;
}
mLoadStatus = status;
if (mLoadStatus == LoadStatus.LOADING) {
isLoading = true;
}
mTLRUiHandler.onLoadStatusChanged(mCalculator.tLRLinearLayout.getTouchView(), mLoadStatus);
}
public void setTLRUiHandler(TLRUIHandler uiHandler) {
mTLRUiHandler = uiHandler;
}
public void setAutoRefreshing(boolean autoRefreshing) {
TLRLog.v("setAutoRefreshing:" + autoRefreshing);
isAutoRefreshing = autoRefreshing;
}
public boolean isAutoRefreshing() {
return isAutoRefreshing;
}
public LoadStatus getLoadStatus() {
return mLoadStatus;
}
public RefreshStatus getRefreshStatus() {
return mRefreshStatus;
}
public boolean isReleaseRefresh() {
return isReleaseRefresh;
}
public void setReleaseRefresh(boolean releaseRefresh) {
isReleaseRefresh = releaseRefresh;
}
public boolean isReleaseLoad() {
return isReleaseLoad;
}
public void setReleaseLoad(boolean releaseLoad) {
isReleaseLoad = releaseLoad;
}
public void finishRefresh() {
if (isRefreshing) {
isRefreshing = false;
} else {
throw new RuntimeException("not refreshing, can not finish refresh");
}
}
public void finishLoad() {
if (isLoading) {
isLoading = false;
} else {
throw new RuntimeException("not loading, can not finish load");
}
}
public boolean isRefreshing() {
return isRefreshing;
}
public boolean isLoading() {
return isLoading;
}
}