package fi.iki.murgo.irssinotifier; import java.util.List; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.text.util.Linkify; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; public class MessagePagerAdapter extends PagerAdapter { private List<Channel> channels; private final LayoutInflater layoutInflater; public MessagePagerAdapter(LayoutInflater layoutInflater) { super(); this.layoutInflater = layoutInflater; } @Override public int getCount() { if (channels == null) { return 0; } return channels.size(); } @Override public Object instantiateItem(ViewGroup collection, int position) { View view; if (channels.size() <= 1) { view = createEmptyChannel(); } else { view = createChannel(position, position == 0); } collection.addView(view); return view; } private View createEmptyChannel() { View channelView = layoutInflater.inflate(R.layout.channel, null); LinearLayout messageContainer = (LinearLayout) channelView.findViewById(R.id.message_container); TextView tv = (TextView) layoutInflater.inflate(R.layout.message, null); tv.setText("No IRC hilights yet!"); messageContainer.addView(tv); return channelView; } private View createChannel(int position, boolean feed) { Channel channel = channels.get(position); List<IrcMessage> messages = channel.getMessages(); View channelView = layoutInflater.inflate(R.layout.channel, null); LinearLayout messageContainer = (LinearLayout) channelView.findViewById(R.id.message_container); LinearLayout feedChannel = null; if (feed) feedChannel = (LinearLayout)layoutInflater.inflate(R.layout.feed_channel, null); String lastChannel = ""; String lastDate = ""; for (IrcMessage message : messages) { boolean dateChange = false; String prettyDate = message.getServerTimestampAsPrettyDate(); if (!prettyDate.equals(lastDate)) { lastDate = message.getServerTimestampAsPrettyDate(); dateChange = true; if (feed) { feedChannel = (LinearLayout)layoutInflater.inflate(R.layout.feed_channel, null); messageContainer.addView(feedChannel); } TextView tv = (TextView) layoutInflater.inflate(R.layout.datechange_header, null); tv.setText(lastDate); if (feed) feedChannel.addView(tv); else messageContainer.addView(tv); } if (feed && (dateChange || !message.getLogicalChannel().equals(lastChannel))) { TextView tv; if (!dateChange) tv = (TextView) layoutInflater.inflate(R.layout.channel_header_paddingtop, null); else tv = (TextView) layoutInflater.inflate(R.layout.channel_header, null); lastChannel = message.getLogicalChannel(); tv.setText(lastChannel); feedChannel.addView(tv); } TextView tv = (TextView) layoutInflater.inflate(R.layout.message, null); String s = message.getServerTimestampAsString() + " (" + message.getNick() + ") " + message.getMessage(); final SpannableString ss = new SpannableString(s); Linkify.addLinks(ss, Linkify.ALL); tv.setText(ss); tv.setAutoLinkMask(Linkify.ALL); tv.setLinksClickable(true); tv.setMovementMethod(LinkMovementMethod.getInstance()); if (feed) feedChannel.addView(tv); else messageContainer.addView(tv); } final ScrollView sv = (ScrollView) channelView.findViewById(R.id.scroll_view); sv.post(new Runnable() { public void run() { boolean originalSmoothScroll = sv.isSmoothScrollingEnabled(); sv.setSmoothScrollingEnabled(false); sv.fullScroll(ScrollView.FOCUS_DOWN); sv.setSmoothScrollingEnabled(originalSmoothScroll); } }); return channelView; } @Override public void destroyItem(ViewGroup collection, int position, Object view) { collection.removeView((LinearLayout) view); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Parcelable saveState() { return null; } public void setChannels(List<Channel> ircMessages) { this.channels = ircMessages; } @Override public CharSequence getPageTitle(int position) { if (channels.size() == 1) return ""; if (position == 0) return "Feed"; return channels.get(position).getName(); } }