/* * Copyright 2012 Javier Pérez Pacheco and Francisco Díaz Rodriguez * TweetTopics 2.0 * javielinux@gmail.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.javielinux.widget; import android.app.PendingIntent; import android.app.Service; import android.appwidget.AppWidgetManager; import android.content.*; import android.database.CursorIndexOutOfBoundsException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.IBinder; import android.text.Html; import android.util.Log; import android.view.View; import android.widget.RemoteViews; import com.android.dataframework.DataFramework; import com.android.dataframework.Entity; import com.javielinux.database.EntitySearch; import com.javielinux.infos.InfoImagesTweet; import com.javielinux.infos.InfoTweet; import com.javielinux.task.LoadImageWidgetAsyncTask; import com.javielinux.task.LoadImageWidgetAsyncTask.LoadImageWidgetAsyncTaskResponder; import com.javielinux.tweettopics2.R; import com.javielinux.tweettopics2.TweetActivity; import com.javielinux.twitter.ConnectionManager; import com.javielinux.utils.*; import twitter4j.*; import java.io.File; import java.util.ArrayList; import java.util.List; public class ServiceWidgetTweets4x2 extends Service { public Twitter twitter; private int MAX_TWEET = 10; public long UPDATE_WIDGET = 15000; public static int TIMELINE = 0; public static int MENTIONS = 1; public static int SEARCH = 2; private int mType = TIMELINE; private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; private Entity column; private int mCurrentTweet = 0; private long mCurrentSearch = 1; public boolean blocked = false; public Context lastContext; private AppWidgetManager manager; private ComponentName thisWidget; private List<InfoTweet> mTweets = new ArrayList<InfoTweet>(); private ArrayList<InfoImagesTweet> imagesTweet = new ArrayList<InfoImagesTweet>(); private AsyncTask<String, Void,LoadImageWidgetAsyncTask.ImageData> latestLoadTask; private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (!Utils.isLite(context) ) { try { if (intent.getExtras().containsKey("button")) { onHandleAction(context, (Uri)intent.getExtras().get("button")); return; } if (intent.getExtras().containsKey("column_id")) { long column_id = intent.getExtras().getLong("column_id"); column = new Entity("columns", column_id); if (column == null) { column = ColumnsUtils.widgetFirstColumn(); column_id = column.getId(); } PreferenceUtils.setWidgetColumn(context, column_id); } if (intent.getExtras().containsKey("id_search")) { mCurrentSearch = intent.getExtras().getLong("id_search"); mType = SEARCH; PreferenceUtils.setIdSearchWidget(context, mCurrentSearch); PreferenceUtils.setTypeWidget(context, mType); } if (intent.getExtras().containsKey("id_user")) { mType = intent.getExtras().getInt("id_user"); PreferenceUtils.setTypeWidget(context, mType); } } catch (Exception e) { e.printStackTrace(); Log.d(Utils.TAG_WIDGET, "Error al recibir el parametro"); } update(context); getManager().updateAppWidget(getWidget(), getRemoteView(context)); } } }; public void clearImagesTweets() { imagesTweet.clear(); } private Bitmap getIconItem(Context context) { int column_type = column.getInt("type_id"); Bitmap bitmap = null; switch (column_type) { case TweetTopicsUtils.COLUMN_TIMELINE: case TweetTopicsUtils.COLUMN_MENTIONS: case TweetTopicsUtils.COLUMN_DIRECT_MESSAGES: case TweetTopicsUtils.COLUMN_SENT_DIRECT_MESSAGES: case TweetTopicsUtils.COLUMN_RETWEETS_BY_OTHERS: case TweetTopicsUtils.COLUMN_RETWEETS_BY_YOU: case TweetTopicsUtils.COLUMN_FOLLOWERS: case TweetTopicsUtils.COLUMN_FOLLOWINGS: case TweetTopicsUtils.COLUMN_FAVORITES: bitmap = ImageUtils.getBitmapAvatar(column.getEntity("user_id").getId(), Utils.AVATAR_LARGE); break; case TweetTopicsUtils.COLUMN_SEARCH: Entity search_entity = new Entity("search", column.getLong("search_id")); Drawable drawable = Utils.getDrawable(context, search_entity.getString("icon_big")); if (drawable == null) drawable = context.getResources().getDrawable(R.drawable.letter_az); bitmap = ((BitmapDrawable) drawable).getBitmap(); bitmap = Bitmap.createScaledBitmap(bitmap, Utils.AVATAR_LARGE, Utils.AVATAR_LARGE, true); break; case TweetTopicsUtils.COLUMN_LIST_USER: bitmap = ImageUtils.getBitmapAvatar(column.getEntity("userlist_id").getEntity("user_id").getId(), Utils.AVATAR_LARGE); break; } return bitmap; } private InfoImagesTweet getImagesTweets(int position) { for (int i=0; i<imagesTweet.size(); i++) { if (imagesTweet.get(i).getPosition() == position) return imagesTweet.get(i); } return null; } public AppWidgetManager getManager() { if (manager==null) manager = AppWidgetManager.getInstance(this); return manager; } private int getTypeResource(String linkForImage) { int res = 0; if (LinksUtils.isLinkImage(linkForImage)) { if (LinksUtils.isLinkVideo(linkForImage)) { res = R.drawable.icon_tweet_video; } else { res = R.drawable.icon_tweet_image; } } else { if (linkForImage.startsWith("@")) { res = R.drawable.icon_tweet_user; } else if (linkForImage.startsWith("#")) { res = R.drawable.icon_tweet_hashtag ; } else { res = R.drawable.icon_tweet_link; } } return res; } public String getTitleItem() { int type_column = column.getInt("type_id"); switch (type_column) { case TweetTopicsUtils.COLUMN_SEARCH: Entity ent = new Entity("search", column.getLong("search_id")); return ent.getString("name"); case TweetTopicsUtils.COLUMN_LIST_USER: Entity list_user_entity = new Entity("user_lists", column.getLong("userlist_id")); return list_user_entity.getString("name"); case TweetTopicsUtils.COLUMN_TRENDING_TOPIC: return column.getEntity("type_id").getString("title") + " " + column.getString("description"); default: return column.getEntity("type_id").getString("title"); } } public ComponentName getWidget() { if (thisWidget==null) thisWidget = new ComponentName(this, WidgetTweets4x2.class); return thisWidget; } private PendingIntent makeControlPendingIntent(Context context, String command) { Intent active = new Intent(); active.setAction(Utils.ACTION_WIDGET_CONTROL); active.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); Uri data = Uri.parse(Utils.URI_SCHEME + "://command/"+command); active.setData(data); return(PendingIntent.getBroadcast(context, 0, active, PendingIntent.FLAG_UPDATE_CURRENT)); } @Override public void onStart(Intent intent, int startId) { this.registerReceiver(receiver, new IntentFilter(Intent.ACTION_VIEW)); try { if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) { appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } } catch (NullPointerException e) { e.printStackTrace(); } PreferenceUtils.setTypeWidget(this, TIMELINE); PreferenceUtils.setIdSearchWidget(this, 1); ConnectionManager.getInstance().open(this); twitter = ConnectionManager.getInstance().getUserForSearchesTwitter(); try { DataFramework.getInstance().open(this, Utils.packageName); } catch (Exception e) { e.printStackTrace(); } if ( Utils.isLite(this) ) { RemoteViews mRemoteLoading = new RemoteViews(this.getPackageName(), R.layout.widget_lite); Uri uri = Uri.parse("market://search?q=pname:com.javielinux.tweettopics.pro"); Intent buyProIntent = new Intent(Intent.ACTION_VIEW, uri); PendingIntent configurePendingIntent = PendingIntent.getActivity(this, 0, buyProIntent, 0); mRemoteLoading.setOnClickPendingIntent(R.id.btn_w_lite, configurePendingIntent); getManager().updateAppWidget(getWidget(), mRemoteLoading); } else { /*List<Entity> columns = DataFramework.getInstance().getEntityList("columns", "id=" + column); if (columns.size() == 1) { update(this); handler.postDelayed(runnable, UPDATE_WIDGET); getManager().updateAppWidget(getWidget(), getRemoteView(this)); } else { RemoteViews mRemoteLoading = new RemoteViews(this.getPackageName(), R.layout.widget_no_user); getManager().updateAppWidget(getWidget(), mRemoteLoading); }*/ List<Entity> e = DataFramework.getInstance().getEntityList("users", "service is null or service = \"twitter.com\""); if (e.size()>0) { if (DataFramework.getInstance().getEntityList("search").size()>0) { mCurrentSearch = DataFramework.getInstance().getEntityList("search").get(0).getId(); } else { mCurrentSearch = -1; } update(this); getManager().updateAppWidget(getWidget(), getRemoteView(this)); } else { RemoteViews mRemoteLoading = new RemoteViews(this.getPackageName(), R.layout.widget_no_user); getManager().updateAppWidget(getWidget(), mRemoteLoading); } } } public RemoteViews getRemoteView(Context context) { if ( Utils.isLite(context) ) { RemoteViews mRemoteLoading = new RemoteViews(this.getPackageName(), R.layout.widget_lite); Uri uri = Uri.parse("market://search?q=pname:com.javielinux.tweettopics.pro"); Intent buyProIntent = new Intent(Intent.ACTION_VIEW, uri); PendingIntent configurePendingIntent = PendingIntent.getActivity(this, 0, buyProIntent, 0); mRemoteLoading.setOnClickPendingIntent(R.id.btn_w_lite, configurePendingIntent); return mRemoteLoading; } else { lastContext = context; RemoteViews mRemoteView = new RemoteViews(context.getPackageName(), R.layout.widget_main); try { if (column != null) { Bitmap avatar = getIconItem(context); String title = getTitleItem(); mRemoteView.setTextViewText(R.id.w_title, title); if (avatar == null) { mRemoteView.setImageViewResource(R.id.w_icon, R.drawable.avatar); } else { mRemoteView.setImageViewBitmap(R.id.w_icon, avatar); } } mRemoteView.setTextViewText(R.id.w_tweet_user_name_text, mTweets.get(mCurrentTweet).getUsername()); mRemoteView.setTextViewText(R.id.w_tweet_source, Html.fromHtml(mTweets.get(mCurrentTweet).getSource()).toString()); mRemoteView.setTextViewText(R.id.w_tweet_text, Html.fromHtml(Utils.toHTML(context, mTweets.get(mCurrentTweet).getText()))); mRemoteView.setTextViewText(R.id.w_tweet_date, Utils.timeFromTweet(this, mTweets.get(mCurrentTweet).getDate()) ); if (mTweets.get(mCurrentTweet).hasGeoLocation()) { mRemoteView.setViewVisibility(R.id.tag_map, View.VISIBLE); } else { mRemoteView.setViewVisibility(R.id.tag_map, View.GONE); } if (mTweets.get(mCurrentTweet).hasConversation()) { mRemoteView.setViewVisibility(R.id.tag_conversation, View.VISIBLE); } else { mRemoteView.setViewVisibility(R.id.tag_conversation, View.GONE); } if (null != latestLoadTask) { latestLoadTask.cancel(true); } InfoImagesTweet iit = getImagesTweets(mCurrentTweet); if (iit==null) { // si no esta en cache RAM se busca en el telefono String urlAvatar = mTweets.get(mCurrentTweet).getUrlAvatar(); File file = Utils.getFileForSaveURL(context, urlAvatar); if (file.exists()) { Bitmap bmp = BitmapFactory.decodeFile(file.getAbsolutePath()); if (bmp != null) { iit = new InfoImagesTweet(mCurrentTweet); iit.setBmpAvatar(bmp); imagesTweet.add(iit); } } } if (iit==null) { // no estan las imagenes en cache mRemoteView.setImageViewResource(R.id.w_user_avatar, R.drawable.avatar); latestLoadTask = new LoadImageWidgetAsyncTask(new LoadImageWidgetAsyncTaskResponder() { @Override public void imageWidgetLoadCancelled() { } @Override public void imageWidgetLoaded(LoadImageWidgetAsyncTask.ImageData data) { try { InfoImagesTweet iit = new InfoImagesTweet(mCurrentTweet); iit.setBmpAvatar(data.bitmap); imagesTweet.add(iit); getManager().updateAppWidget(getWidget(), getRemoteView(lastContext)); } catch (Exception e) { e.printStackTrace(); } } @Override public void imageWidgetLoading() { } }).execute(mTweets.get(mCurrentTweet).getUrlAvatar()); } else { // si estan las imagenes en cache mRemoteView.setImageViewBitmap(R.id.w_user_avatar, iit.getBmpAvatar()); } mRemoteView.setOnClickPendingIntent(R.id.w_tweet_layout, makeControlPendingIntent(context, "app")); mRemoteView.setOnClickPendingIntent(R.id.btn_w_refresh, makeControlPendingIntent(context, "refresh")); mRemoteView.setOnClickPendingIntent(R.id.btn_w_next, makeControlPendingIntent(context, "next")); mRemoteView.setOnClickPendingIntent(R.id.btn_w_prev, makeControlPendingIntent(context, "prev")); Intent configureIntent = new Intent(context, WidgetTweetsConf4x2.class); configureIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); PendingIntent configurePendingIntent = PendingIntent.getActivity(context, 0, configureIntent, 0); mRemoteView.setOnClickPendingIntent(R.id.btn_w_configure, configurePendingIntent); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); column = ColumnsUtils.widgetFirstColumn(); if (column != null) { PreferenceUtils.setWidgetColumn(context, column.getId()); mRemoteView.setTextViewText(R.id.w_tweet_text, "Error"); } } catch (Exception e) { e.printStackTrace(); column = ColumnsUtils.widgetFirstColumn(); if (column != null) { PreferenceUtils.setWidgetColumn(context, column.getId()); mRemoteView.setTextViewText(R.id.w_tweet_text, "Error"); } } return mRemoteView; } } public void update(Context context) { blocked = true; mCurrentTweet = 0; RemoteViews mRemoteLoading = new RemoteViews(context.getPackageName(), R.layout.widget_loading); getManager().updateAppWidget(getWidget(), mRemoteLoading); mTweets.clear(); clearImagesTweets(); mType = PreferenceUtils.getTypeWidget(context); mCurrentSearch = PreferenceUtils.getIdSearchWidget(context); long column_id = PreferenceUtils.getWidgetColumn(context); try { column = new Entity("columns", column_id); } catch (CursorIndexOutOfBoundsException e) { } catch (Exception e) { } if (column != null) { ArrayList<Entity> tweetList = new ArrayList<Entity>(); switch (column.getInt("type_id")) { case TweetTopicsUtils.COLUMN_TIMELINE: //loadUser(columns.get(0).getEntity("user_id").getId()); tweetList.addAll(DataFramework.getInstance().getEntityList("tweets_user", "type_id=" + TweetTopicsUtils.TWEET_TYPE_TIMELINE + " and user_tt_id=" + column.getEntity("user_id").getId(), "date desc", "0,10")); for (int i=0; i<tweetList.size();i++) { mTweets.add(new InfoTweet(tweetList.get(i))); } break; case TweetTopicsUtils.COLUMN_MENTIONS: //loadUser(columns.get(0).getEntity("user_id").getId()); tweetList.addAll(DataFramework.getInstance().getEntityList("tweets_user", "type_id=" + TweetTopicsUtils.TWEET_TYPE_MENTIONS + " and user_tt_id=" + column.getEntity("user_id").getId(), "date desc", "0,10")); for (int i=0; i<tweetList.size();i++) { mTweets.add(new InfoTweet(tweetList.get(i))); } break; case TweetTopicsUtils.COLUMN_DIRECT_MESSAGES: //loadUser(columns.get(0).getEntity("user_id").getId()); tweetList.addAll(DataFramework.getInstance().getEntityList("tweets_user", "type_id=" + TweetTopicsUtils.TWEET_TYPE_DIRECTMESSAGES + " and user_tt_id=" + column.getEntity("user_id").getId(), "date desc", "0,10")); for (int i=0; i<tweetList.size();i++) { mTweets.add(new InfoTweet(tweetList.get(i))); } break; case TweetTopicsUtils.COLUMN_SEARCH: try { EntitySearch entitySearch = new EntitySearch(column.getLong("search_id")); QueryResult result = twitter.search(entitySearch.getQuery(context)); ArrayList<Status> tweets = (ArrayList<Status>)result.getTweets(); for (int i=0; i<10; i++) { mTweets.add(new InfoTweet(tweets.get(i))); } } catch (TwitterException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } break; // case TweetTopicsUtils.COLUMN_RETWEETS_BY_OTHERS: // // TODO retweet // try { // ResponseList<Status> statii = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).getRetweetsOfMe(); // // for (int i=0; i<statii.size(); i++) { // mTweets.add(new InfoTweet(statii.get(i))); // } // } catch (TwitterException e) { // e.printStackTrace(); // } catch (Exception e) { // e.printStackTrace(); // } // break; // case TweetTopicsUtils.COLUMN_RETWEETS_BY_YOU: // // TODO retweet //// try { //// ResponseList<Status> statii = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).getRetweetedByMe(); //// //// for (int i=0; i<statii.size(); i++) { //// mTweets.add(new InfoTweet(statii.get(i))); //// } //// } catch (TwitterException e) { //// e.printStackTrace(); //// } catch (Exception e) { //// e.printStackTrace(); //// } // break; // case TweetTopicsUtils.COLUMN_FAVORITES: // try { // ResponseList<Status> statii = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).getFavorites(); // // for (int i=0; i<statii.size(); i++) { // mTweets.add(new InfoTweet(statii.get(i))); // } // } catch (TwitterException e) { // e.printStackTrace(); // } catch (Exception e) { // e.printStackTrace(); // } // break; // case TweetTopicsUtils.COLUMN_FOLLOWERS: // try { // IDs followers_ids = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).getFollowersIDs(column.getEntity("user_id").getString("name"), -1); // // ResponseList<User> users = null; // // if (followers_ids.getIDs().length <= 100) { // users = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).lookupUsers(followers_ids.getIDs()); // } else { // int hundred_count = followers_ids.getIDs().length / 100; // // for (int i=0; i < hundred_count; i++) { // if (users == null) // users = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).lookupUsers(Arrays.copyOfRange(followers_ids.getIDs(), i * 100, (i + 1) * 100 - 1)); // else // users.addAll(ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).lookupUsers(Arrays.copyOfRange(followers_ids.getIDs(),i*100,(i+1)*100-1))); // } // // if (followers_ids.getIDs().length % 100 > 0) // users.addAll(ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).lookupUsers(Arrays.copyOfRange(followers_ids.getIDs(),hundred_count*100 + 1,followers_ids.getIDs().length-1))); // } // // for (User user : users) { // InfoTweet row = new InfoTweet(user); // mTweets.add(row); // } // } catch (TwitterException e) { // e.printStackTrace(); // } catch (Exception e) { // e.printStackTrace(); // } // break; // case TweetTopicsUtils.COLUMN_FOLLOWINGS: // try { // IDs friends_ids = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).getFriendsIDs(column.getEntity("user_id").getString("name"), -1); // // ResponseList<User> users = null; // // if (friends_ids.getIDs().length <= 100) { // users = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).lookupUsers(friends_ids.getIDs()); // } else { // int hundred_count = friends_ids.getIDs().length / 100; // // for (int i=0; i < hundred_count; i++) { // if (users == null) // users = ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).lookupUsers(Arrays.copyOfRange(friends_ids.getIDs(), i * 100, (i + 1) * 100 - 1)); // else // users.addAll(ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).lookupUsers(Arrays.copyOfRange(friends_ids.getIDs(),i*100,(i+1)*100-1))); // } // // if (friends_ids.getIDs().length % 100 > 0) // users.addAll(ConnectionManager.getInstance().getTwitter(column.getEntity("user_id").getId()).lookupUsers(Arrays.copyOfRange(friends_ids.getIDs(),hundred_count*100 + 1,friends_ids.getIDs().length-1))); // } // // for (User user : users) { // InfoTweet row = new InfoTweet(user); // mTweets.add(row); // } // } catch (TwitterException e) { // e.printStackTrace(); // } catch (Exception e) { // e.printStackTrace(); // } // break; case TweetTopicsUtils.COLUMN_LIST_USER: try { Entity user_list_entity = new Entity("user_lists", Long.parseLong(column.getValue("userlist_id").toString())); ResponseList<twitter4j.Status> statii = ConnectionManager.getInstance().getTwitter(user_list_entity.getLong("user_id")).getUserListStatuses(user_list_entity.getInt("userlist_id"), new Paging(1)); for (int i=0; i<10; i++) { mTweets.add(new InfoTweet(statii.get(i))); } } catch (TwitterException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } blocked = false; } public void onHandleAction(Context context, Uri data) { if (!blocked) { Log.d(Utils.TAG_WIDGET, "onHandleAction"); if (data.equals(Uri.parse(Utils.URI_SCHEME + "://command/refresh"))) { Log.d(Utils.TAG_WIDGET, "update"); update(context); } if (data.equals(Uri.parse(Utils.URI_SCHEME + "://command/prev"))) { Log.d(Utils.TAG_WIDGET, "prev"); prev(); } if (data.equals(Uri.parse(Utils.URI_SCHEME + "://command/next"))) { Log.d(Utils.TAG_WIDGET, "next"); next(); } if (data.equals(Uri.parse(Utils.URI_SCHEME + "://command/app"))) { // Intent i = new Intent(context, TweetTopicsActivity.class); // i.setAction(Intent.ACTION_VIEW); // i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // i.putExtra(TweetTopicsActivity.KEY_EXTRAS_GOTO_COLUMN_POSITION, column.getLong("position")); // i.putExtra(TweetTopicsActivity.KEY_EXTRAS_GOTO_TWEET_ID, mTweets.get(mCurrentTweet).getId()); Intent i = new Intent(context, TweetActivity.class); i.setAction(Intent.ACTION_VIEW); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Bundle bundle = new Bundle(); bundle.putParcelable(TweetActivity.KEY_EXTRAS_TWEET, mTweets.get(mCurrentTweet)); i.putExtra(Utils.KEY_ACTIVITY_ANIMATION, Utils.ACTIVITY_ANIMATION_RIGHT); i.putExtra(Utils.KEY_EXTRAS_INFO, bundle); context.startActivity(i); } getManager().updateAppWidget(getWidget(), getRemoteView(context)); } else { Log.d(Utils.TAG_WIDGET, "Botones bloqueados"); } } public void loadUser(long id) { twitter = ConnectionManager.getInstance().getTwitter(id); } private void prev() { if (mCurrentTweet > 0) { mCurrentTweet--; } else { mCurrentTweet = MAX_TWEET-1; } } private void next() { if (mCurrentTweet < MAX_TWEET-1) { mCurrentTweet++; } else { mCurrentTweet = 0; } } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); this.unregisterReceiver(receiver); DataFramework.getInstance().close(); } }