aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/view/Partials.java
diff options
context:
space:
mode:
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.java233
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()));
+ }
+}