From b88bba74079459349b14ebef7310e0c0167f3c8f Mon Sep 17 00:00:00 2001 From: nuclearfog Date: Fri, 16 Dec 2022 21:51:58 +0100 Subject: [PATCH] bug fix, added comments --- .../twidda/adapter/CardAdapter.java | 10 ++++++-- .../twidda/adapter/holder/CardHolder.java | 24 ++++++++++++++----- .../backend/api/twitter/impl/TwitterCard.java | 14 ++++++----- .../api/twitter/impl/TwitterNotification.java | 1 + .../backend/api/twitter/impl/UserV1.java | 15 +++++++++++- .../backend/api/twitter/impl/UserV2.java | 19 +++++++++++---- 6 files changed, 64 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/nuclearfog/twidda/adapter/CardAdapter.java b/app/src/main/java/org/nuclearfog/twidda/adapter/CardAdapter.java index 9614c4d7..677b9b51 100644 --- a/app/src/main/java/org/nuclearfog/twidda/adapter/CardAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/adapter/CardAdapter.java @@ -27,7 +27,7 @@ public class CardAdapter extends RecyclerView.Adapter implements OnI private Picasso picasso; private OnCardClickListener listener; - private Card[] cards; + private Card[] cards = {}; public CardAdapter(Context context, OnCardClickListener listener) { @@ -71,7 +71,7 @@ public class CardAdapter extends RecyclerView.Adapter implements OnI * replace all items * @param newCards new items to insert */ - public void replaceAll(Card[] newCards) { + public void replaceAll(@NonNull Card[] newCards) { cards = Arrays.copyOf(newCards, newCards.length); notifyDataSetChanged(); } @@ -81,8 +81,14 @@ public class CardAdapter extends RecyclerView.Adapter implements OnI */ public interface OnCardClickListener { + /** + * indicates a link click + */ int TYPE_LINK = 1; + /** + * indicates an image thumbnail click + */ int TYPE_IMAGE = 2; /** diff --git a/app/src/main/java/org/nuclearfog/twidda/adapter/holder/CardHolder.java b/app/src/main/java/org/nuclearfog/twidda/adapter/holder/CardHolder.java index 020d5b03..71c93883 100644 --- a/app/src/main/java/org/nuclearfog/twidda/adapter/holder/CardHolder.java +++ b/app/src/main/java/org/nuclearfog/twidda/adapter/holder/CardHolder.java @@ -31,9 +31,15 @@ public class CardHolder extends ViewHolder implements OnClickListener { */ private static final int TEXT_TRANSPARENCY = 0xafffffff; + /** + * how much views should be fit in the window + */ private static final int COLUMN_COUNT = 2; - private static final int MAX_TITLE_LEN = 20; + /** + * maximum char count of the title before truncating + */ + private static final int TITLE_MAX_LEN = 30; private TextView linkText; private ImageView preview; @@ -80,17 +86,17 @@ public class CardHolder extends ViewHolder implements OnClickListener { public void setContent(Card card) { String textStr; String title = card.getTitle(); - if (title.length() > MAX_TITLE_LEN) - textStr = title.substring(0, MAX_TITLE_LEN - 3) + "..."; - else + if (title.length() > TITLE_MAX_LEN) { + textStr = title.substring(0, TITLE_MAX_LEN - 3) + "..."; + } else { textStr = title; + } if (!card.getDescription().isEmpty()) textStr += '\n' + card.getDescription(); SpannableString textSpan = new SpannableString(textStr); if (!title.isEmpty()) - textSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, title.length() - 1, 0); + textSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, Math.min(textStr.length() - 1, TITLE_MAX_LEN), 0); linkText.setText(textSpan); - //description.setText(card.getDescription()); if (!card.getImageUrl().isEmpty()) { picasso.load(card.getImageUrl()).into(preview); } @@ -108,8 +114,14 @@ public class CardHolder extends ViewHolder implements OnClickListener { */ public interface OnItemClickListener { + /** + * indicates a link click + */ int TYPE_LINK = 1; + /** + * indicates a click on the image + */ int TYPE_IMAGE = 2; /** diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/TwitterCard.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/TwitterCard.java index b9c10dd1..299a60df 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/TwitterCard.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/TwitterCard.java @@ -1,5 +1,7 @@ package org.nuclearfog.twidda.backend.api.twitter.impl; +import android.util.Patterns; + import org.json.JSONArray; import org.json.JSONObject; import org.nuclearfog.twidda.model.Card; @@ -16,7 +18,7 @@ public class TwitterCard implements Card { private String url; private String title; private String description; - private String imageUrl; + private String imageUrl = ""; public TwitterCard(JSONObject json) { @@ -25,14 +27,14 @@ public class TwitterCard implements Card { title = json.optString("title", ""); description = json.optString("description", ""); if (images != null && images.length() > 0) { + // first index contains image with the highest resolutuion JSONObject image = images.optJSONObject(0); if (image != null) { - imageUrl = image.optString("url"); - } else { - imageUrl = ""; + String imageUrl = image.optString("url", ""); + if (Patterns.WEB_URL.matcher(imageUrl).matches()) { + this.imageUrl = imageUrl; + } } - } else { - imageUrl = ""; } } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/TwitterNotification.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/TwitterNotification.java index 9f9e5e9a..c2822e7d 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/TwitterNotification.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/TwitterNotification.java @@ -33,6 +33,7 @@ public class TwitterNotification implements Notification { @Override public int getType() { + // Twitte rcurrently only supports mentions as notification return TYPE_MENTION; } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/UserV1.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/UserV1.java index f51bac8d..7aafa8e6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/UserV1.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/UserV1.java @@ -1,5 +1,7 @@ package org.nuclearfog.twidda.backend.api.twitter.impl; +import android.util.Patterns; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -54,11 +56,11 @@ public class UserV1 implements User { public UserV1(JSONObject json) throws JSONException { String idStr = json.getString("id_str"); String profileImageUrl = json.optString("profile_image_url_https", ""); + String profileBannerUrl = json.optString("profile_banner_url", ""); username = json.optString("name", ""); screenName = '@' + json.optString("screen_name", ""); isVerified = json.optBoolean("verified"); isLocked = json.optBoolean("protected"); - profileBannerUrl = json.optString("profile_banner_url", ""); location = json.optString("location", ""); following = json.optInt("friends_count"); follower = json.optInt("followers_count"); @@ -70,6 +72,17 @@ public class UserV1 implements User { description = getDescription(json); url = getUrl(json); + // + if (Patterns.WEB_URL.matcher(profileImageUrl).matches()) { + this.profileImageUrl = profileImageUrl; + } else { + this.profileImageUrl = ""; + } + if (Patterns.WEB_URL.matcher(profileBannerUrl).matches()) { + this.profileBannerUrl = profileBannerUrl; + } else { + this.profileBannerUrl = ""; + } if (defaultImage) { this.profileImageUrl = profileImageUrl; } else { diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/UserV2.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/UserV2.java index 0d88c87e..dcfab64d 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/UserV2.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/impl/UserV2.java @@ -1,5 +1,7 @@ package org.nuclearfog.twidda.backend.api.twitter.impl; +import android.util.Patterns; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -50,12 +52,12 @@ public class UserV2 implements User { String idStr = json.getString("id"); String profileImageUrl = json.optString("profile_image_url", ""); + String profileBannerUrl = json.optString("profile_banner_url", ""); username = json.optString("name", ""); screenName = '@' + json.optString("username", ""); isProtected = json.optBoolean("protected"); location = json.optString("location", ""); isVerified = json.optBoolean("verified"); - profileBannerUrl = json.optString("profile_banner_url", ""); created = StringTools.getTime(json.optString("created_at", ""), StringTools.TIME_TWITTER_V2); defaultImage = profileImageUrl.contains("default_profile_images"); @@ -67,10 +69,19 @@ public class UserV2 implements User { follower = metrics.optInt("followers_count"); tweetCount = metrics.optInt("tweet_count"); } - if (defaultImage) { - this.profileImageUrl = profileImageUrl; + if (Patterns.WEB_URL.matcher(profileImageUrl).matches()) { + if (defaultImage) { + this.profileImageUrl = profileImageUrl; + } else { + this.profileImageUrl = StringTools.createProfileImageLink(profileImageUrl); + } } else { - this.profileImageUrl = StringTools.createProfileImageLink(profileImageUrl); + this.profileImageUrl = ""; + } + if (Patterns.WEB_URL.matcher(profileBannerUrl).matches()) { + this.profileBannerUrl = profileBannerUrl; + } else { + this.profileBannerUrl = ""; } try { id = Long.parseLong(idStr);