diff --git a/app/src/main/java/app/fedilab/android/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/BaseMainActivity.java index b11ab2137..26f340980 100644 --- a/app/src/main/java/app/fedilab/android/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/BaseMainActivity.java @@ -66,7 +66,9 @@ import androidx.navigation.ui.NavigationUI; import androidx.preference.PreferenceManager; import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.gif.GifDrawable; +import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.google.android.material.snackbar.Snackbar; @@ -652,6 +654,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt Helper.loadPP(headerMainBinding.accountProfilePicture, account); Glide.with(BaseMainActivity.this) .load(account.mastodon_account.header) + .apply(new RequestOptions().transform(new CenterCrop())) .into(new CustomTarget() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { diff --git a/app/src/main/java/app/fedilab/android/client/entities/app/StatusCache.java b/app/src/main/java/app/fedilab/android/client/entities/app/StatusCache.java index a89b6ce51..1e137cf5f 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/app/StatusCache.java +++ b/app/src/main/java/app/fedilab/android/client/entities/app/StatusCache.java @@ -117,6 +117,22 @@ public class StatusCache { return idReturned; } + /** + * update a status if presents in db + * + * @param statusCache {@link StatusCache} + * @throws DBException exception with database + */ + public void updateIfExists(StatusCache statusCache) throws DBException { + if (db == null) { + throw new DBException("db is null. Wrong initialization."); + } + boolean exists = statusExist(statusCache); + if (exists) { + updateStatus(statusCache); + } + } + /** * Check if a status exists in db * diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index fe658d737..d063855e8 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -282,6 +282,10 @@ public class Helper { "(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,10}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); + + public static final Pattern aLink = Pattern.compile("]*(((?!"); + public static final Pattern imgPattern = Pattern.compile("]*src=\"([^\"]+)\"[^>]*>"); + // --- Static Map of patterns used in spannable status content public static final Map patternHashMap; public static final int NOTIFICATION_MEDIA = 451; @@ -679,6 +683,8 @@ public class Helper { } else { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (!url.toLowerCase().startsWith("http://") && !url.toLowerCase().startsWith("https://") && !url.toLowerCase().startsWith("gemini://")) + url = "http://" + url; intent.setData(Uri.parse(url)); try { context.startActivity(intent); diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index fac8cc6f3..faefd557e 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -103,6 +103,20 @@ public class SpannableHelper { if (text == null) { return null; } + Matcher matcherALink = Helper.aLink.matcher(text); + //We stock details + HashMap urlDetails = new HashMap<>(); + while (matcherALink.find()) { + String urlText = matcherALink.group(3); + String url = matcherALink.group(2); + if (urlText != null) { + urlText = urlText.substring(1); + } + if (url != null && urlText != null && !url.equals(urlText) && !urlText.contains("= Build.VERSION_CODES.N) initialContent = new SpannableString(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY)); else @@ -110,8 +124,10 @@ public class SpannableHelper { SpannableStringBuilder content = new SpannableStringBuilder(initialContent); URLSpan[] urls = content.getSpans(0, (content.length() - 1), URLSpan.class); - for (URLSpan span : urls) + for (URLSpan span : urls) { content.removeSpan(span); + } + //--- EMOJI ---- SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean disableGif = sharedpreferences.getBoolean(context.getString(R.string.SET_DISABLE_GIF), false); @@ -184,14 +200,15 @@ public class SpannableHelper { } //--- URLs ---- - Matcher matcherALink = Patterns.WEB_URL.matcher(content); + Matcher matcherLink = Patterns.WEB_URL.matcher(content); int offSetTruncate = 0; - while (matcherALink.find()) { - int matchStart = matcherALink.start() - offSetTruncate; - int matchEnd = matchStart + matcherALink.group().length(); + while (matcherLink.find()) { + int matchStart = matcherLink.start() - offSetTruncate; + int matchEnd = matchStart + matcherLink.group().length(); if (matchEnd > content.toString().length()) { matchEnd = content.toString().length(); } + if (content.toString().length() < matchEnd || matchStart < 0 || matchStart > matchEnd) { continue; } @@ -202,20 +219,27 @@ public class SpannableHelper { content.replace(matchStart, matchEnd, newURL); offSetTruncate += (newURL.length() - url.length()); matchEnd = matchStart + newURL.length(); + //The transformed URL was in the list of URLs having a different names + if (urlDetails.containsKey(url)) { + urlDetails.put(newURL, urlDetails.get(url)); + } } //Truncate URL if needed //TODO: add an option to disable truncated URLs String urlText = newURL; - if (newURL.length() > 30) { + if (newURL.length() > 30 && !urlDetails.containsKey(urlText)) { urlText = urlText.substring(0, 30); urlText += "…"; content.replace(matchStart, matchEnd, urlText); matchEnd = matchStart + 31; offSetTruncate += (newURL.length() - urlText.length()); - } - - if (!urlText.startsWith("http")) { - continue; + } else if (urlDetails.containsKey(urlText) && urlDetails.get(urlText) != null) { + urlText = urlDetails.get(urlText); + if (urlText != null) { + content.replace(matchStart, matchEnd, urlText); + matchEnd = matchStart + urlText.length(); + offSetTruncate += (newURL.length() - urlText.length()); + } } if (matchEnd <= content.length() && matchEnd >= matchStart) { @@ -409,6 +433,7 @@ public class SpannableHelper { Pattern pattern = entry.getValue(); Matcher matcher = pattern.matcher(content); while (matcher.find()) { + int matchStart = matcher.start(); int matchEnd = matcher.end(); String word = content.toString().substring(matchStart, matchEnd); diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java index a9e51bef8..1e5a734db 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java @@ -96,6 +96,7 @@ import app.fedilab.android.R; import app.fedilab.android.activities.ComposeActivity; import app.fedilab.android.activities.ContextActivity; import app.fedilab.android.activities.CustomSharingActivity; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.activities.MediaActivity; import app.fedilab.android.activities.ProfileActivity; import app.fedilab.android.activities.ReportActivity; @@ -104,6 +105,7 @@ import app.fedilab.android.client.entities.api.Attachment; import app.fedilab.android.client.entities.api.Notification; import app.fedilab.android.client.entities.api.Poll; import app.fedilab.android.client.entities.api.Status; +import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.client.entities.app.StatusDraft; import app.fedilab.android.client.entities.app.Timeline; import app.fedilab.android.databinding.DrawerFetchMoreBinding; @@ -114,6 +116,7 @@ import app.fedilab.android.databinding.DrawerStatusNotificationBinding; import app.fedilab.android.databinding.DrawerStatusReportBinding; import app.fedilab.android.databinding.LayoutMediaBinding; import app.fedilab.android.databinding.LayoutPollItemBinding; +import app.fedilab.android.exception.DBException; import app.fedilab.android.helper.CrossActionHelper; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.LongClickLinkMovementMethod; @@ -192,6 +195,81 @@ public class StatusAdapter extends RecyclerView.Adapter return true; } + + /*** + * Methode that will deal with results of actions (bookmark, favourite, boost) + * @param context Context + * @param adapter RecyclerView.Adapter + * @param statusList List used by the reycler + * @param notificationList List + * @param typeOfAction CrossActionHelper.TypeOfCrossAction + * @param statusToDeal Status that received the action + * @param statusReturned Status returned by the API + * @param remote boolean - it's a remote message + */ + private static void manageAction(Context context, + RecyclerView.Adapter adapter, + List statusList, + List notificationList, + CrossActionHelper.TypeOfCrossAction typeOfAction, + Status statusToDeal, + Status statusReturned, + boolean remote) { + if (statusReturned == null) { + Toasty.error(context, context.getString(R.string.toast_error), Toasty.LENGTH_SHORT).show(); + return; + } + boolean isOK = true; + switch (typeOfAction) { + case BOOKMARK_ACTION: + isOK = statusReturned.bookmarked; + break; + case REBLOG_ACTION: + isOK = statusReturned.reblogged; + break; + case FAVOURITE_ACTION: + isOK = statusReturned.favourited; + break; + case UNBOOKMARK_ACTION: + isOK = !statusReturned.bookmarked; + break; + case UNREBLOG_ACTION: + isOK = !statusReturned.reblogged; + break; + case UNFAVOURITE_ACTION: + isOK = !statusReturned.favourited; + break; + } + + if (!isOK) { + Toasty.error(context, context.getString(R.string.toast_error), Toasty.LENGTH_SHORT).show(); + return; + } + //Update elements + statusToDeal.favourited = statusReturned.favourited; + statusToDeal.reblogged = statusReturned.reblogged; + statusToDeal.bookmarked = statusReturned.bookmarked; + statusToDeal.reblogs_count = statusReturned.reblogs_count; + statusToDeal.favourites_count = statusReturned.favourites_count; + //Update status in cache if not a remote instance + if (!remote) { + new Thread(() -> { + StatusCache statusCache = new StatusCache(); + statusCache.instance = MainActivity.currentInstance; + statusCache.user_id = MainActivity.currentUserID; + statusCache.status = statusToDeal; + statusCache.status_id = statusToDeal.id; + try { + new StatusCache(context).updateIfExists(statusCache); + } catch (DBException e) { + e.printStackTrace(); + } + }).start(); + } + sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); + adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + } + /** * Manage status, this method is also reused in notifications timelines * @@ -396,13 +474,7 @@ public class StatusAdapter extends RecyclerView.Adapter Status fetchedStatus = statusList.get(0); statusesVM.bookmark(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, fetchedStatus.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.bookmarked = _status.bookmarked; - } else { - statusToDeal.bookmarked = true; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.BOOKMARK_ACTION, statusToDeal, _status, remote); }); } else { Toasty.info(context, context.getString(R.string.toast_error_search), Toasty.LENGTH_SHORT).show(); @@ -412,25 +484,14 @@ public class StatusAdapter extends RecyclerView.Adapter if (statusToDeal.bookmarked) { statusesVM.unBookmark(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.bookmarked = _status.bookmarked; - } else { - statusToDeal.bookmarked = false; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.UNBOOKMARK_ACTION, statusToDeal, _status, remote); }); } else { ((SparkButton) v).playAnimation(); statusesVM.bookmark(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.bookmarked = _status.bookmarked; - } else { - statusToDeal.bookmarked = true; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.BOOKMARK_ACTION, statusToDeal, _status, remote); + }); } } @@ -521,15 +582,7 @@ public class StatusAdapter extends RecyclerView.Adapter Status fetchedStatus = results.statuses.get(0); statusesVM.reblog(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, fetchedStatus.id, null) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.reblogged = _status.reblogged; - statusToDeal.reblogs_count = _status.reblogs_count; - } else { - statusToDeal.reblogged = true; - statusToDeal.reblogs_count += 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.REBLOG_ACTION, statusToDeal, _status, remote); }); } else { Toasty.info(context, context.getString(R.string.toast_error_search), Toasty.LENGTH_SHORT).show(); @@ -539,29 +592,13 @@ public class StatusAdapter extends RecyclerView.Adapter if (statusToDeal.reblogged) { statusesVM.unReblog(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.reblogged = _status.reblogged; - statusToDeal.reblogs_count = _status.reblogs_count; - } else { - statusToDeal.reblogged = false; - statusToDeal.reblogs_count -= 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.UNREBLOG_ACTION, statusToDeal, _status, remote); }); } else { ((SparkButton) v).playAnimation(); statusesVM.reblog(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id, null) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.reblogged = _status.reblogged; - statusToDeal.reblogs_count = _status.reblogs_count; - } else { - statusToDeal.reblogged = true; - statusToDeal.reblogs_count += 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.REBLOG_ACTION, statusToDeal, _status, remote); }); } } @@ -579,15 +616,7 @@ public class StatusAdapter extends RecyclerView.Adapter Status fetchedStatus = results.statuses.get(0); statusesVM.reblog(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, fetchedStatus.id, null) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.reblogged = _status.reblogged; - statusToDeal.reblogs_count = _status.reblogs_count; - } else { - statusToDeal.reblogged = true; - statusToDeal.reblogs_count += 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.REBLOG_ACTION, statusToDeal, _status, remote); }); } else { Toasty.info(context, context.getString(R.string.toast_error_search), Toasty.LENGTH_SHORT).show(); @@ -597,29 +626,13 @@ public class StatusAdapter extends RecyclerView.Adapter if (statusToDeal.reblogged) { statusesVM.unReblog(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.reblogged = _status.reblogged; - statusToDeal.reblogs_count = _status.reblogs_count; - } else { - statusToDeal.reblogged = false; - statusToDeal.reblogs_count -= 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.UNREBLOG_ACTION, statusToDeal, _status, remote); }); } else { ((SparkButton) v).playAnimation(); statusesVM.reblog(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id, null) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.reblogged = _status.reblogged; - statusToDeal.reblogs_count = _status.reblogs_count; - } else { - statusToDeal.reblogged = true; - statusToDeal.reblogs_count += 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.REBLOG_ACTION, statusToDeal, _status, remote); }); } } @@ -651,15 +664,7 @@ public class StatusAdapter extends RecyclerView.Adapter Status fetchedStatus = results.statuses.get(0); statusesVM.favourite(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, fetchedStatus.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.favourited = _status.favourited; - statusToDeal.favourites_count = _status.favourites_count; - } else { - statusToDeal.favourited = true; - statusToDeal.favourites_count += 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.FAVOURITE_ACTION, statusToDeal, _status, remote); }); } else { Toasty.info(context, context.getString(R.string.toast_error_search), Toasty.LENGTH_SHORT).show(); @@ -669,28 +674,13 @@ public class StatusAdapter extends RecyclerView.Adapter if (status.favourited) { statusesVM.unFavourite(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.favourited = _status.favourited; - statusToDeal.favourites_count = _status.favourites_count; - } else { - statusToDeal.favourited = false; - statusToDeal.favourites_count -= 1; - } - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.UNFAVOURITE_ACTION, statusToDeal, _status, remote); }); } else { ((SparkButton) v).playAnimation(); statusesVM.favourite(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.favourited = _status.favourited; - statusToDeal.favourites_count = _status.favourites_count; - } else { - statusToDeal.favourited = true; - statusToDeal.favourites_count += 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.FAVOURITE_ACTION, statusToDeal, _status, remote); }); } } @@ -708,15 +698,7 @@ public class StatusAdapter extends RecyclerView.Adapter Status fetchedStatus = results.statuses.get(0); statusesVM.favourite(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, fetchedStatus.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.favourited = _status.favourited; - statusToDeal.favourites_count = _status.favourites_count; - } else { - statusToDeal.favourited = true; - statusToDeal.favourites_count += 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.FAVOURITE_ACTION, statusToDeal, _status, remote); }); } else { Toasty.info(context, context.getString(R.string.toast_error_search), Toasty.LENGTH_SHORT).show(); @@ -726,28 +708,13 @@ public class StatusAdapter extends RecyclerView.Adapter if (statusToDeal.favourited) { statusesVM.unFavourite(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.favourited = _status.favourited; - statusToDeal.favourites_count = _status.favourites_count; - } else { - statusToDeal.favourited = false; - statusToDeal.favourites_count -= 1; - } - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.UNFAVOURITE_ACTION, statusToDeal, _status, remote); }); } else { ((SparkButton) v).playAnimation(); statusesVM.favourite(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id) .observe((LifecycleOwner) context, _status -> { - if (_status != null) { - statusToDeal.favourited = _status.favourited; - statusToDeal.favourites_count = _status.favourites_count; - } else { - statusToDeal.favourited = true; - statusToDeal.favourites_count += 1; - } - sendAction(context, Helper.ARG_STATUS_ACTION, statusToDeal, null); - adapter.notifyItemChanged(getPositionAsync(notificationList, statusList, statusToDeal)); + manageAction(context, adapter, statusList, notificationList, CrossActionHelper.TypeOfCrossAction.FAVOURITE_ACTION, statusToDeal, _status, remote); }); } } @@ -962,6 +929,11 @@ public class StatusAdapter extends RecyclerView.Adapter // start the new activity context.startActivity(mediaIntent, options.toBundle()); }); + if (statusToDeal.media_attachments.get(0).type != null && statusToDeal.media_attachments.get(0).type.equalsIgnoreCase("video")) { + layoutMediaBinding.playVideo.setVisibility(View.VISIBLE); + } else { + layoutMediaBinding.playVideo.setVisibility(View.GONE); + } if (!mediaObfuscated(statusToDeal) || expand_media) { layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24); Glide.with(layoutMediaBinding.media.getContext()) @@ -995,6 +967,11 @@ public class StatusAdapter extends RecyclerView.Adapter lp = new RelativeLayout.LayoutParams((int) Helper.convertDpToPixel(200, context), (int) Helper.convertDpToPixel(200, context)); layoutMediaBinding.media.setScaleType(ImageView.ScaleType.CENTER_CROP); } + if (attachment.type != null && attachment.type.equalsIgnoreCase("video")) { + layoutMediaBinding.playVideo.setVisibility(View.VISIBLE); + } else { + layoutMediaBinding.playVideo.setVisibility(View.GONE); + } lp.setMargins(0, 0, (int) Helper.convertDpToPixel(5, context), 0); if (!mediaObfuscated(statusToDeal) || expand_media) { layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24); diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java index 105004f1c..547e64c68 100644 --- a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java +++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java @@ -378,7 +378,7 @@ public class AccountsVM extends AndroidViewModel { try { Response> followersResponse = followersCall.execute(); if (followersResponse.isSuccessful()) { - accountList = followersResponse.body(); + accountList = SpannableHelper.convertAccounts(getApplication().getApplicationContext(), followersResponse.body()); pagination = MastodonHelper.getPagination(followersResponse.headers()); } } catch (Exception e) { @@ -414,7 +414,7 @@ public class AccountsVM extends AndroidViewModel { try { Response> followingResponse = followingCall.execute(); if (followingResponse.isSuccessful()) { - accountList = followingResponse.body(); + accountList = SpannableHelper.convertAccounts(getApplication().getApplicationContext(), followingResponse.body()); pagination = MastodonHelper.getPagination(followingResponse.headers()); } } catch (Exception e) { diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/SearchVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/SearchVM.java index 53772b81e..4a86f333d 100644 --- a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/SearchVM.java +++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/SearchVM.java @@ -117,6 +117,8 @@ public class SearchVM extends AndroidViewModel { } if (results.accounts == null) { results.accounts = new ArrayList<>(); + } else { + results.accounts = SpannableHelper.convertAccounts(getApplication().getApplicationContext(), results.accounts); } if (results.hashtags == null) { results.hashtags = new ArrayList<>(); diff --git a/app/src/main/res/drawable/ic_baseline_play_circle_filled_24.xml b/app/src/main/res/drawable/ic_baseline_play_circle_filled_24.xml new file mode 100644 index 000000000..4fb181316 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_play_circle_filled_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/layout_media.xml b/app/src/main/res/layout/layout_media.xml index 83936687c..6906d1025 100644 --- a/app/src/main/res/layout/layout_media.xml +++ b/app/src/main/res/layout/layout_media.xml @@ -12,6 +12,14 @@ android:scaleType="centerCrop" tools:ignore="ContentDescription" /> + +