diff options
Diffstat (limited to 'app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java')
-rw-r--r-- | app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java | 163 |
1 files changed, 77 insertions, 86 deletions
diff --git a/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java index 4c7da76a2..ee73cde5c 100644 --- a/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java @@ -51,8 +51,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; -import android.webkit.WebView; -import android.webkit.WebViewClient; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; @@ -78,6 +76,7 @@ import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.TooltipCompat; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.app.ActivityOptionsCompat; import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.LinearLayoutManager; @@ -182,7 +181,6 @@ import app.fedilab.android.sqlite.StatusStoredDAO; import app.fedilab.android.sqlite.TempMuteDAO; import app.fedilab.android.sqlite.TimelineCacheDAO; import app.fedilab.android.sqlite.TimelinesDAO; -import app.fedilab.android.webview.CustomWebview; import es.dmoral.toasty.Toasty; import jp.wasabeef.glide.transformations.BlurTransformation; @@ -191,13 +189,15 @@ import static android.content.Context.MODE_PRIVATE; import static app.fedilab.android.activities.BaseMainActivity.mPageReferenceMap; import static app.fedilab.android.activities.BaseMainActivity.mutedAccount; import static app.fedilab.android.activities.BaseMainActivity.social; +import static app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE_FILTERED; +import static app.fedilab.android.helper.Helper.makeEmojis; /** * Created by Thomas on 24/04/2017. * Adapter for Status */ -public class StatusListAdapter extends RecyclerView.Adapter implements OnPostActionInterface, OnRetrieveFeedsInterface, OnRetrieveImageInterface, OnRetrieveEmojiInterface, OnRetrieveRepliesInterface, OnRetrieveCardInterface, OnPollInterface, OnRefreshCachedStatusInterface, OnRetrieveSearcAccountshInterface, OnRetrieveSearchInterface, OnPostStatusActionInterface, OnRetrieveRelationshipQuickReplyInterface, OnSyncBookmarksInterface { +public class StatusListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements OnPostActionInterface, OnRetrieveFeedsInterface, OnRetrieveImageInterface, OnRetrieveEmojiInterface, OnRetrieveRepliesInterface, OnRetrieveCardInterface, OnPollInterface, OnRefreshCachedStatusInterface, OnRetrieveSearcAccountshInterface, OnRetrieveSearchInterface, OnPostStatusActionInterface, OnRetrieveRelationshipQuickReplyInterface, OnSyncBookmarksInterface { public static final int DISPLAYED_STATUS = 1; public static final int COMPACT_STATUS = 3; @@ -755,8 +755,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct TextView poll_item_percent = item.findViewById(R.id.poll_item_percent); TextView poll_item_text = item.findViewById(R.id.poll_item_text); ProgressBar poll_item_value = item.findViewById(R.id.poll_item_value); - poll_item_percent.setText(String.format("%s %%", String.valueOf((int) value))); - poll_item_text.setText(pollOption.getTitle(), TextView.BufferType.SPANNABLE); + poll_item_percent.setText(String.format("%s %%", (int) value)); + poll_item_text.setText(pollOption.getTitleSpan(), TextView.BufferType.SPANNABLE); + poll_item_text.setText(pollOption.getTitle()); + makeEmojis(context, poll_item_text, pollOption.getTitleSpan(), poll.getEmojis()); poll_item_value.setProgress((int) value); holder.rated.addView(item); if (pollOption.getVotes_count() == greaterValue) { @@ -780,11 +782,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct (holder.multiple_choice).removeAllViews(); for (PollOptions pollOption : poll.getOptionsList()) { CheckBox cb = new CheckBox(context); - if (pollOption.getTitleSpan() != null) { - cb.setText(pollOption.getTitleSpan(), TextView.BufferType.SPANNABLE); - } else { - cb.setText(pollOption.getTitle()); - } + cb.setText(pollOption.getTitle()); + makeEmojis(context, cb, pollOption.getTitleSpan(), poll.getEmojis()); holder.multiple_choice.addView(cb); } @@ -795,11 +794,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct (holder.radio_group).removeAllViews(); for (PollOptions pollOption : poll.getOptionsList()) { RadioButton rb = new RadioButton(context); - if (pollOption.getTitleSpan() != null) { - rb.setText(pollOption.getTitleSpan(), TextView.BufferType.SPANNABLE); - } else { - rb.setText(pollOption.getTitle()); - } + rb.setText(pollOption.getTitle()); + makeEmojis(context, rb, pollOption.getTitleSpan(), poll.getEmojis()); holder.radio_group.addView(rb); } holder.single_choice.setVisibility(View.VISIBLE); @@ -983,15 +979,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_spoiler.setTextSize(TypedValue.COMPLEX_UNIT_SP, (float) (14 * textSizePercent) / 100); - switch (translator) { - case Helper.TRANS_NONE: - holder.yandex_translate.setVisibility(View.GONE); - break; - case Helper.TRANS_YANDEX: - holder.yandex_translate.setVisibility(View.VISIBLE); - break; - default: - holder.yandex_translate.setVisibility(View.GONE); + if (translator == Helper.TRANS_YANDEX) { + holder.yandex_translate.setVisibility(View.VISIBLE); + } else { + holder.yandex_translate.setVisibility(View.GONE); } //Manages theme for icon colors @@ -1229,7 +1220,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct TooltipCompat.setTooltipText(holder.custom_feature_translate, context.getString(R.string.translate)); holder.custom_feature_translate.setOnClickListener(view -> { - translateToot(status); + translateToot(status, holder.status_content_translated); status.setCustomFeaturesDisplayed(false); notifyStatusChanged(status); }); @@ -1324,11 +1315,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct assert img != null; img.setBounds(0, 0, (int) (20 * iconSizePercent / 100 * scale + 0.5f), (int) (15 * iconSizePercent / 100 * scale + 0.5f)); holder.status_account_displayname.setCompoundDrawables(img, null, null, null); - holder.status_toot_date.setCompoundDrawables(imgConversation, null, null, null); } else { holder.status_account_displayname.setCompoundDrawables(null, null, null, null); - holder.status_toot_date.setCompoundDrawables(imgConversation, null, null, null); } + holder.status_toot_date.setCompoundDrawables(imgConversation, null, null, null); if (expand_media && status.isSensitive() || (status.getReblog() != null && status.getReblog().isSensitive())) { Helper.changeDrawableColor(context, holder.hide_preview, R.color.red_1); Helper.changeDrawableColor(context, holder.hide_preview_h, R.color.red_1); @@ -1408,7 +1398,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } }); holder.status_content.setOnClickListener(v -> { - if (type != RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE && type != RetrieveFeedsAsyncTask.Type.NEWS) { + if (type != RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE && type != REMOTE_INSTANCE_FILTERED && type != RetrieveFeedsAsyncTask.Type.NEWS) { Intent intent = new Intent(context, ShowConversationActivity.class); Bundle b = new Bundle(); if (social == UpdateAccountInfoAsyncTask.SOCIAL.GNU || social == UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) @@ -1561,6 +1551,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_content.setText(status.getContentSpan(), TextView.BufferType.SPANNABLE); holder.status_spoiler.setText(status.getContentSpanCW(), TextView.BufferType.SPANNABLE); } + makeEmojis(context, holder.status_content, status.getContentSpan(), status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis()); holder.status_content.setMovementMethod(LongClickLinkMovementMethod.getInstance()); @@ -1613,10 +1604,12 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct context.startActivity(intent); }); - if (status.getReblog().getAccount().getDisplay_name().length() > 0) + if (status.getReblog().getAccount().getDisplay_name().length() > 0) { holder.status_account_displayname_owner.setText(displayNameSpan, TextView.BufferType.SPANNABLE); - else + makeEmojis(context, holder.status_account_displayname_owner, status.getReblog().getAccount().getDisplayNameSpan(), status.getReblog().getAccount().getEmojis()); + } else holder.status_account_displayname_owner.setText(status.getReblog().getAccount().getAcct().replace("@", "")); + holder.status_account_displayname_owner.setVisibility(View.VISIBLE); if (holder.status_boosted_date != null) { holder.status_boosted_date.setText(Helper.dateDiff(context, status.getCreated_at())); @@ -1624,10 +1617,12 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } else { accountForUrl = status.getAccount(); holder.status_account_displayname.setVisibility(View.GONE); - if (displayNameSpan == null || displayNameSpan.toString().trim().length() == 0) + if (displayNameSpan == null || displayNameSpan.toString().trim().length() == 0) { holder.status_account_displayname_owner.setText(status.getAccount().getUsername().replace("@", ""), TextView.BufferType.SPANNABLE); - else + } else { holder.status_account_displayname_owner.setText(displayNameSpan, TextView.BufferType.SPANNABLE); + makeEmojis(context, holder.status_account_displayname_owner, displayNameSpan, status.getAccount().getEmojis()); + } } //-------- END -> Displays name & emoji in toot header @@ -1704,6 +1699,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.fetch_more.setVisibility(View.GONE); } + if (type == RetrieveFeedsAsyncTask.Type.CONTEXT) { + holder.fetch_more.setVisibility(View.GONE); + } if (status.getMentions() != null) holder.status_mention_spoiler.setText(Helper.makeMentionsClick(context, status.getMentions()), TextView.BufferType.SPANNABLE); @@ -2144,33 +2142,17 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (status.getReblog() == null) { if (status.getWebviewURL() != null) { - String url = status.getWebviewURL().replaceAll("&", "&"); - try { - holder.status_cardview_webview.loadUrl(url); - } catch (Exception e) { - e.printStackTrace(); - } - holder.status_cardview_webview.setVisibility(View.VISIBLE); holder.status_cardview_video.setVisibility(View.VISIBLE); holder.webview_preview.setVisibility(View.GONE); } else { - holder.status_cardview_webview.setVisibility(View.GONE); holder.status_cardview_video.setVisibility(View.GONE); holder.webview_preview.setVisibility(View.VISIBLE); } } else { if (status.getReblog().getWebviewURL() != null) { - String url = status.getReblog().getWebviewURL().replaceAll("&", "&"); - try { - holder.status_cardview_webview.loadUrl(url); - } catch (Exception e) { - e.printStackTrace(); - } - holder.status_cardview_webview.setVisibility(View.VISIBLE); holder.status_cardview_video.setVisibility(View.VISIBLE); holder.webview_preview.setVisibility(View.GONE); } else { - holder.status_cardview_webview.setVisibility(View.GONE); holder.status_cardview_video.setVisibility(View.GONE); holder.webview_preview.setVisibility(View.VISIBLE); } @@ -2302,17 +2284,14 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct Helper.openBrowser(context, url); }); } else if (card.getType().toLowerCase().equals("video") && (display_video_preview || (type == RetrieveFeedsAsyncTask.Type.CONTEXT && viewHolder.getAdapterPosition() == conversationPosition))) { + Glide.with(holder.status_cardview_image.getContext()) .load(card.getImage()) .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(10))) .into(holder.webview_preview_card); holder.status_cardview.setVisibility(View.GONE); holder.status_cardview_video.setVisibility(View.VISIBLE); - String user_agent = sharedpreferences.getString(Helper.SET_CUSTOM_USER_AGENT, Helper.USER_AGENT); - if (user_agent != null) { - holder.status_cardview_webview.getSettings().setUserAgentString(user_agent); - } - holder.status_cardview_webview.getSettings().setJavaScriptEnabled(true); + String html = card.getHtml(); String src = card.getUrl(); if (html != null) { @@ -2321,12 +2300,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct src = matcher.group(1); } final String finalSrc = src; - holder.status_cardview_webview.setWebViewClient(new WebViewClient() { - @Override - public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - holder.status_cardview_video.setVisibility(View.GONE); - } - }); + holder.webview_preview.setOnClickListener(v -> { String url = finalSrc; if (url != null) { @@ -2344,12 +2318,27 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } } } - if (status.getReblog() == null) { - status.setWebviewURL(url); + Intent intent = new Intent(context, SlideMediaActivity.class); + Bundle b = new Bundle(); + Attachment attachment = new Attachment(); + attachment.setType("web"); + attachment.setUrl(url); + attachment.setPreview_url(card.getImage()); + ArrayList<Attachment> attachmentArrayList = new ArrayList<>(); + attachmentArrayList.add(attachment); + intent.putParcelableArrayListExtra("mediaArray", attachmentArrayList); + b.putInt("bgcolor", context.getResources().getColor(R.color.cyanea_primary_dark)); + b.putInt("position", 1); + intent.putExtras(b); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + ActivityOptionsCompat options = ActivityOptionsCompat + .makeSceneTransitionAnimation((Activity) context, holder.webview_preview, attachment.getUrl()); + // start the new activity + context.startActivity(intent, options.toBundle()); } else { - status.getReblog().setWebviewURL(url); + // start the new activity + context.startActivity(intent); } - notifyStatusChanged(status); }); } else { holder.status_cardview.setVisibility(View.GONE); @@ -2471,12 +2460,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct break; } } - int tootVisibility; - if (ownerTootVisibility >= initialTootVisibility) { - tootVisibility = initialTootVisibility; - } else { - tootVisibility = ownerTootVisibility; - } + int tootVisibility = Math.min(ownerTootVisibility, initialTootVisibility); switch (tootVisibility) { case 4: @@ -2670,6 +2654,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct CrossActions.doCrossAction(context, type, status, null, API.StatusAction.REBLOG, statusListAdapter, StatusListAdapter.this, false); return true; }); + if (!status.getVisibility().equals("direct")) holder.status_reply.setOnLongClickListener(view -> { CrossActions.doCrossReply(context, status, type, false); @@ -2888,7 +2873,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (translator == Helper.TRANS_NONE) Toasty.info(context, R.string.toast_error_translations_disabled, Toast.LENGTH_SHORT).show(); else - translateToot(status); + translateToot(status, holder.status_content_translated); return true; case R.id.action_report: builderInner = new AlertDialog.Builder(context, style); @@ -3333,7 +3318,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct .asBitmap() .load(!attachment.getType().toLowerCase().equals("audio") ? url : R.drawable.ic_audio_wave) .thumbnail(0.1f) - .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(10))) + //.dontTransform() + .apply(new RequestOptions().transform(new RoundedCorners(10))) .into(new CustomTarget<Bitmap>() { @Override public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) { @@ -3352,6 +3338,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct .asBitmap() .load(!attachment.getType().toLowerCase().equals("audio") ? url : R.drawable.ic_audio_wave) .thumbnail(0.1f) + // .dontTransform() .apply(new RequestOptions().transform(new BlurTransformation(50, 3), new RoundedCorners(10))) .into(new CustomTarget<Bitmap>() { @Override @@ -3372,18 +3359,20 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (!blur) { Glide.with(imageView.getContext()) .load(!attachment.getType().toLowerCase().equals("audio") ? url : R.drawable.ic_audio_wave) + .dontTransform() .thumbnail(0.1f) // .override(640, 480) .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(10))) - // .transition(DrawableTransitionOptions.withCrossFade()) + .transition(DrawableTransitionOptions.withCrossFade()) .into(imageView); } else { Glide.with(imageView.getContext()) .load(!attachment.getType().toLowerCase().equals("audio") ? url : R.drawable.ic_audio_wave) .thumbnail(0.1f) + .dontTransform() // .override(640, 480) - .apply(new RequestOptions().transform(new BlurTransformation(50, 3), new RoundedCorners(10))) - // .transition(DrawableTransitionOptions.withCrossFade()) + .apply(new RequestOptions().transform(new CenterCrop(), new BlurTransformation(50, 3), new RoundedCorners(10))) + .transition(DrawableTransitionOptions.withCrossFade()) .into(imageView); } } @@ -3408,7 +3397,16 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct b.putInt("bgcolor", context.getResources().getColor(R.color.cyanea_primary_dark)); b.putInt("position", finalPosition); intent.putExtras(b); - context.startActivity(intent); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + ActivityOptionsCompat options = ActivityOptionsCompat + .makeSceneTransitionAnimation((Activity) context, imageView, attachment.getUrl()); + // start the new activity + context.startActivity(intent, options.toBundle()); + } else { + // start the new activity + context.startActivity(intent); + } + } } else { status.setAttachmentShown(true); @@ -3882,11 +3880,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct @Override public void onRetrieveImage(Status status, boolean fromTranslation) { if (status != null) { - if (!fromTranslation) { - status.setImageFound(true); - } else { - status.setImageFound(true); - } + status.setImageFound(true); notifyStatusChanged(status); } } @@ -3908,7 +3902,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } - private void translateToot(Status status) { + private void translateToot(Status status, TextView view) { //Manages translations SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); int trans = sharedpreferences.getInt(Helper.SET_TRANSLATOR, Helper.TRANS_YANDEX); @@ -3950,7 +3944,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct status.setTranslationShown(true); status.setContentTranslated(translate.getTranslatedContent()); Status.transformTranslation(context, status); - Status.makeEmojisTranslation(context, StatusListAdapter.this, status); + makeEmojis(context, view, status.getContentSpan(), status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis()); notifyStatusChanged(status); } else { Toasty.error(context, context.getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); @@ -4078,7 +4072,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct ImageView status_cardview_image; TextView status_cardview_title, status_cardview_content, status_cardview_url; FrameLayout status_cardview_video; - CustomWebview status_cardview_webview; ImageView hide_preview, hide_preview_h; TextView status_toot_app; RelativeLayout webview_preview; @@ -4192,8 +4185,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct status_cardview_content = itemView.findViewById(R.id.status_cardview_content); status_cardview_url = itemView.findViewById(R.id.status_cardview_url); status_cardview_video = itemView.findViewById(R.id.status_cardview_video); - status_cardview_webview = Helper.initializeWebview((Activity) context, R.id.status_cardview_webview, itemView); - status_cardview_webview.getSettings().setJavaScriptEnabled(true); hide_preview = itemView.findViewById(R.id.hide_preview); hide_preview_h = itemView.findViewById(R.id.hide_preview_h); status_toot_app = itemView.findViewById(R.id.status_toot_app); |