package com.indieweb.indigenous.micropub.source; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.content.ContextCompat; import androidx.appcompat.app.AlertDialog; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.indieweb.indigenous.R; import com.indieweb.indigenous.micropub.MicropubAction; import com.indieweb.indigenous.micropub.post.ReplyActivity; import com.indieweb.indigenous.micropub.post.UpdateActivity; import com.indieweb.indigenous.model.PostListItem; import com.indieweb.indigenous.model.User; import com.indieweb.indigenous.util.Utility; import com.indieweb.indigenous.widget.ExpandableTextView; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import static com.indieweb.indigenous.MainActivity.UPDATE_POST; /** * Source post list items list adapter. */ public class PostListAdapter extends BaseAdapter implements OnClickListener { private final Context context; private final List<PostListItem> items; private LayoutInflater mInflater; private final boolean showUpdateButton; private final boolean showDeleteButton; private final User user; private final RelativeLayout layout; PostListAdapter(Context context, List<PostListItem> items, User user, boolean showUpdateButton, boolean showDeleteButton, RelativeLayout layout) { this.context = context; this.items = items; this.user = user; this.layout = layout; this.showUpdateButton = showUpdateButton; this.showDeleteButton = showDeleteButton; this.mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public int getCount() { return items.size(); } public PostListItem getItem(int position) { return items.get(position); } public long getItemId(int position) { return position; } public void onClick(View view) {} public static class ViewHolder { public TextView name; public TextView url; public TextView published; public TextView postStatus; public Button expand; public ExpandableTextView content; public LinearLayout row; public Button update; public Button delete; public Button external; public Button reply; } public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_source_post, null); holder = new ViewHolder(); holder.published = convertView.findViewById(R.id.source_post_list_published); holder.postStatus = convertView.findViewById(R.id.source_post_list_post_status); holder.name = convertView.findViewById(R.id.source_post_list_name); holder.url = convertView.findViewById(R.id.source_post_list_url); holder.content = convertView.findViewById(R.id.source_post_list_content); holder.expand = convertView.findViewById(R.id.source_post_list_content_more); holder.update = convertView.findViewById(R.id.itemUpdate); holder.delete = convertView.findViewById(R.id.itemDelete); holder.external = convertView.findViewById(R.id.itemExternal); holder.reply = convertView.findViewById(R.id.itemReply); holder.row = convertView.findViewById(R.id.source_post_list_item_row); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } final PostListItem item = items.get(position); if (item != null) { // Color of row. int color = context.getResources().getColor(R.color.listRowBackgroundColor); holder.row.setBackgroundColor(color); // Published. SimpleDateFormat formatIn = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); SimpleDateFormat formatOut = new SimpleDateFormat("dd MM yyyy HH:mm"); Date result; try { result = formatIn.parse(item.getPublished()); holder.published.setVisibility(View.VISIBLE); holder.published.setText(formatOut.format(result)); } catch (ParseException ignored) { holder.published.setVisibility(View.GONE); } // Post status. if (item.getPostStatus().length() > 0) { holder.postStatus.setVisibility(View.VISIBLE); holder.postStatus.setText(String.format(context.getString(R.string.post_status), item.getPostStatus())); } else { holder.postStatus.setVisibility(View.GONE); } // Url. if (item.getUrl().length() > 0) { holder.url.setVisibility(View.VISIBLE); holder.url.setText(item.getUrl()); } else { holder.url.setVisibility(View.GONE); } // Name. if (item.getName().length() > 0) { holder.name.setVisibility(View.VISIBLE); holder.name.setText(item.getName()); } else { holder.name.setVisibility(View.GONE); } // Content. if (item.getContent().length() > 0) { CharSequence sequence; String html = item.getContent(); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { sequence = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY); } else { sequence = Html.fromHtml(html); } // Trim end. sequence = Utility.trim(sequence); holder.content.setVisibility(View.VISIBLE); holder.content.setText(sequence); if (item.getContent().length() > 400) { holder.expand.setVisibility(View.VISIBLE); holder.expand.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { if (holder.content.isExpanded()) { holder.content.collapse(); holder.expand.setText(R.string.read_more); } else { holder.content.expand(); holder.expand.setText(R.string.close); } } }); } else { holder.expand.setVisibility(View.GONE); } } else { holder.content.setMovementMethod(null); holder.content.setVisibility(View.GONE); holder.expand.setVisibility(View.GONE); } // Button listeners. if (item.getUrl().length() > 0) { holder.external.setOnClickListener(new OnExternalClickListener(position)); holder.reply.setOnClickListener(new OnReplyClickListener(position)); if (showUpdateButton) { holder.update.setVisibility(View.VISIBLE); holder.update.setOnClickListener(new OnUpdateClickListener(position)); } if (showDeleteButton) { holder.delete.setVisibility(View.VISIBLE); holder.delete.setOnClickListener(new OnDeleteClickListener(position)); } } else { holder.update.setVisibility(View.GONE); holder.external.setVisibility(View.GONE); holder.reply.setVisibility(View.GONE); } } return convertView; } // Update listener. class OnUpdateClickListener implements OnClickListener { int position; OnUpdateClickListener(int position) { this.position = position; } @Override public void onClick(View v) { Intent i = new Intent(context, UpdateActivity.class); PostListItem item = items.get(this.position); i.putExtra("url", item.getUrl()); i.putExtra("status", item.getPostStatus()); ((Activity) context).startActivityForResult(i, UPDATE_POST); } } // Reply listener. class OnReplyClickListener implements OnClickListener { int position; OnReplyClickListener(int position) { this.position = position; } @Override public void onClick(View v) { final PostListItem item = items.get(this.position); Intent CreateReply = new Intent(context, ReplyActivity.class); CreateReply.putExtra("incomingText", item.getUrl()); context.startActivity(CreateReply); } } // External listener. class OnExternalClickListener implements OnClickListener { int position; OnExternalClickListener(int position) { this.position = position; } @Override public void onClick(View v) { PostListItem item = items.get(this.position); try { CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder(); intentBuilder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary)); intentBuilder.setSecondaryToolbarColor(ContextCompat.getColor(context, R.color.colorPrimaryDark)); CustomTabsIntent customTabsIntent = intentBuilder.build(); customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); customTabsIntent.launchUrl(context, Uri.parse(item.getUrl())); } catch (Exception ignored) { } } } // Delete listener. class OnDeleteClickListener implements OnClickListener { int position; OnDeleteClickListener(int position) { this.position = position; } @Override public void onClick(View v) { final PostListItem item = items.get(this.position); final AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(context.getString(R.string.post_delete_confirm)); builder.setPositiveButton(context.getString(R.string.delete_post),new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int id) { new MicropubAction(context, user, layout).deleteItem(item.getUrl()); items.remove(position); notifyDataSetChanged(); } }); builder.setNegativeButton(context.getString(R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } } }