Android Open Source - karin Status List Adapter






From Project

Back to project page karin.

License

The source code is released under:

MIT License

If you think the Android project karin listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package cc.wanko.karin.app.adapters;
/*  www.  j  a v  a 2s.  c om*/
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.text.method.LinkMovementMethod;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;

import java.text.SimpleDateFormat;
import java.util.Date;

import cc.wanko.karin.app.R;
import cc.wanko.karin.app.activities.UserStatusesActivity;
import cc.wanko.karin.app.client.TwitterProvider;
import cc.wanko.karin.app.textbuilder.StatusTextBuilder;
import cc.wanko.karin.app.utils.LruImageCache;
import cc.wanko.karin.app.utils.RoboViewHolder;
import roboguice.inject.InjectView;
import roboguice.util.Ln;
import roboguice.util.RoboAsyncTask;
import twitter4j.MediaEntity;
import twitter4j.Status;
import twitter4j.User;

/**
 * Created by eagletmt on 14/04/29.
 */
public class StatusListAdapter extends ArrayAdapter<Status> {
    private static class ViewHolder extends RoboViewHolder {
        @InjectView(R.id.status_user_icon)
        ImageView userIcon;
        @InjectView(R.id.status_user_name)
        TextView userName;
        @InjectView(R.id.status_created_at)
        TextView createdAt;
        @InjectView(R.id.status_text)
        TextView statusText;
        @InjectView(R.id.status_media_image)
        NetworkImageView mediaImage;
        @InjectView(R.id.status_retweeter_area)
        LinearLayout retweeterArea;
        @InjectView(R.id.status_retweeter_name)
        TextView retweeterName;
        @InjectView(R.id.status_favorite_button)
        ToggleButton favoriteButton;
        @InjectView(R.id.status_retweet_button)
        ToggleButton retweetButton;
        @InjectView(R.id.status_destroy_button)
        ToggleButton destroyButton;

        public ViewHolder(View root) {
            super(root);
        }
    }

    private static class UserIconTag {
        final ImageLoader.ImageContainer imageContainer;
        final long userId;
        final String screenName;

        public UserIconTag(ImageLoader.ImageContainer imageContainer, User user) {
            this.imageContainer = imageContainer;
            this.userId = user.getId();
            this.screenName = user.getScreenName();
        }
    }

    private static class UserNameTag {
        final long userId;
        final String screenName;

        public UserNameTag(User user) {
            this.userId = user.getId();
            this.screenName = user.getScreenName();
        }
    }

    private static class StatusButtonTag {
        final int position;

        public StatusButtonTag(int position) {
            this.position = position;
        }
    }

    private final ImageLoader imageLoader;

    public StatusListAdapter(Context context) {
        super(context, -1);
        RequestQueue queue = Volley.newRequestQueue(getContext());
        imageLoader = new ImageLoader(queue, new LruImageCache());
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = View.inflate(getContext(), R.layout.status_list_item, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Status status = getItem(position);
        Status retweet = status.getRetweetedStatus();
        if (retweet == null) {
            setLayoutHeight(holder.retweeterArea, 0);
        } else {
            User retweeter = status.getUser();
            holder.retweeterName.setText(retweeter.getScreenName());
            setLayoutHeight(holder.retweeterArea, ViewGroup.LayoutParams.WRAP_CONTENT);

            holder.retweeterName.setTag(new UserNameTag(retweeter));
            holder.retweeterName.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    UserNameTag tag = (UserNameTag) view.getTag();
                    getContext().startActivity(UserStatusesActivity.createIntent(getContext(), tag.userId, tag.screenName));
                }
            });

