package com.github.andlyticsproject; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.net.Uri; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RatingBar; import android.widget.TextView; import com.github.andlyticsproject.model.Comment; import com.github.andlyticsproject.model.CommentGroup; import com.github.andlyticsproject.util.Utils; public class CommentsListAdapter extends BaseExpandableListAdapter { private static final int TYPE_COMMENT = 0; private static final int TYPE_REPLY = 1; private LayoutInflater layoutInflater; private List<CommentGroup> commentGroups; private Activity context; private DateFormat commentDateFormat = DateFormat.getDateInstance(DateFormat.FULL); private boolean canReplyToComments; public CommentsListAdapter(Activity activity) { // XXX no pretty, is there a better way? if (!(activity instanceof CommentReplier)) { throw new ClassCastException("Activity must implement CommentReplier."); } this.setCommentGroups(new ArrayList<CommentGroup>()); this.layoutInflater = activity.getLayoutInflater(); this.context = activity; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final Comment comment = getChild(groupPosition, childPosition); ViewHolderChild holder; if (convertView == null) { convertView = layoutInflater.inflate( comment.isReply() ? R.layout.comments_list_item_reply : R.layout.comments_list_item_comment, null); holder = new ViewHolderChild(); holder.text = (TextView) convertView.findViewById(R.id.comments_list_item_text); holder.title = (TextView) convertView.findViewById(R.id.comments_list_item_title); holder.user = (TextView) convertView.findViewById(R.id.comments_list_item_username); holder.date = (TextView) convertView.findViewById(R.id.comments_list_item_date); holder.device = (TextView) convertView.findViewById(R.id.comments_list_item_device); holder.version = (TextView) convertView.findViewById(R.id.comments_list_item_version); holder.rating = (RatingBar) convertView .findViewById(R.id.comments_list_item_app_ratingbar); holder.deviceVersionContainer = (LinearLayout) convertView .findViewById(R.id.comments_list_item_device_container); holder.language = (TextView) convertView.findViewById(R.id.comments_list_item_language); convertView.setTag(holder); } else { holder = (ViewHolderChild) convertView.getTag(); } if (holder.language != null) { final TextView commentText = holder.text; final TextView commentTitle = holder.title; holder.language.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { boolean showTranslations = Preferences.isShowCommentAutoTranslations(context); if (!showTranslations || !comment.isTranslated()) { return; } if (comment.getText().equals(commentText.getText().toString())) { commentText.setText(comment.getOriginalText()); commentText.setTextAppearance(context, R.style.normalText); commentTitle.setText(comment.getOriginalTitle()); commentTitle.setTextAppearance(context, R.style.boldText); } else { commentText.setText(comment.getText()); commentText.setTextAppearance(context, R.style.italicText); commentTitle.setText(comment.getTitle()); commentTitle.setTextAppearance(context, R.style.boldItalicText); } } }); } holder.replyIcon = (ImageView) convertView.findViewById(R.id.comments_list_icon_reply); if (holder.replyIcon != null) { holder.replyIcon.setVisibility(canReplyToComments ? View.VISIBLE : View.INVISIBLE); holder.replyIcon.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CommentReplier replier = (CommentReplier) context; replier.showReplyDialog(comment); } }); } if (comment.isReply()) { holder.date.setText(formatCommentDate(comment.getDate())); holder.text.setText(comment.getText()); } else { boolean showTranslations = Preferences.isShowCommentAutoTranslations(context); String commentText = comment.getText(); String commentTitle = comment.getTitle(); if (!showTranslations && comment.getOriginalText() != null) { commentText = comment.getOriginalText(); } if (!showTranslations && comment.getOriginalTitle() != null) { commentTitle = comment.getOriginalTitle(); } holder.text.setText(commentText); holder.title.setText(commentTitle); // italic for translated text boolean translated = showTranslations && comment.isTranslated(); holder.text.setTextAppearance(context, translated ? R.style.italicText : R.style.normalText); holder.title.setTextAppearance(context, translated ? R.style.boldItalicText : R.style.boldText); holder.user.setText(comment.getUser() == null ? context .getString(R.string.comment_no_user_info) : comment.getUser()); String version = comment.getAppVersion(); String device = comment.getDevice(); String language = comment.getLanguage(); holder.version.setVisibility(View.GONE); holder.device.setVisibility(View.GONE); holder.language.setVisibility(View.GONE); boolean showInfoBox = false; // building version/device if (isNotEmptyOrNull(version)) { holder.version.setText(version); holder.version.setVisibility(View.VISIBLE); showInfoBox = true; } if (isNotEmptyOrNull(device)) { holder.device.setText(device); holder.device.setVisibility(View.VISIBLE); showInfoBox = true; } // TODO better UI for language, option to show original text? if (isNotEmptyOrNull(language)) { holder.language.setText(formatLanguageString(comment.getLanguage())); holder.language.setVisibility(View.VISIBLE); showInfoBox = true; } if (showInfoBox) { holder.deviceVersionContainer.setVisibility(View.VISIBLE); } else { holder.deviceVersionContainer.setVisibility(View.GONE); } int rating = comment.getRating(); if (rating > 0 && rating <= 5) { holder.rating.setRating((float) rating); } } convertView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { String text = comment.getText(); String displayLanguage = Locale.getDefault().getLanguage(); if (Preferences.isUseGoogleTranslateApp(context) && isGoogleTranslateInstalled()) { sendToGoogleTranslate(text, displayLanguage); return true; } String url = "http://translate.google.de/m/translate?hl=<<lang>>&vi=m&text=<<text>>&langpair=auto|<<lang>>"; try { url = url.replaceAll("<<lang>>", URLEncoder.encode(displayLanguage, "UTF-8")); url = url.replaceAll("<<text>>", URLEncoder.encode(text, "UTF-8")); Log.d("CommentsTranslate", "lang: " + displayLanguage + " url: " + url); Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); context.startActivity(i); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return true; } }); return convertView; } private boolean isGoogleTranslateInstalled() { return Utils.isPackageInstalled(context, "com.google.android.apps.translate"); } private String formatLanguageString(String language) { if (language == null || language.indexOf("_") == -1) { return language; } String[] parts = language.split("_"); if (parts.length > 1 && parts[0].toUpperCase(Locale.ENGLISH) .equals(parts[1].toUpperCase(Locale.ENGLISH))) { return parts[1].toUpperCase(Locale.ENGLISH); } return language.replaceAll("_", "/"); } private void sendToGoogleTranslate(String text, String displayLanguage) { Intent i = new Intent(); i.setAction(Intent.ACTION_VIEW); i.putExtra("key_text_input", text); i.putExtra("key_text_output", ""); i.putExtra("key_language_from", "auto"); i.putExtra("key_language_to", displayLanguage); i.putExtra("key_suggest_translation", ""); i.putExtra("key_from_floating_window", false); i.setComponent(new ComponentName("com.google.android.apps.translate", "com.google.android.apps.translate.translation.TranslateActivity")); context.startActivity(i); } @Override public int getChildType(int groupPosition, int childPosition) { return getChild(groupPosition, childPosition).isReply() ? TYPE_REPLY : TYPE_COMMENT; } @Override public int getChildTypeCount() { return 2; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolderGroup holder; if (convertView == null) { convertView = layoutInflater.inflate(R.layout.comments_list_item_group_header, null); holder = new ViewHolderGroup(); holder.date = (TextView) convertView.findViewById(R.id.comments_list_item_date); convertView.setTag(holder); } else { holder = (ViewHolderGroup) convertView.getTag(); } CommentGroup commentGroup = getGroup(groupPosition); holder.date.setText(formatCommentDate(commentGroup.getDate())); return convertView; } private boolean isNotEmptyOrNull(String str) { return str != null && str.length() > 0; } static class ViewHolderGroup { TextView date; } static class ViewHolderChild { RatingBar rating; TextView text; TextView title; TextView user; TextView date; LinearLayout deviceVersionContainer; TextView device; TextView version; TextView language; ImageView replyIcon; } @Override public int getGroupCount() { return getCommentGroups().size(); } @Override public int getChildrenCount(int groupPosition) { return getCommentGroups().get(groupPosition).getComments().size(); } @Override public CommentGroup getGroup(int groupPosition) { return getCommentGroups().get(groupPosition); } @Override public Comment getChild(int groupPosition, int childPosition) { return getCommentGroups().get(groupPosition).getComments().get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } public void setCommentGroups(List<CommentGroup> commentGroups) { this.commentGroups = commentGroups; } public List<CommentGroup> getCommentGroups() { return commentGroups; } private String formatCommentDate(Date date) { return commentDateFormat.format(date); } public boolean isCanReplyToComments() { return canReplyToComments; } public void setCanReplyToComments(boolean canReplyToComments) { this.canReplyToComments = canReplyToComments; } }