package com.vishwa.pinit; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Window; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ListView; import com.parse.FindCallback; import com.parse.ParseException; import com.parse.ParseObject; import com.parse.ParseQuery; public class LikesActivity extends Activity { private ListView mLikesListView; private ParseObject mParseNote = DisplayNoteActivity.mParseNote; private ArrayList<NoteLike> mNoteLikes = new ArrayList<NoteLike>(); private LikesArrayAdapter mAdapter; private int mNumberOfLikesLoaded = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_likes_display); mLikesListView = (ListView) findViewById(R.id.likes_listview); mLikesListView.setOnScrollListener(new EndlessScrollListener()); mAdapter = new LikesArrayAdapter( this, 0, mNoteLikes, ((PinItApplication)getApplication()).getImageLoader()); mLikesListView.setAdapter(mAdapter); mLikesListView.setDivider(null); mLikesListView.setDividerHeight(0); Intent intent = getIntent(); mNumberOfLikesLoaded = intent.getIntExtra("numberOfLikesLoaded", 0); ArrayList<NoteLike> likes = intent.getParcelableArrayListExtra("noteLikes"); for(NoteLike like : likes) { mNoteLikes.add(like); } mAdapter.notifyDataSetChanged(); setActivityResult(); } /** * Detects when user is close to the end of the current page and starts loading the next page * so the user will not have to wait (that much) for the next entries. * * @author Ognyan Bankov (ognyan.bankov@bulpros.com) */ public class EndlessScrollListener implements OnScrollListener { // how many entries earlier to start loading next page private int visibleThreshold = 5; private int currentPage = 0; private int previousTotal = 0; private boolean loading = true; public EndlessScrollListener() { } public EndlessScrollListener(int visibleThreshold) { this.visibleThreshold = visibleThreshold; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { mNumberOfLikesLoaded = totalItemCount; if (loading) { if (totalItemCount > previousTotal) { loading = false; previousTotal = totalItemCount; currentPage++; } } if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { loading = true; loadMoreLikes(); } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } public int getCurrentPage() { return currentPage; } } private void setActivityResult() { Intent intent = new Intent(); intent.putExtra("numberOfLikesLoaded", mNumberOfLikesLoaded); intent.putParcelableArrayListExtra("noteLikes", mNoteLikes); setResult(RESULT_OK, intent); } private void loadMoreLikes() { ParseQuery likesQuery = mParseNote.getRelation("likes").getQuery(); likesQuery.setLimit(10); likesQuery.setSkip(mNumberOfLikesLoaded); likesQuery.addDescendingOrder("createdAt"); likesQuery.findInBackground(new FindCallback() { @Override public void done(List<ParseObject> objects, ParseException e) { if(e == null) { for(ParseObject like: objects) { NoteLike newLike = new NoteLike( like.getString("creatorName"), like.getString("creatorPhotoUrl"), mParseNote.getObjectId()); if(!mNoteLikes.contains(newLike)) { mNoteLikes.add(newLike); mNumberOfLikesLoaded++; setActivityResult(); } } mAdapter.notifyDataSetChanged(); } else { PinItUtils.createAlert("We're sorry", "We couldn't load the likes for this note at this moment, please try again!", LikesActivity.this); } } }); } @Override protected void onDestroy() { // TODO: DESTROY EVERYTHING!!! super.onDestroy(); } }