/* * 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.adapters; import android.app.ProgressDialog; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Shader; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.text.Html; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.*; import com.android.dataframework.DataFramework; import com.android.dataframework.Entity; import com.androidquery.AQuery; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.javielinux.api.APIDelegate; import com.javielinux.api.APITweetTopics; import com.javielinux.api.request.LoadLinkRequest; import com.javielinux.api.request.LoadMoreTweetDownRequest; import com.javielinux.api.response.ErrorResponse; import com.javielinux.api.response.LoadLinkResponse; import com.javielinux.api.response.LoadMoreTweetDownResponse; import com.javielinux.components.LoadMoreBreakListItem; import com.javielinux.infos.InfoLink; import com.javielinux.infos.InfoTweet; import com.javielinux.tweettopics2.BaseLayersActivity; import com.javielinux.tweettopics2.R; import com.javielinux.tweettopics2.ThemeManager; import com.javielinux.tweettopics2.UserActivity; import com.javielinux.utils.*; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.RejectedExecutionException; public class TweetsAdapter extends ArrayAdapter<InfoTweet> { public static class ViewHolder { public ImageView avatarView; public ImageView tagMap; public ImageView tagConversation; public TextView screenName; public TextView statusText; public TextView sourceText; public TextView dateText; public LinearLayout tweetPhotoImgContainer; public ImageView tweetPhotoImg; public RelativeLayout lastReadLayout; public LinearLayout retweetLayout; public ImageView retweetAvatar; public TextView retweetUser; public TextView retweetText; public int typeBackground = -1; public LoadMoreBreakListItem loadMoreBreakListItem; } private ProgressDialog progressDialog; private static HashMap<String, Integer> hashColorUsers = new HashMap<String, Integer>(); private static HashMap<String, Integer> hashColorUsersPosition = new HashMap<String, Integer>(); private static HashMap<String, Integer> hashThemeColors = new HashMap<String, Integer>(); private boolean flinging = false; private ArrayList<InfoTweet> infoTweetArrayList; private long selected_id = -1; private int hide_messages = 0; private int last_read_position = -1; private ThemeManager themeManager; private int color_line; private LoaderManager loaderManager; private long userId; private String usernameColumn; private int column; private FragmentActivity activity; private AQuery listAQuery; private PullToRefreshListView parentListView; private SharedPreferences preference; private Fragment fragment; public FragmentActivity getActivity() { return activity; } public Fragment getFragment() { return fragment; } public void setFragment(Fragment fragment) { this.fragment = fragment; } private void callLinksIfIsPossible(View view) { if (getActivity() instanceof PopupLinks.PopupLinksListener) { ((PopupLinks.PopupLinksListener) getActivity()).onShowLinks(view, (InfoTweet) view.getTag()); } } public void setParentListView(PullToRefreshListView parentListView) { this.parentListView = parentListView; } public boolean isFlinging() { return flinging; } public void setFlinging(boolean flinging) { this.flinging = flinging; if (!flinging) { notifyDataSetChanged(); launchVisibleTask(); } } private void loadLinks(int position) { if (infoTweetArrayList.size() <= 0) return; String linkForImage = ""; try { linkForImage = infoTweetArrayList.get(position).getBestLink(); } catch (IndexOutOfBoundsException e) { } if (!linkForImage.equals("") && !linkForImage.startsWith("@") && !linkForImage.startsWith("#")) { if (!CacheData.getInstance().existCacheInfoLink(linkForImage)) { try { APITweetTopics.execute(getContext(), loaderManager, new APIDelegate<LoadLinkResponse>() { @Override public void onResults(LoadLinkResponse result) { if (result.getInfoLink() != null) { if (!isFlinging()) { notifyDataSetChanged(); } } } @Override public void onError(ErrorResponse error) { } }, new LoadLinkRequest(linkForImage, null)); } catch (RejectedExecutionException e) { } } } } public void launchVisibleTask() { if (parentListView != null) { int firstPosition = parentListView.getRefreshableView().getFirstVisiblePosition(); int lastPosition = parentListView.getRefreshableView().getLastVisiblePosition(); for (int i = firstPosition; i <= lastPosition; i++) { loadLinks(i); } } } public TweetsAdapter(FragmentActivity activity, LoaderManager loaderManager, ArrayList<InfoTweet> infoTweetArrayList, long userId, String usernameColumn, int column) { super(activity, android.R.layout.simple_list_item_1, infoTweetArrayList); init(activity, loaderManager, infoTweetArrayList, userId, usernameColumn, column); } public TweetsAdapter(FragmentActivity activity, LoaderManager loaderManager, ArrayList<InfoTweet> infoTweetArrayList) { super(activity, android.R.layout.simple_list_item_1, infoTweetArrayList); init(activity, loaderManager, infoTweetArrayList, -1, "", -1); } private void init(FragmentActivity activity, LoaderManager loaderManager, ArrayList<InfoTweet> infoTweetArrayList, long userId, String usernameColumn, int column) { this.activity = activity; listAQuery = new AQuery(activity); Log.d(Utils.TAG, "Numero de elementos: " + infoTweetArrayList.size()); this.infoTweetArrayList = infoTweetArrayList; this.userId = userId; this.usernameColumn = usernameColumn; this.column = column; this.loaderManager = loaderManager; themeManager = new ThemeManager(activity); color_line = themeManager.getColor("color_tweet_no_read"); ArrayList<Entity> colors = DataFramework.getInstance().getEntityList("colors", "type_id=2", ""); int count = 0; for (Entity color : colors) { hashColorUsers.put(color.getString("word"), Color.parseColor(themeManager.getColors().get(color.getEntity("type_color_id").getInt("pos")))); hashColorUsersPosition.put(color.getString("word"), count); count++; } hashThemeColors.put("list_background_row_color", themeManager.getColor("list_background_row_color")); hashThemeColors.put("color_tweet_text", themeManager.getColor("color_tweet_text")); hashThemeColors.put("color_tweet_source", themeManager.getColor("color_tweet_source")); hashThemeColors.put("color_tweet_retweet", themeManager.getColor("color_tweet_retweet")); hashThemeColors.put("color_tweet_usename", themeManager.getColor("color_tweet_usename")); hashThemeColors.put("color_tweet_date", themeManager.getColor("color_tweet_date")); PreferenceManager.setDefaultValues(activity, R.xml.preferences, false); preference = PreferenceManager.getDefaultSharedPreferences(activity); } public static ViewHolder generateViewHolder(View v) { ViewHolder viewHolder = new ViewHolder(); viewHolder.avatarView = (ImageView) v.findViewById(R.id.user_avatar); viewHolder.tagMap = (ImageView) v.findViewById(R.id.tag_map); viewHolder.tagConversation = (ImageView) v.findViewById(R.id.tag_conversation); viewHolder.screenName = (TextView) v.findViewById(R.id.tweet_user_name_text); viewHolder.statusText = (TextView) v.findViewById(R.id.tweet_text); viewHolder.dateText = (TextView) v.findViewById(R.id.tweet_date); viewHolder.sourceText = (TextView) v.findViewById(R.id.tweet_source); viewHolder.tweetPhotoImg = (ImageView) v.findViewById(R.id.tweet_photo_img); viewHolder.tweetPhotoImgContainer = (LinearLayout) v.findViewById(R.id.tweet_photo_img_container); viewHolder.lastReadLayout = (RelativeLayout) v.findViewById(R.id.lastread_layout); viewHolder.retweetLayout = (LinearLayout) v.findViewById(R.id.retweet_layout); viewHolder.retweetAvatar = (ImageView) v.findViewById(R.id.retweet_avatar); viewHolder.retweetUser = (TextView) v.findViewById(R.id.retweet_user); viewHolder.retweetText = (TextView) v.findViewById(R.id.retweet_text); viewHolder.loadMoreBreakListItem = (LoadMoreBreakListItem) v.findViewById(R.id.load_more_break); return viewHolder; } @Override public View getView(final int position, View convertView, ViewGroup parent) { InfoTweet infoTweet = getItem(position); ViewHolder viewHolder = null; if (null == convertView) { convertView = activity.getLayoutInflater().inflate(R.layout.tweet_list_view_item, parent, false); //view = (RelativeLayout) View.inflate(getContext(), R.layout.tweet_list_view_item, null); viewHolder = generateViewHolder(convertView); convertView.setTag(viewHolder); loadLinks(position); } else { viewHolder = (ViewHolder) convertView.getTag(); } int typeBackground = -1; if (selected_id == position) { typeBackground = 2; if (infoTweet.isRead()) typeBackground++; if (viewHolder.typeBackground != typeBackground) { convertView.setBackgroundDrawable(ImageUtils.createGradientDrawableSelected(getContext(), infoTweet.isRead() ? 0 : color_line)); } } else if (column == TweetTopicsUtils.COLUMN_TIMELINE && infoTweet.getText().toLowerCase().contains("@" + usernameColumn.toLowerCase())) { typeBackground = 4; if (infoTweet.isRead()) typeBackground++; if (viewHolder.typeBackground != typeBackground) { convertView.setBackgroundDrawable(ImageUtils.createGradientDrawableMention(getContext(), infoTweet.isRead() ? 0 : color_line)); } } else if ((column == TweetTopicsUtils.COLUMN_MENTIONS || column == TweetTopicsUtils.COLUMN_TIMELINE) && infoTweet.isFavorited()) { typeBackground = 6; if (infoTweet.isRead()) typeBackground++; if (viewHolder.typeBackground != typeBackground) { convertView.setBackgroundDrawable(ImageUtils.createGradientDrawableFavorite(getContext(), infoTweet.isRead() ? 0 : color_line)); } } else { if (hashColorUsers.containsKey(infoTweet.getUsername())) { typeBackground = 8 + (hashColorUsersPosition.get(infoTweet.getUsername()) * 2); if (infoTweet.isRead()) typeBackground++; if (viewHolder.typeBackground != typeBackground) { convertView.setBackgroundDrawable(ImageUtils.createStateListDrawable(getContext(), hashColorUsers.get(infoTweet.getUsername()), infoTweet.isRead() ? 0 : color_line)); } } else { typeBackground = 0; if (infoTweet.isRead()) typeBackground++; if (viewHolder.typeBackground != typeBackground) { convertView.setBackgroundDrawable(ImageUtils.createStateListDrawable(getContext(), hashThemeColors.get("list_background_row_color"), infoTweet.isRead() ? 0 : color_line)); } } } viewHolder.typeBackground = typeBackground; AQuery aQuery = listAQuery.recycle(convertView); // ponerla barra naranja if (infoTweet.isMoreTweetDown()) { viewHolder.loadMoreBreakListItem.setBackgroundDrawable(ImageUtils.createStateListDrawable(getContext(), themeManager.getColor("color_load_more_break"))); viewHolder.loadMoreBreakListItem.showText(); try { final InfoTweet next = getItem(position+1); if (next != null) { viewHolder.loadMoreBreakListItem.showText(Utils.diffDate(infoTweet.getDate(), next.getDate())); viewHolder.loadMoreBreakListItem.setTag(infoTweet); viewHolder.loadMoreBreakListItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loadMoreBreakTweets((InfoTweet)view.getTag(), next, position); } }); } } catch (RuntimeException e) { } catch (Exception e) { } viewHolder.loadMoreBreakListItem.setVisibility(View.VISIBLE); } else { viewHolder.loadMoreBreakListItem.setVisibility(View.GONE); } String html = ""; if (infoTweet.getTextHTMLFinal().equals("")) { String[] in = Utils.toHTMLTyped(activity, infoTweet.getText(), infoTweet.getTextURLs()); html = in[1]; infoTweet.setTextFinal(in[0]); infoTweet.setTextHTMLFinal(in[1]); } else { html = infoTweet.getTextHTMLFinal(); } viewHolder.statusText.setTextColor(hashThemeColors.get("color_tweet_text")); viewHolder.sourceText.setTextColor(hashThemeColors.get("color_tweet_source")); viewHolder.retweetUser.setTextColor(hashThemeColors.get("color_tweet_retweet")); viewHolder.screenName.setTextColor(hashThemeColors.get("color_tweet_usename")); viewHolder.dateText.setTextColor(hashThemeColors.get("color_tweet_date")); if (infoTweet.isLastRead()) { BitmapDrawable bmp = (BitmapDrawable) getContext().getResources().getDrawable(R.drawable.readafter_tile); bmp.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); viewHolder.lastReadLayout.setBackgroundDrawable(bmp); } else { viewHolder.lastReadLayout.setBackgroundColor(Color.TRANSPARENT); } // TODO mostrar el numero de retweets /* if (TweetTopicsCore.isTypeList(TweetTopicsCore.TYPE_LIST_RETWEETS)) { if (infoTweet.getRetweetCount()>0) { viewHolder.tagAvatar.setImageBitmap(Utils.getBitmapNumber(cnt, (int)infoTweet.getRetweetCount(), Color.RED, Utils.TYPE_BUBBLE, 12)); } else { viewHolder.tagAvatar.setImageBitmap(null); } } */ if (infoTweet.hasGeoLocation()) { viewHolder.tagMap.setVisibility(View.VISIBLE); } else { viewHolder.tagMap.setVisibility(View.GONE); } if (infoTweet.hasConversation()) { viewHolder.tagConversation.setVisibility(View.VISIBLE); } else { viewHolder.tagConversation.setVisibility(View.GONE); } aQuery.id(viewHolder.statusText).text(Html.fromHtml(html)); viewHolder.statusText.setTextSize(PreferenceUtils.getSizeText(getContext())); int typeInfo = Integer.parseInt(preference.getString("prf_username_right", "2")); String data = ""; if (typeInfo == 2) { if (infoTweet.isRetweet()) { data = Html.fromHtml(infoTweet.getSourceRetweet()).toString(); } else { data = Html.fromHtml(infoTweet.getSource()).toString(); } } else if (typeInfo == 3) { data = infoTweet.getFullname(); } aQuery.id(viewHolder.sourceText).text(data); viewHolder.sourceText.setTextSize(PreferenceUtils.getSizeTitles(getContext()) - 1); if (infoTweet.isRetweet()) { viewHolder.retweetLayout.setVisibility(View.VISIBLE); aQuery.id(viewHolder.screenName).text(infoTweet.getUsernameRetweet()); aQuery.id(viewHolder.retweetUser).text(infoTweet.getUsername()); aQuery.id(viewHolder.retweetText).text(R.string.retweet_by); viewHolder.retweetAvatar.setVisibility(View.VISIBLE); } else { aQuery.id(viewHolder.screenName).text(infoTweet.getUsername()); viewHolder.retweetLayout.setVisibility(View.GONE); } // si es un DM usamos el layout de retweet para poner el nombre al que le escribimos if (infoTweet.isDm()) { if (!infoTweet.getToUsername().equals("") && !infoTweet.getToUsername().equals(usernameColumn)) { viewHolder.retweetLayout.setVisibility(View.VISIBLE); aQuery.id(viewHolder.retweetUser).text(infoTweet.getUsername()); aQuery.id(viewHolder.retweetText).text(R.string.sent_to); viewHolder.retweetAvatar.setVisibility(View.GONE); } } viewHolder.screenName.setTextSize(PreferenceUtils.getSizeTitles(getContext())); aQuery.id(viewHolder.dateText).text(infoTweet.getTime(getContext())); viewHolder.dateText.setTextSize(PreferenceUtils.getSizeTitles(getContext()) - 4); String mUrlAvatar = infoTweet.getUrlAvatar(); String mRetweetUrlAvatar = infoTweet.getUrlAvatarRetweet(); boolean isRetweet = infoTweet.isRetweet(); if (isRetweet) { Bitmap retweetAvatar = aQuery.getCachedImage(mUrlAvatar); if (retweetAvatar != null) { aQuery.id(viewHolder.retweetAvatar).image(retweetAvatar); } else { aQuery.id(viewHolder.retweetAvatar).image(mUrlAvatar, true, true, 0, R.drawable.avatar_small); } Bitmap avatar = aQuery.getCachedImage(mRetweetUrlAvatar); if (avatar != null) { aQuery.id(viewHolder.avatarView).image(avatar); } else { aQuery.id(viewHolder.avatarView).image(mRetweetUrlAvatar, true, true, 0, R.drawable.avatar, aQuery.getCachedImage(R.drawable.avatar), 0); } viewHolder.avatarView.setTag(infoTweet.getUsernameRetweet()); } else { Bitmap avatar = aQuery.getCachedImage(mUrlAvatar); if (avatar != null) { aQuery.id(viewHolder.avatarView).image(avatar); } else { aQuery.id(viewHolder.avatarView).image(mUrlAvatar, true, true, 0, R.drawable.avatar, aQuery.getCachedImage(R.drawable.avatar), 0); } viewHolder.avatarView.setTag(infoTweet.getUsername()); } viewHolder.avatarView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getActivity() instanceof BaseLayersActivity) { Bundle bundle = new Bundle(); bundle.putString(UserActivity.KEY_EXTRAS_USER, v.getTag().toString()); ((BaseLayersActivity) getActivity()).startAnimationActivity(UserActivity.class, bundle); } } }); viewHolder.statusText.setTag(infoTweet); // buscar imagenes de los tweets //ArrayList<String> links = LinksUtils.pullLinks(infoTweet.getText(), infoTweet.getContentURLs()); String linkForImage = infoTweet.getBestLink(); if (linkForImage.equals("")) { viewHolder.tweetPhotoImgContainer.setVisibility(View.GONE); } else { viewHolder.tweetPhotoImgContainer.setTag(infoTweet); viewHolder.tweetPhotoImgContainer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { callLinksIfIsPossible(view); } }); viewHolder.tweetPhotoImgContainer.setVisibility(View.VISIBLE); if (infoTweet.getLinksCount() > 1) { viewHolder.tweetPhotoImgContainer.setBackgroundResource(R.drawable.container_image_multiple); } else { viewHolder.tweetPhotoImgContainer.setBackgroundResource(R.drawable.container_image_simple); } InfoLink infoLink = null; if (CacheData.getInstance().existCacheInfoLink(linkForImage)) { infoLink = CacheData.getInstance().getCacheInfoLink(linkForImage); } int typeResource = getTypeResource(linkForImage); if (infoLink != null) { String thumb = infoLink.getLinkImageThumb(); if (thumb.equals("")) { aQuery.id(viewHolder.tweetPhotoImg).image(typeResource); } else { Bitmap image = aQuery.getCachedImage(infoLink.getLinkImageThumb()); if (image != null) { aQuery.id(viewHolder.tweetPhotoImg).image(image); } else { aQuery.id(viewHolder.tweetPhotoImg).image(infoLink.getLinkImageThumb(), true, true, 0, typeResource, aQuery.getCachedImage(typeResource), 0); } } } else { // si no tenemos InfoLink en cache aQuery.id(viewHolder.tweetPhotoImg).image(typeResource); } } return convertView; } private void loadMoreBreakTweets(final InfoTweet current, InfoTweet next, final int position) { progressDialog = new ProgressDialog(getActivity()); progressDialog.setTitle(R.string.loading); progressDialog.setMessage(getContext().getString(R.string.loading)); progressDialog.setCancelable(false); progressDialog.show(); APITweetTopics.execute(activity, loaderManager, new APIDelegate<LoadMoreTweetDownResponse>() { @Override public void onResults(LoadMoreTweetDownResponse result) { progressDialog.dismiss(); current.setMoreTweetDown(false); Entity currentEntity = new Entity("tweets_user", current.getIdDB()); currentEntity.setValue("has_more_tweets_down", 0); currentEntity.save(); for (int i = result.getTweets().size()-1; i>=0; i--) { InfoTweet infoTweet = result.getTweets().get(i); infoTweet.setRead(false); if (result.isHasMoreTweets() && i>=result.getTweets().size()-1) { infoTweet.setMoreTweetDown(true); } infoTweetArrayList.add(position + 1, infoTweet); } notifyDataSetChanged(); if (fragment != null && fragment instanceof ListFragmentListener) { ((ListFragmentListener)fragment).onMarkPositionLastReadAsLastReadId(position+result.getTweets().size()-1); } if (parentListView != null) { parentListView.getRefreshableView().setSelection(position+result.getTweets().size()-1); } } @Override public void onError(ErrorResponse error) { progressDialog.dismiss(); } }, new LoadMoreTweetDownRequest(userId, next.getId(), current.getId())); } 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 void addHideMessages(int hide_messages) { this.hide_messages += hide_messages; } public int getHideMessages() { return this.hide_messages; } public void setHideMessages(int hide_messages) { this.hide_messages = hide_messages; } public int getLastReadPosition() { return this.last_read_position; } public void setLastReadPosition(int last_read_position) { this.last_read_position = last_read_position; } }