            status = retweet;
        }
        holder.statusText.setText(new StatusTextBuilder(getContext()).buildStatus(status));
        holder.statusText.setMovementMethod(LinkMovementMethod.getInstance());
        holder.createdAt.setText(formatDate(status.getCreatedAt()));
        User user = status.getUser();
        holder.userName.setText(user.getScreenName());

        holder.userIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                UserIconTag tag = (UserIconTag) view.getTag();
                getContext().startActivity(UserStatusesActivity.createIntent(getContext(), tag.userId, tag.screenName));
            }
        });

        UserIconTag tag = (UserIconTag) holder.userIcon.getTag();
        if (tag != null) {
            tag.imageContainer.cancelRequest();
        }
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(holder.userIcon, R.drawable.ic_launcher, android.R.drawable.ic_delete);
        ImageLoader.ImageContainer container = imageLoader.get(user.getBiggerProfileImageURLHttps(), listener);
        holder.userIcon.setTag(new UserIconTag(container, user));

        setupMediaImage(holder.mediaImage, status);

        holder.favoriteButton.setChecked(status.isFavorited());
        holder.favoriteButton.setTag(new StatusButtonTag(position));
        holder.favoriteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ToggleButton button = (ToggleButton) view;
                StatusButtonTag tag = (StatusButtonTag) button.getTag();
                final Status status = getItem(tag.position);

                if (button.isChecked()) {
                    createFavorite(button, status.getId());
                } else {
                    destroyFavorite(button, status.getId());
                }
            }
        });

        if (user.isProtected()) {
            holder.retweetButton.setEnabled(false);
        } else {
            holder.retweetButton.setEnabled(true);
            holder.retweetButton.setChecked(status.isRetweeted());
            holder.retweetButton.setTag(new StatusButtonTag(position));
            holder.retweetButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    final ToggleButton button = (ToggleButton) view;
                    StatusButtonTag tag = (StatusButtonTag) button.getTag();
                    final Status status = getItem(tag.position);

                    if (button.isChecked()) {
                        confirm("Retweet", "RT @" + status.getUser().getScreenName() + ": " + status.getText(),
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int which) {
                                        switch (which) {
                                            case DialogInterface.BUTTON_POSITIVE:
                                                retweetStatus(button, status.getId());
                                            case DialogInterface.BUTTON_NEGATIVE:
                                                button.setChecked(false);
                                        }

                                    }
                                }
                        );
                    }
                }
            });
        }

        holder.destroyButton.setTag(new StatusButtonTag(position));
        holder.destroyButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final ToggleButton button = (ToggleButton) view;
                StatusButtonTag tag = (StatusButtonTag) button.getTag();
                final Status status = getItem(tag.position);

                confirm("Destroy", status.getText(),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int which) {
                                switch (which) {
                                    case DialogInterface.BUTTON_POSITIVE:
                                        destroyStatus(button, status.getId());
                                    case DialogInterface.BUTTON_NEGATIVE:
                                        button.setChecked(false);
                                }

                            }
                        }
                );
            }
        });

        return convertView;
    }

    private static void setLayoutHeight(View view, int height) {
        ViewGroup.LayoutParams params = view.getLayoutParams();
        params.height = height;
        view.setLayoutParams(params);
    }

    private static String formatDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

    private void setupMediaImage(NetworkImageView imageView, Status status) {
        MediaEntity[] entities = status.getMediaEntities();
        if (entities.length == 0) {
            setLayoutHeight(imageView, 0);
            return;
        } else {
            setLayoutHeight(imageView, ViewGroup.LayoutParams.WRAP_CONTENT);
        }

        MediaEntity entity = entities[0];
        final String url = entity.getMediaURLHttps();
        imageView.setImageUrl(url, imageLoader);
        imageView.setErrorImageResId(android.R.drawable.ic_delete);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            }
        });
    }

    private void createFavorite(final ToggleButton button, final long statusId) {
        new RoboAsyncTask<Status>(getContext()) {
            @Override
            public Status call() throws Exception {
                return TwitterProvider.get(getContext()).createFavorite(statusId);
            }

            @Override
            protected void onSuccess(Status status) throws Exception {
                Toast.makeText(getContext(), R.string.favorited, Toast.LENGTH_SHORT).show();
            }

            @Override
            protected void onException(Exception e) throws RuntimeException {
                reportException("Could not favorite " + statusId, e);
                button.setChecked(false);
            }
        }.execute();
    }

    private void destroyFavorite(final ToggleButton button, final long statusId) {
        new RoboAsyncTask<Status>(getContext()) {
            @Override
            public Status call() throws Exception {
                return TwitterProvider.get(getContext()).destroyFavorite(statusId);
            }

            @Override
            protected void onSuccess(Status status) throws Exception {
                Toast.makeText(getContext(), R.string.unfavorited, Toast.LENGTH_SHORT).show();
            }

            @Override
            protected void onException(Exception e) throws RuntimeException {
                reportException("Could not unfavorite " + statusId, e);
                button.setChecked(true);
            }
        }.execute();
    }

    private void retweetStatus(final ToggleButton button, final long statusId) {
        new RoboAsyncTask<Status>(getContext()) {
            @Override
            public Status call() throws Exception {
                return TwitterProvider.get(getContext()).retweetStatus(statusId);
            }

            @Override
            protected void onSuccess(Status status) throws Exception {
                Toast.makeText(getContext(), R.string.retweeted, Toast.LENGTH_SHORT).show();
            }

            @Override
            protected void onException(Exception e) throws RuntimeException {
                reportException("Could not retweet " + statusId, e);
                button.setChecked(false);
            }
        }.execute();
    }

    private void destroyStatus(final ToggleButton button, final long statusId) {
        new RoboAsyncTask<Status>(getContext()) {
            @Override
            public Status call() throws Exception {
                return TwitterProvider.get(getContext()).destroyStatus(statusId);
            }

            @Override
            protected void onSuccess(Status status) throws Exception {
                Toast.makeText(getContext(), R.string.status_destroyed, Toast.LENGTH_SHORT).show();
                // TODO: Remove status from adapter.
            }

            @Override
            protected void onException(Exception e) throws RuntimeException {
                reportException("Could not destroy status " + statusId, e);
                button.setChecked(false);
            }
        }.execute();
    }

    private void reportException(String message, Exception e) {
        message += ": " + e.getClass().getSimpleName() + ": " + e.getMessage();
        Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show();
        Ln.e(message);
        e.printStackTrace();
    }

    private void confirm(String title, String message, DialogInterface.OnClickListener listener) {
        new AlertDialog.Builder(getContext())
                .setTitle(title)
                .setMessage(message)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setPositiveButton(android.R.string.yes, listener)
                .setNegativeButton(android.R.string.no, listener)
                .show();
    }
}




