"; + final CharSequence TAG_END = "
"; + if (status == null) return ""; + SpannableString text = new SpannableString(status.getText()); + //Format links. + URLEntity[] urls = status.getURLEntities(); + if (urls != null) { + for (URLEntity url : urls) { + int start = url.getStart(); + int end = url.getEnd(); + URL expanded_url = url.getExpandedURL(); + if (expanded_url != null) { + text.setSpan(new URLSpan(expanded_url.toString()), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } + //Format mentioned users. + UserMentionEntity[] mentions = status.getUserMentionEntities(); + if (mentions != null) { + for (UserMentionEntity mention : mentions) { + int start = mention.getStart(); + int end = mention.getEnd(); + String link = "https://twitter.com/#!/" + mention.getScreenName(); + if (link != null) { + text.setSpan(new URLSpan(link), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } + //Format hashtags. + HashtagEntity[] hashtags = status.getHashtagEntities(); + if (hashtags != null) { + for (HashtagEntity hashtag : hashtags) { + int start = hashtag.getStart(); + int end = hashtag.getEnd(); + String link = "https://twitter.com/search/#" + hashtag.getText(); + if (link != null) { + text.setSpan(new URLSpan(link), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } + String formatted = Html.toHtml(text); + if (formatted != null && formatted.contains(TAG_START) && formatted.contains(TAG_END)) { + int start = formatted.indexOf(TAG_START.toString()) + TAG_START.length(); + int end = formatted.lastIndexOf(TAG_END.toString()); + return formatted.substring(start, end); + } else { + return formatted; + } + } } diff --git a/src/org/mariotaku/twidere/util/ServiceInterface.java b/src/org/mariotaku/twidere/util/ServiceInterface.java index 1e8c5f52..59e02c12 100644 --- a/src/org/mariotaku/twidere/util/ServiceInterface.java +++ b/src/org/mariotaku/twidere/util/ServiceInterface.java @@ -89,64 +89,69 @@ public IBinder asBinder() { } @Override - public void createFavorite(long[] account_ids, long status_id) { - if (mService == null) return; + public int createFavorite(long[] account_ids, long status_id) { + if (mService == null) return -1; try { - mService.createFavorite(account_ids, status_id); + return mService.createFavorite(account_ids, status_id); } catch (RemoteException e) { e.printStackTrace(); } + return -1; } @Override - public void destroyFavorite(long[] account_ids, long status_id) { - if (mService == null) return; + public int destroyFavorite(long[] account_ids, long status_id) { + if (mService == null) return -1; try { - mService.destroyFavorite(account_ids, status_id); + return mService.destroyFavorite(account_ids, status_id); } catch (RemoteException e) { e.printStackTrace(); } + return -1; } @Override - public void destroyStatus(long account_id, long status_id) { - if (mService == null) return; + public int destroyStatus(long account_id, long status_id) { + if (mService == null) return -1; try { - mService.destroyStatus(account_id, status_id); + return mService.destroyStatus(account_id, status_id); } catch (RemoteException e) { e.printStackTrace(); } + return -1; } @Override - public void getHomeTimeline(long[] account_ids, long[] max_ids) { - if (mService == null) return; + public int getHomeTimeline(long[] account_ids, long[] max_ids) { + if (mService == null) return -1; try { - mService.getHomeTimeline(account_ids, max_ids); + return mService.getHomeTimeline(account_ids, max_ids); } catch (RemoteException e) { e.printStackTrace(); } - + return -1; } @Override - public void getMentions(long[] account_ids, long[] max_ids) { - if (mService == null) return; + public int getMentions(long[] account_ids, long[] max_ids) { + if (mService == null) return -1; try { - mService.getMentions(account_ids, max_ids); + return mService.getMentions(account_ids, max_ids); } catch (RemoteException e) { e.printStackTrace(); } + return -1; } @Override - public void getMessages(long[] account_ids, long[] max_ids) { - if (mService == null) return; + public int getMessages(long[] account_ids, long[] max_ids) { + if (mService == null) return -1; try { - mService.getMessages(account_ids, max_ids); + return mService.getMessages(account_ids, max_ids); } catch (RemoteException e) { e.printStackTrace(); } + return -1; } @Override @@ -189,25 +194,26 @@ public void removeStateListener(StateListener listener) { } @Override - public void retweetStatus(long[] account_ids, long status_id) { - if (mService == null) return; + public int retweetStatus(long[] account_ids, long status_id) { + if (mService == null) return -1; try { - mService.retweetStatus(account_ids, status_id); + return mService.retweetStatus(account_ids, status_id); } catch (RemoteException e) { e.printStackTrace(); } + return -1; } @Override - public void updateStatus(long[] account_ids, String content, Location location, Uri image_uri, + public int updateStatus(long[] account_ids, String content, Location location, Uri image_uri, long in_reply_to) { - if (mService == null) return; + if (mService == null) return -1; try { - mService.updateStatus(account_ids, content, location, image_uri, in_reply_to); + return mService.updateStatus(account_ids, content, location, image_uri, in_reply_to); } catch (RemoteException e) { e.printStackTrace(); } - + return -1; } public interface StateListener { diff --git a/src/org/mariotaku/twidere/util/StatusItemHolder.java b/src/org/mariotaku/twidere/util/StatusItemHolder.java index 8cf1c417..e4cd0036 100644 --- a/src/org/mariotaku/twidere/util/StatusItemHolder.java +++ b/src/org/mariotaku/twidere/util/StatusItemHolder.java @@ -10,7 +10,7 @@ public class StatusItemHolder { public ImageView profile_image, color_indicator; - public TextView user_name, screen_name, tweet_content, tweet_time, in_reply_to; + public TextView user_name, screen_name, text, tweet_time, in_reply_to; public long status_id, account_id; private View content, gap_text; private boolean is_gap; @@ -22,7 +22,7 @@ public StatusItemHolder(View view) { color_indicator = (ImageView) view.findViewById(R.id.color); user_name = (TextView) view.findViewById(R.id.user_name); screen_name = (TextView) view.findViewById(R.id.screen_name); - tweet_content = (TextView) view.findViewById(R.id.text); + text = (TextView) view.findViewById(R.id.text); tweet_time = (TextView) view.findViewById(R.id.tweet_time); in_reply_to = (TextView) view.findViewById(R.id.in_reply_to); diff --git a/src/org/mariotaku/twidere/widget/StatusesAdapter.java b/src/org/mariotaku/twidere/widget/StatusesAdapter.java index 24d8a84c..ed7f8856 100644 --- a/src/org/mariotaku/twidere/widget/StatusesAdapter.java +++ b/src/org/mariotaku/twidere/widget/StatusesAdapter.java @@ -14,16 +14,17 @@ import android.database.Cursor; import android.graphics.Color; import android.support.v4.widget.SimpleCursorAdapter; +import android.text.Html; import android.view.View; import android.view.ViewGroup; public class StatusesAdapter extends SimpleCursorAdapter { - private final static String[] mFrom = new String[] { Statuses.NAME, Statuses.TEXT }; - private final static int[] mTo = new int[] { R.id.user_name, R.id.text }; + private final static String[] mFrom = new String[] { Statuses.NAME}; + private final static int[] mTo = new int[] { R.id.user_name}; private boolean mDisplayProfileImage, mMultipleAccountsActivated; private LazyImageLoader mImageLoader; - private int mAccountIdIdx, mStatusIdIdx, mStatusTimestampIdx, mScreenNameIdx, + private int mAccountIdIdx, mStatusIdIdx, mStatusTimestampIdx, mScreenNameIdx, mTextIdx, mProfileImageUrlIdx, mIsRetweetIdx, mIsFavoriteIdx, mIsGapIdx, mHasLocationIdx, mHasMediaIdx, mInReplyToStatusIdIdx, mInReplyToScreennameIdx; @@ -55,6 +56,7 @@ public void bindView(View view, Context context, Cursor cursor) { if (!is_gap) { String screen_name = cursor.getString(mScreenNameIdx); + String text = cursor.getString(mTextIdx); String profile_image_url = cursor.getString(mProfileImageUrlIdx); boolean is_retweet = cursor.getInt(mIsRetweetIdx) == 1; boolean is_favorite = cursor.getInt(mIsFavoriteIdx) == 1; @@ -63,6 +65,7 @@ public void bindView(View view, Context context, Cursor cursor) { boolean is_reply = cursor.getInt(mInReplyToStatusIdIdx) != -1; holder.screen_name.setText("@" + screen_name); + holder.text.setText(Html.fromHtml(text).toString()); holder.tweet_time.setText(CommonUtils.formatToShortTimeString(context, cursor.getLong(mStatusTimestampIdx))); holder.tweet_time.setCompoundDrawablesWithIntrinsicBounds(0, 0, @@ -101,6 +104,7 @@ public void changeCursor(Cursor cursor) { mStatusIdIdx = cursor.getColumnIndexOrThrow(Statuses.STATUS_ID); mStatusTimestampIdx = cursor.getColumnIndexOrThrow(Statuses.STATUS_TIMESTAMP); mScreenNameIdx = cursor.getColumnIndexOrThrow(Statuses.SCREEN_NAME); + mTextIdx = cursor.getColumnIndexOrThrow(Statuses.TEXT); mProfileImageUrlIdx = cursor.getColumnIndexOrThrow(Statuses.PROFILE_IMAGE_URL); mIsRetweetIdx = cursor.getColumnIndexOrThrow(Statuses.IS_RETWEET); mIsFavoriteIdx = cursor.getColumnIndexOrThrow(Statuses.IS_FAVORITE);