package com.koushikdutta.ion.sample; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.koushikdutta.async.future.Future; import com.koushikdutta.async.future.FutureCallback; import com.koushikdutta.ion.Ion; public class Twitter extends Activity { // adapter that holds tweets, obviously :) ArrayAdapter tweetAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Enable global Ion logging // Ion.getDefault(this).setLogging("ion-sample", Log.DEBUG); // create a tweet adapter for our list view tweetAdapter = new ArrayAdapter(this, 0) { @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) convertView = getLayoutInflater().inflate(R.layout.tweet, null); // we're near the end of the list adapter, so load more items if (position >= getCount() - 3) load(); // grab the tweet (or retweet) JsonObject tweet = getItem(position); JsonObject retweet = tweet.getAsJsonObject("retweeted_status"); if (retweet != null) tweet = retweet; // grab the user info... name, profile picture, tweet text JsonObject user = tweet.getAsJsonObject("user"); String twitterId = user.get("screen_name").getAsString(); // set the profile photo using Ion String imageUrl = user.get("profile_image_url").getAsString(); ImageView imageView = (ImageView)convertView.findViewById(R.id.image); // Use Ion's builder set the google_image on an ImageView from a URL // start with the ImageView Ion.with(imageView) // use a placeholder google_image if it needs to load from the network .placeholder(R.drawable.twitter) // load the url .load(imageUrl); // and finally, set the name and text TextView handle = (TextView)convertView.findViewById(R.id.handle); handle.setText(twitterId); TextView text = (TextView)convertView.findViewById(R.id.tweet); text.setText(tweet.get("text").getAsString()); return convertView; } }; // basic setup of the ListView and adapter setContentView(R.layout.twitter); ListView listView = (ListView)findViewById(R.id.list); listView.setAdapter(tweetAdapter); // authenticate and do the first load getCredentials(); } // This "Future" tracks loading operations. // A Future is an object that manages the state of an operation // in progress that will have a "Future" result. // You can attach callbacks (setCallback) for when the result is ready, // or cancel() it if you no longer need the result. Future loading; String accessToken; private void getCredentials() { Ion.with(this) .load("https://api.twitter.com/oauth2/token") // embedding twitter api key and secret is a bad idea, but this isn't a real twitter app :) .basicAuthentication("e4LrcHB55R3WamRYHpNfA", "MIABn1DU5db3Aj0xXzhthsf4aUKMAdoWJTMxJJcY") .setBodyParameter("grant_type", "client_credentials") .asJsonObject() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, JsonObject result) { if (e != null) { Toast.makeText(Twitter.this, "Error loading tweets", Toast.LENGTH_LONG).show(); return; } accessToken = result.get("access_token").getAsString(); load(); } }); } private void load() { // don't attempt to load more if a load is already in progress if (loading != null && !loading.isDone() && !loading.isCancelled()) return; // load the tweets String url = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=dog_rates&count=20"; if (tweetAdapter.getCount() > 0) { // load from the "last" id JsonObject last = tweetAdapter.getItem(tweetAdapter.getCount() - 1); url += "&max_id=" + last.get("id_str").getAsString(); } // Request tweets from Twitter using Ion. // This is done using Ion's Fluent/Builder API. // This API lets you chain calls together to build // complex requests. // This request loads a URL as JsonArray and invokes // a callback on completion. loading = Ion.with(this) .load(url) .setHeader("Authorization", "Bearer " + accessToken) .asJsonArray() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, JsonArray result) { // this is called back onto the ui thread, no Activity.runOnUiThread or Handler.post necessary. if (e != null) { Toast.makeText(Twitter.this, "Error loading tweets", Toast.LENGTH_LONG).show(); return; } // add the tweets for (int i = 0; i < result.size(); i++) { tweetAdapter.add(result.get(i).getAsJsonObject()); } } }); } }