package com.oreilly.android.otweet.activities; import java.util.ArrayList; import com.oreilly.android.otweet.OTweetApplication; import com.oreilly.android.otweet.R; import com.oreilly.android.otweet.layouts.LoadMoreListItem; import com.oreilly.android.otweet.tasks.LoadMoreAsyncTask; import com.oreilly.android.otweet.tasks.LoadMoreAsyncTask.LoadMoreStatusesResponder; import com.oreilly.android.otweet.tasks.LoadMoreAsyncTask.LoadMoreStatusesResult; import com.oreilly.android.otweet.adapters.*; import twitter4j.Status; import twitter4j.Twitter; import twitter4j.TwitterException; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.widget.ListView; public class StatusListActivity extends ListActivity implements LoadMoreStatusesResponder { final private Handler handler = new Handler(); private OTweetApplication app; private Twitter twitter; private LoadMoreListItem headerView; private LoadMoreListItem footerView; private StatusListAdapter adapter; protected ProgressDialog progressDialog; private Runnable finishedLoadingListTask = new Runnable() { public void run() { finishedLoadingList(); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); app = (OTweetApplication) getApplication(); twitter = app.getTwitter(); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); } @Override protected void onResume() { super.onResume(); if (!app.isAuthorized()) { beginAuthorization(); } else { loadTimelineIfNotLoaded(); } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { if (v.equals(headerView)) { headerView.showProgress(); loadNewerTweets(); } else if (v.equals(footerView)) { footerView.showProgress(); loadOlderTweets(); } else { // Watch out! Doesn't account for header/footer! -> Status status = adapter.getItem(position); Status status = (Status)getListView().getItemAtPosition(position); Intent intent = new Intent(this, StatusDetailActivity.class); intent.putExtra(StatusDetailActivity.STATUS, status); startActivity(intent); } } private void loadTimelineIfNotLoaded() { if (null == getListAdapter()) { progressDialog = ProgressDialog.show( StatusListActivity.this, getResources().getString(R.string.loading_title), getResources().getString(R.string.loading_home_timeline_description) ); Thread loadHomeTimelineThread = new Thread() { public void run() { loadHomeTimeline(); handler.post(finishedLoadingListTask); } }; loadHomeTimelineThread.start(); } } private void beginAuthorization() { Intent intent = new Intent(this, AuthorizationActivity.class); startActivity(intent); } private void loadHomeTimeline() { try { ArrayList<Status> statii = twitter.getHomeTimeline(); adapter = new StatusListAdapter(StatusListActivity.this, statii); } catch (TwitterException e) { throw new RuntimeException("Unable to load home timeline",e); } } protected void finishedLoadingList() { setLoadMoreViews(); setListAdapter(adapter); getListView().setSelection(1); progressDialog.dismiss(); } public void loadingMoreStatuses() { setProgressBarIndeterminateVisibility(true); } public void statusesLoaded(LoadMoreStatusesResult result) { setProgressBarIndeterminateVisibility(false); if (result.newer) { headerView.hideProgress(); adapter.appendNewer(result.statuses); getListView().setSelection(1); } else { footerView.hideProgress(); adapter.appendOlder(result.statuses); } } private void loadNewerTweets() { headerView.showProgress(); new LoadMoreAsyncTask(this, twitter, adapter.getFirstId(), true).execute(); } private void loadOlderTweets() { footerView.showProgress(); new LoadMoreAsyncTask(this, twitter, adapter.getLastId()-1, false).execute(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { return MenuHelper.openActivityFromMenuItem(this, item); } private void setLoadMoreViews() { headerView = (LoadMoreListItem) getLayoutInflater().inflate(R.layout.load_more, null); headerView.showHeaderText(); footerView = (LoadMoreListItem) getLayoutInflater().inflate(R.layout.load_more, null); footerView.showFooterText(); getListView().addHeaderView(headerView); getListView().addFooterView(footerView); } }