Java Source Code List

cc.wanko.karin.app.activities.MainActivity.java
cc.wanko.karin.app.activities.OAuthActivity.java
cc.wanko.karin.app.activities.UserListActivity.java
cc.wanko.karin.app.activities.UserStatusesActivity.java
cc.wanko.karin.app.adapters.MainPagerAdapter.java
cc.wanko.karin.app.adapters.StatusListAdapter.java
cc.wanko.karin.app.adapters.UserListListAdapter.java
cc.wanko.karin.app.client.HomeTimelineSource.java
cc.wanko.karin.app.client.StatusSource.java
cc.wanko.karin.app.client.TwitterProvider.java
cc.wanko.karin.app.client.UserListSource.java
cc.wanko.karin.app.client.UserStatusSource.java
cc.wanko.karin.app.database.Database.java
cc.wanko.karin.app.fragments.StatusListFragment.java
cc.wanko.karin.app.fragments.UserListListFragment.java
cc.wanko.karin.app.textbuilder.MediaSegment.java
cc.wanko.karin.app.textbuilder.MentionSegment.java
cc.wanko.karin.app.textbuilder.Segment.java
cc.wanko.karin.app.textbuilder.StatusTextBuilder.java
cc.wanko.karin.app.textbuilder.UrlSegment.java
cc.wanko.karin.app.utils.LruImageCache.java
cc.wanko.karin.app.utils.RoboViewHolder.java