package com.abewy.android.apps.klyph.app; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import com.abewy.android.apps.klyph.Klyph; import com.abewy.android.apps.klyph.KlyphPreferences; import com.abewy.android.apps.klyph.adapter.MultiObjectAdapter; import com.abewy.android.apps.klyph.core.graph.GraphObject; import com.abewy.android.apps.klyph.core.request.RequestError; import com.abewy.android.apps.klyph.core.request.Response; import com.abewy.android.apps.klyph.request.AsyncRequest; import com.abewy.android.apps.klyph.request.AsyncRequest.Query; import com.abewy.app.BaseListActivity; import com.abewy.klyph.items.Progress; import com.abewy.android.apps.klyph.R; public class KlyphListActivity extends BaseListActivity implements OnScrollListener { private final String TAG = "CkoobafeListActivity " + this.getClass().getSimpleName(); private boolean userScroll = false; private boolean loading = false; private boolean firstLoad = true; private boolean viewDestroyed = false; private boolean noMoreData = false; private boolean loadingObjectAsFirstItem = false; private GraphObject loadingObject; private int requestType; private String elementId; private String offset; private String initialOffset; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setLoadingView(findViewById(android.R.id.progress)); getListView().setEmptyView(findViewById(android.R.id.empty)); getListView().setOnScrollListener(this); loadingObject = getLoadingObject(); loadingObject.setLoading(true); setListVisible(false); setEmptyViewVisible(false); } public void setElementId(String id) { this.elementId = id; } public void load() { // Log.i(TAG, "load"); if ((isFirstLoad() && !isLoading()) || isViewDestroyed()) { setViewDestroyed(false); setOffset(initialOffset); setNoMoreData(false); firstLoad = true; refresh(); } } protected String getElementId() { return elementId; } protected void setOffset(String offset) { this.offset = offset; } protected void setInitialOffset(String offset) { this.initialOffset = offset; } protected void setRequestType(int requestType) { this.requestType = requestType; } protected void setNoMoreData(boolean noMoreData) { this.noMoreData = noMoreData; } protected void setLoadingObjectAsFirstItem(boolean loadingObjectAsFirstItem) { this.loadingObjectAsFirstItem = loadingObjectAsFirstItem; } private void setViewDestroyed(boolean viewDestroyed) { this.viewDestroyed = viewDestroyed; } protected boolean isViewDestroyed() { return viewDestroyed; } protected boolean isLoading() { return loading; } protected boolean isFirstLoad() { return firstLoad; } protected boolean hasNoMoreData() { return noMoreData; } protected void refresh() { startLoading(); Log.i(TAG, "request = " + requestType + ", id = " + elementId + ", offset = " + offset); AsyncRequest request = new AsyncRequest(requestType, elementId, offset, new AsyncRequest.Callback() { public void onComplete(Response response) { Log.i(TAG, "onCompleted"); onRequestComplete(response); } }); request.execute(); } private void onRequestComplete(final Response response) { runOnUiThread(new Runnable() { @Override public void run() { if (response.getError() == null) { onRequestSuccess(response.getGraphObjectList()); } else { onRequestError(response.getError()); } } }); } private void onRequestSuccess(List<GraphObject> result) { populate(result); } private void onRequestError(RequestError error) { Log.i(TAG, "error " + error.toString()); } protected MultiObjectAdapter getAdapter() { return (MultiObjectAdapter) getListAdapter(); } protected void populate(List<GraphObject> data) { for (GraphObject graphObject : data) { getAdapter().add(graphObject); } // adapter.addAll(data); is only available in api 11 endLoading(); if (data.size() == 0) noMoreData = true; else offset = String.valueOf(getAdapter().getCount()); } protected void startLoading() { loading = true; if (!firstLoad) { if (!loadingObjectAsFirstItem) getAdapter().add(loadingObject); else getAdapter().insert(loadingObject, 0); } } protected void endLoading() { loading = false; firstLoad = false; getAdapter().remove(loadingObject); setLoadingViewVisible(false); setListVisible(true); } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (userScroll) { if (!loading && !firstLoad && !noMoreData) { boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount - 5; if (loadMore) { // Log.i(TAG, "onScroll refresh"); refresh(); } } } } public void onScrollStateChanged(AbsListView view, int scrollState) { userScroll = scrollState != OnScrollListener.SCROLL_STATE_IDLE; } protected GraphObject getLoadingObject() { return new Progress(); } @Override protected Class<? extends Activity> getHomeClass() { return MainActivity.class; } @Override protected int getLayout() { return R.layout.list; } @Override protected int getCustomTheme() { return KlyphPreferences.getTheme(); } @Override public void onPause() { super.onPause(); // Log.i(TAG, "onPause"); } @Override public void onStop() { super.onStop(); Log.i(TAG, "onStop"); } @Override public void onDestroy() { super.onDestroy(); setViewDestroyed(true); // Log.i(TAG, "onDestroyView"); } @Override public void onStart() { super.onStart(); // Log.i(TAG, "onStart"); } @Override public void onResume() { super.onResume(); // Log.i(TAG, "onResume"); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.i(TAG, "onSaveInstanceState"); } }