package in.vesely.eclub.yodaqa.view; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.util.TypedValue; import com.squareup.otto.Subscribe; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.FragmentArg; import org.androidannotations.annotations.InstanceState; import org.androidannotations.annotations.ViewById; import in.vesely.eclub.yodaqa.R; import in.vesely.eclub.yodaqa.bus.OttoBus; import in.vesely.eclub.yodaqa.bus.RequestUpdateAction; import in.vesely.eclub.yodaqa.bus.ResponseChangedAction; import in.vesely.eclub.yodaqa.restclient.YodaAnswersResponse; /** * Created by vesely on 6/16/15. */ @EFragment public abstract class ResponseFragment extends Fragment { private static final String REFRESH_STATE = "refresh_state"; protected Boolean refreshing = null; @FragmentArg @InstanceState protected YodaAnswersResponse response; @Bean protected OttoBus bus; @ViewById(R.id.refreshView) protected SwipeRefreshLayout refreshLayout; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bus.register(this); if (savedInstanceState != null && savedInstanceState.containsKey(REFRESH_STATE)) { refreshing = savedInstanceState.getByte(REFRESH_STATE) == 1; } } @Override public void onDestroy() { super.onDestroy(); bus.unregister(this); } @Subscribe public void setResponse(ResponseChangedAction action) { response = action.getResponse(); new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { responseChanged(response); } }); if (refreshLayout != null && response != null) { refreshLayout.setRefreshing(!response.isFinished()); } if (action.getResponse() == null) { if (refreshLayout != null) { refreshLayout.setRefreshing(false); } } } @Subscribe public void onRequestRefreshResponse(RequestUpdateAction action) { if (refreshLayout != null) { refreshLayout.setRefreshing(true); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (refreshLayout != null) { outState.putByte(REFRESH_STATE, (byte) (refreshLayout.isRefreshing() ? 1 : 0)); } } @AfterViews protected void initSwipeRefreshLayout() { refreshLayout.setEnabled(false); if (refreshing != null) { //TODO this is hack to show refreshing indicator before onMeasure is called. Remove this hack after this bug is resolved https://code.google.com/p/android/issues/detail?id=77712 TypedValue typed_value = new TypedValue(); getActivity().getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, typed_value, true); refreshLayout.setProgressViewOffset(false, 0, getResources().getDimensionPixelSize(typed_value.resourceId)); refreshLayout.setRefreshing(refreshing); refreshing = null; } } protected abstract void responseChanged(YodaAnswersResponse response); }