diff options
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/view/Partials.java')
-rw-r--r-- | app/src/main/java/net/lacolaco/smileessence/view/Partials.java | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/Partials.java b/app/src/main/java/net/lacolaco/smileessence/view/Partials.java new file mode 100644 index 00000000..c6f8ffef --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/view/Partials.java @@ -0,0 +1,233 @@ +package net.lacolaco.smileessence.view; + +import android.app.Activity; +import android.text.Html; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; +import com.android.volley.toolbox.NetworkImageView; +import net.lacolaco.smileessence.Application; +import net.lacolaco.smileessence.R; +import net.lacolaco.smileessence.activity.MainActivity; +import net.lacolaco.smileessence.data.Account; +import net.lacolaco.smileessence.data.ImageCache; +import net.lacolaco.smileessence.entity.DirectMessage; +import net.lacolaco.smileessence.entity.RBinding; +import net.lacolaco.smileessence.entity.Tweet; +import net.lacolaco.smileessence.preference.UserPreferenceHelper; +import net.lacolaco.smileessence.util.StringUtils; +import net.lacolaco.smileessence.util.UIObserverBundle; +import net.lacolaco.smileessence.view.adapter.CustomListAdapter; +import net.lacolaco.smileessence.view.dialog.MessageDetailDialogFragment; +import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment; +import net.lacolaco.smileessence.view.dialog.UserDetailDialogFragment; +import net.lacolaco.smileessence.view.listener.ListItemClickListener; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +public class Partials { + public static View getTweetView(Tweet tweet, Activity activity, View convertView, boolean expandEmbeddedTweets) { + if (convertView == null) { + convertView = activity.getLayoutInflater().inflate(R.layout.list_item_status, null); + } + UIObserverBundle bundle = (UIObserverBundle) convertView.getTag(); + if (bundle != null) { + bundle.detachAll(); + } else { + bundle = new UIObserverBundle(); + convertView.setTag(bundle); + } + + convertView.setOnClickListener(new ListItemClickListener(activity, () -> DialogHelper.showDialog(activity, StatusDetailDialogFragment.newInstance(tweet)))); + + updateViewUser(tweet, activity, convertView); + updateViewBody(tweet, activity, convertView); + updateViewFavorited(tweet, convertView); + updateViewEmbeddeds(tweet, activity, convertView, expandEmbeddedTweets); + + final WeakReference<View> weakView = new WeakReference<>(convertView); + final WeakReference<Activity> weakActivity = new WeakReference<>(activity); + bundle.attach(tweet.getOriginalTweet(), changes -> { + View strongView = weakView.get(); + if (strongView != null && changes.contains(RBinding.FAVORITERS)) + updateViewFavorited(tweet, strongView); + }); + bundle.attach(tweet.getUser(), changes -> { + View strongView = weakView.get(); + Activity strongActivity = weakActivity.get(); + if (strongView != null && strongActivity != null && changes.contains(RBinding.BASIC)) + updateViewUser(tweet, strongActivity, strongView); + }); + + return convertView; + } + + + private static void updateViewEmbeddeds(Tweet tweet, Activity activity, View convertView, boolean expandEmbeddedTweets) { + final ListView embeddedStatus = (ListView) convertView.findViewById(R.id.listview_status_embedded_status); + if (expandEmbeddedTweets) { + final List<Tweet> list = new ArrayList<>(); + CustomListAdapter<Tweet> embeddedTweetsAdapter = new CustomListAdapter<Tweet>() { + @Override + protected List<Tweet> getList() { + return list; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return Partials.getTweetView(getItem(position), activity, convertView, false); + } + }; + + Account account = Application.getCurrentWorld().getAccount(); + for (long id : tweet.getEmbeddedStatusIDs()) { + Tweet.fetchTask(id, account).onDone(t -> list.add(t)).execute(); + } + embeddedStatus.setAdapter(embeddedTweetsAdapter); + embeddedStatus.setVisibility(View.VISIBLE); + } else { + embeddedStatus.setAdapter(null); // view may be reused, set null explicitly + embeddedStatus.setVisibility(View.GONE); + } + } + + private static void updateViewUser(Tweet tweet, Activity activity, View convertView) { + int textSize = UserPreferenceHelper.getInstance().getTextSize(); + + NetworkImageView icon = (NetworkImageView) convertView.findViewById(R.id.imageview_status_icon); + String iconUrl = tweet.getOriginalTweet().getUser().getProfileImageUrlOriginal(); + ImageCache.getInstance().setImageToView(iconUrl, icon); + icon.setOnClickListener(v -> onIconClick(tweet, activity)); + + TextView header = (TextView) convertView.findViewById(R.id.textview_status_header); + header.setTextSize(textSize); + header.setText(tweet.getOriginalTweet().getUser().getFormattedName()); + + ((ColoredRelativeLayout) convertView).setAccentVisibility(tweet.getUser() == Application.getCurrentWorld().getAccount().getUser()); + } + + private static void updateViewBody(Tweet tweet, Activity activity, View convertView) { + int textSize = UserPreferenceHelper.getInstance().getTextSize(); + + TextView content = (TextView) convertView.findViewById(R.id.textview_status_text); + content.setTextSize(textSize); + String rawText = tweet.getOriginalTweet().getText(); + content.setText(rawText); + TextView footer = (TextView) convertView.findViewById(R.id.textview_status_footer); + footer.setTextSize(textSize - 2); + footer.setText(getFooterText(tweet)); + + ColoredRelativeLayout typedView = (ColoredRelativeLayout) convertView; + if (tweet.isRetweet()) { + typedView.setHighlight(2); + } else if (tweet.getOriginalTweet().getMentions().contains(Application.getCurrentWorld().getAccount().getUser().getScreenName())) { + typedView.setHighlight(1); + } else { + typedView.setHighlight(0); + } + } + + private static void updateViewFavorited(Tweet tweet, View convertView) { + ImageView favorited = (ImageView) convertView.findViewById(R.id.imageview_status_favorited); + favorited.setVisibility(tweet.isFavoritedBy(Application.getCurrentWorld().getAccount().getUserId()) ? View.VISIBLE : View.GONE); + } + + private static void onIconClick(Tweet tweet, Activity activity) { + UserDetailDialogFragment dialogFragment = new UserDetailDialogFragment(); + dialogFragment.setUserID(tweet.getOriginalTweet().getUser().getId()); + DialogHelper.showDialog(activity, dialogFragment); + } + + private static String getFooterText(Tweet tweet) { + StringBuilder builder = new StringBuilder(); + if (tweet.isRetweet()) { + builder + .append("(RT: ") + .append(tweet.getUser().getScreenName()) + .append(") "); + } + builder.append(StringUtils.dateToString(tweet.getOriginalTweet().getCreatedAt())); + builder.append(" via "); + builder.append(Html.fromHtml(tweet.getOriginalTweet().getSource())); + return builder.toString(); + } + + public static View getDirectMessageView(DirectMessage directMessage, Activity activity, View convertView) { + if (convertView == null) { + convertView = activity.getLayoutInflater().inflate(R.layout.list_item_status, null); + } + UIObserverBundle bundle = (UIObserverBundle) convertView.getTag(); + if (bundle != null) { + bundle.detachAll(); + } else { + bundle = new UIObserverBundle(); + convertView.setTag(bundle); + } + + convertView.setOnClickListener(new ListItemClickListener(activity, () -> { + MessageDetailDialogFragment dialogFragment = new MessageDetailDialogFragment(); + dialogFragment.setMessageID(directMessage.getId()); + DialogHelper.showDialog(activity, dialogFragment); + })); + + ImageView favorited = (ImageView) convertView.findViewById(R.id.imageview_status_favorited); + favorited.setVisibility(View.GONE); + + updateViewSender(directMessage, activity, convertView); + updateViewBody(directMessage, activity, convertView); + + final WeakReference<View> weakView = new WeakReference<>(convertView); + final WeakReference<MainActivity> weakActivity = new WeakReference<>((MainActivity) activity); + bundle.attach(directMessage.getSender(), changes -> { + View strongView = weakView.get(); + MainActivity strongActivity = weakActivity.get(); + if (strongView != null && strongActivity != null && changes.contains(RBinding.BASIC)) + updateViewSender(directMessage, strongActivity, strongView); + }); + + return convertView; + } + + private static String getFooterText(DirectMessage directMessage, Account account) { + StringBuilder builder = new StringBuilder(); + builder.append(StringUtils.dateToString(directMessage.getCreatedAt())); + if (directMessage.getSender().getId() == account.getUserId()) { + builder.append(" to @").append(directMessage.getRecipient().getScreenName()); + } + return builder.toString(); + } + + private static void updateViewSender(DirectMessage directMessage, Activity activity, View convertView) { + int textSize = UserPreferenceHelper.getInstance().getTextSize(); + + NetworkImageView icon = (NetworkImageView) convertView.findViewById(R.id.imageview_status_icon); + String iconUrl = directMessage.getSender().getProfileImageUrlOriginal(); + ImageCache.getInstance().setImageToView(iconUrl, icon); + icon.setOnClickListener(v -> { + UserDetailDialogFragment dialogFragment = new UserDetailDialogFragment(); + dialogFragment.setUserID(directMessage.getSender().getId()); + DialogHelper.showDialog(activity, dialogFragment); + }); + + TextView header = (TextView) convertView.findViewById(R.id.textview_status_header); + header.setTextSize(textSize); + header.setText(directMessage.getSender().getFormattedName()); + + ((ColoredRelativeLayout) convertView).setAccentVisibility(directMessage.getSender() == Application.getCurrentWorld().getAccount().getUser()); + } + + private static void updateViewBody(DirectMessage directMessage, Activity activity, View convertView) { + int textSize = UserPreferenceHelper.getInstance().getTextSize(); + + TextView content = (TextView) convertView.findViewById(R.id.textview_status_text); + content.setTextSize(textSize); + content.setText(directMessage.getText()); + TextView footer = (TextView) convertView.findViewById(R.id.textview_status_footer); + footer.setTextSize(textSize - 2); + footer.setText(getFooterText(directMessage, Application.getCurrentWorld().getAccount())); + } +} |