package org.yuttadhammo.buddydroid.interfaces; import org.yuttadhammo.buddydroid.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import java.util.TreeMap; import com.koushikdutta.urlimageviewhelper.UrlImageViewHelper; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Typeface; import android.preference.PreferenceManager; import android.text.Html; import android.text.Layout.Alignment; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; import android.text.SpannedString; import android.text.TextUtils; import android.text.format.DateUtils; import android.text.method.LinkMovementMethod; import android.text.style.AlignmentSpan; import android.text.style.StyleSpan; import android.util.Log; import android.util.SparseIntArray; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class StreamListAdapter extends ArrayAdapter<Object> { protected String TAG = "StreamListAdapter"; public SparseIntArray expanded = new SparseIntArray(); private StreamListAdapter tclass; private HashMap<String,Boolean> admin; public StreamListAdapter(Activity activity, Object[] rss) { super(activity, 0, rss); tclass = this; } @SuppressLint("NewApi") @Override public View getView(final int position, View convertView, ViewGroup parent) { final Activity activity = (Activity) getContext(); LayoutInflater inflater = activity.getLayoutInflater(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); // Inflate the views from XML View rowView = inflater.inflate(R.layout.stream_item, null); final HashMap<?,?> entryMap = (HashMap<?, ?>) getItem(position); TextView titleView = (TextView) rowView.findViewById(R.id.title); TextView textView = (TextView) rowView.findViewById(R.id.text); TextView dateView = (TextView) rowView.findViewById(R.id.date); try { String text = sanitizeText((String)entryMap.get("content")); text = text.replace("\n", "<br/>"); String title = (String)entryMap.get("action"); String dates = (String)entryMap.get("date_recorded"); int comments = 0; if(entryMap.containsKey("children") && entryMap.get("children") instanceof HashMap) { HashMap<?,?> chm = (HashMap<?,?>)entryMap.get("children"); comments = chm.entrySet().size(); Log.i(TAG,comments+" comments"); final LinearLayout commentPane = (LinearLayout) rowView.findViewById(R.id.comment_pane); commentPane.setVisibility(View.VISIBLE); Map<String,LinearLayout> tva = makeCommentLayout(chm); for (Iterator<?> it = tva.keySet().iterator(); it.hasNext();) { String key = (String) it.next(); LinearLayout comment = tva.get(key); commentPane.addView(comment); } } // load image String imgurl = (String)entryMap.get("user_avatar"); imgurl = imgurl.replaceAll(".*src=\"([^\"]*)\".*","$1"); ImageView iv = (ImageView) rowView.findViewById(R.id.feed_image); UrlImageViewHelper.setUrlDrawable(iv, imgurl); iv.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(activity, BPUserActivity.class); intent.putExtra("user_id", (String)entryMap.get("user_id")); activity.startActivityForResult(intent, Buddypress.RESULT_USER); } }); // add text content if exists if(text.replaceAll("<[^>]*>", "").length() > 0) { Spanned out = Html.fromHtml(text); String contentMax = prefs.getString("content_max", null); if(contentMax != null && contentMax.length() > 0) out = (Spanned) TextUtils.concat(out.subSequence(0,Integer.parseInt(contentMax)),"..."); textView.setText(out); textView.setMovementMethod(LinkMovementMethod.getInstance()); title = title + ":"; } else textView.setVisibility(View.GONE); // add title Spanned titleSpan = Html.fromHtml(title); titleView.setText(titleSpan); titleView.setMovementMethod(LinkMovementMethod.getInstance()); // add date //2013-03-11 20:32:01 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()); simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); Date date = simpleDateFormat.parse(dates); if(prefs.getBoolean("relative_date",true)) { CharSequence dateString = DateUtils.getRelativeTimeSpanString(date.getTime(), new Date().getTime(), DateUtils.SECOND_IN_MILLIS); dateView.setText(dateString); } else { // check if today or not Calendar now = Calendar.getInstance(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); DateFormat df; if(now.get(Calendar.YEAR) == calendar.get(Calendar.YEAR) && now.get(Calendar.MONTH) == calendar.get(Calendar.MONTH) && now.get(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH)) df = android.text.format.DateFormat.getTimeFormat(activity); else df = android.text.format.DateFormat.getMediumDateFormat(activity); dateView.setText(df.format(date)); } } catch (Exception e) { e.printStackTrace(); } return rowView; } private Map<String, LinearLayout> makeCommentLayout(HashMap<?, ?> chm) { Map<String,LinearLayout> tva = new TreeMap<String,LinearLayout>(); final Activity activity = (Activity) getContext(); LayoutInflater inflater = activity.getLayoutInflater(); for (Iterator<?> it = chm.keySet().iterator(); it.hasNext();) { String key = (String) it.next(); final HashMap<?,?> comment = (HashMap<?,?>) chm.get(key); LinearLayout ll = (LinearLayout) inflater.inflate(R.layout.comment_shell, null); TextView tv = (TextView) inflater.inflate(R.layout.comment, null); if(comment.containsKey("content")) { String commentString = sanitizeText((String) comment.get("content")); int cl = commentString.length(); String commentAuthor = "- <a href=\""+comment.get("primary_link")+"\">" + (String) comment.get("display_name")+"</a>"; Spanned commentAuthorSpan = Html.fromHtml(commentAuthor); SpannedString styledComment = new SpannedString(commentString+"\n"); styledComment = (SpannedString) TextUtils.concat(styledComment,commentAuthorSpan); SpannableString outcomment = new SpannableString(styledComment); outcomment.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), cl + 1, cl + 1 + commentAuthorSpan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); outcomment.setSpan(new StyleSpan(Typeface.ITALIC), cl + 1, cl + 1 + commentAuthorSpan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.setText(outcomment ); } else { continue; } ll.addView(tv); // iterate if(comment.containsKey("children") && comment.get("children") instanceof HashMap) { HashMap<?,?> chmc = (HashMap<?,?>)comment.get("children"); Map<String,LinearLayout> tvac = makeCommentLayout(chmc); for (Iterator<?> it2 = tvac.keySet().iterator(); it2.hasNext();) { String keyc = (String) it2.next(); LinearLayout commentc = tvac.get(keyc); ll.addView(commentc); } } tva.put((String) comment.get("id"), ll); } return tva; } private String sanitizeText(String string) { if(string != null) string = string.replace("\\\"", "\"").replace("\\'", "'"); return string; } }