diff options
Diffstat (limited to 'app/src/main/java/app/fedilab/android/ui')
7 files changed, 194 insertions, 23 deletions
diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java index db2aba5e7..d922cda27 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java @@ -15,6 +15,7 @@ package app.fedilab.android.ui.drawer; * see <http://www.gnu.org/licenses>. */ +import static android.content.Context.INPUT_METHOD_SERVICE; import static app.fedilab.android.BaseMainActivity.currentAccount; import static app.fedilab.android.BaseMainActivity.emojis; import static app.fedilab.android.BaseMainActivity.instanceInfo; @@ -45,6 +46,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.GridView; @@ -71,6 +73,9 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; +import com.vanniktech.emoji.EmojiManager; +import com.vanniktech.emoji.EmojiPopup; +import com.vanniktech.emoji.one.EmojiOneProvider; import java.io.File; import java.lang.ref.WeakReference; @@ -712,12 +717,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder public void afterTextChanged(Editable s) { int currentLength = MastodonHelper.countLength(holder); //Copy/past - int max_car; - if (instanceInfo != null) { - max_car = instanceInfo.max_toot_chars != null ? Integer.parseInt(instanceInfo.max_toot_chars) : instanceInfo.configuration.statusesConf.max_characters; - } else { - max_car = 500; - } + int max_car = MastodonHelper.getInstanceMaxChars(context); if (currentLength > max_car + 1) { int from = max_car - holder.binding.contentSpoiler.getText().length(); int to = (currentLength - holder.binding.contentSpoiler.getText().length()); @@ -1078,6 +1078,22 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder ComposeViewHolder holder = (ComposeViewHolder) viewHolder; + boolean displayEmoji = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_EMOJI), false); + if (displayEmoji) { + holder.binding.buttonEmojiOne.setVisibility(View.VISIBLE); + holder.binding.buttonEmojiOne.setOnClickListener(v -> { + InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(holder.binding.buttonEmojiOne.getWindowToken(), 0); + EmojiManager.install(new EmojiOneProvider()); + final EmojiPopup emojiPopup = EmojiPopup.Builder.fromRootView(holder.binding.buttonEmojiOne).setOnEmojiPopupDismissListener(() -> { + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); + }).build(holder.binding.content); + emojiPopup.toggle(); + }); + } else { + holder.binding.buttonEmojiOne.setVisibility(View.GONE); + } + int newInputType = holder.binding.content.getInputType() & (holder.binding.content.getInputType() ^ InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); holder.binding.content.setInputType(newInputType); @@ -1246,7 +1262,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder if (instanceInfo == null) { return; } - int max_car = instanceInfo.max_toot_chars != null ? Integer.parseInt(instanceInfo.max_toot_chars) : instanceInfo.configuration.statusesConf.max_characters; + int max_car = MastodonHelper.getInstanceMaxChars(context); holder.binding.characterProgress.setMax(max_car); holder.binding.contentSpoiler.addTextChangedListener(new TextWatcher() { private int cPosition; diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/NotificationAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/NotificationAdapter.java index dc354fd58..3a77b2b51 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/NotificationAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/NotificationAdapter.java @@ -224,10 +224,9 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH title = String.format(Locale.getDefault(), "%s reacted with %s", notification.account.username, notification.emoji); MastodonHelper.loadPPMastodon(holderStatus.bindingNotification.status.avatar, notification.account); } - notification.account.display_name = title; holderStatus.bindingNotification.status.displayName.setText( - notification.account.getSpanDisplayName(context, - new WeakReference<>(holderStatus.bindingNotification.status.displayName)), + notification.account.getSpanDisplayNameTitle(context, + new WeakReference<>(holderStatus.bindingNotification.status.displayName), title), TextView.BufferType.SPANNABLE); holderStatus.bindingNotification.status.username.setText(String.format("@%s", notification.account.acct)); holderStatus.bindingNotification.containerTransparent.setAlpha(.1f); @@ -295,10 +294,10 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH // start the new activity context.startActivity(intent, options.toBundle()); }); - notification.account.display_name = title; + holderStatus.bindingNotification.status.displayName.setText( - notification.account.getSpanDisplayName(context, - new WeakReference<>(holderStatus.bindingNotification.status.displayName)), + notification.account.getSpanDisplayNameTitle(context, + new WeakReference<>(holderStatus.bindingNotification.status.displayName), title), TextView.BufferType.SPANNABLE); holderStatus.bindingNotification.status.displayName.setText(title, TextView.BufferType.SPANNABLE); holderStatus.bindingNotification.status.username.setText(String.format("@%s", notification.account.acct)); diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/ReleaseNoteAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/ReleaseNoteAdapter.java new file mode 100644 index 000000000..7d32d3cb5 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/ui/drawer/ReleaseNoteAdapter.java @@ -0,0 +1,119 @@ +package app.fedilab.android.ui.drawer; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Fedilab; if not, + * see <http://www.gnu.org/licenses>. */ + + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.github.stom79.mytransl.MyTransL; +import com.github.stom79.mytransl.client.HttpsConnectionException; +import com.github.stom79.mytransl.client.Results; +import com.github.stom79.mytransl.translate.Params; +import com.github.stom79.mytransl.translate.Translate; + +import java.util.List; +import java.util.Locale; + +import app.fedilab.android.R; +import app.fedilab.android.client.entities.app.ReleaseNote; +import app.fedilab.android.databinding.DrawerReleaseNoteBinding; +import es.dmoral.toasty.Toasty; + + +public class ReleaseNoteAdapter extends RecyclerView.Adapter<ReleaseNoteAdapter.ReleaseNoteViewHolder> { + + private final List<ReleaseNote.Note> notes; + private Context context; + + public ReleaseNoteAdapter(List<ReleaseNote.Note> notes) { + this.notes = notes; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return notes.size(); + } + + @NonNull + @Override + public ReleaseNoteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + context = parent.getContext(); + DrawerReleaseNoteBinding itemBinding = DrawerReleaseNoteBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new ReleaseNoteViewHolder(itemBinding); + } + + @Override + public void onBindViewHolder(@NonNull ReleaseNoteViewHolder holder, int position) { + ReleaseNote.Note note = notes.get(position); + holder.binding.note.setText(note.note); + holder.binding.version.setText(String.format(Locale.getDefault(), "%s (%s)", note.version, note.code)); + if (note.noteTranslated != null) { + holder.binding.noteTranslated.setText(note.noteTranslated); + holder.binding.containerTrans.setVisibility(View.VISIBLE); + holder.binding.translate.setVisibility(View.GONE); + } else { + holder.binding.containerTrans.setVisibility(View.GONE); + holder.binding.translate.setVisibility(View.VISIBLE); + } + holder.binding.translate.setOnClickListener(v -> { + MyTransL.translatorEngine et = MyTransL.translatorEngine.LIBRETRANSLATE; + final MyTransL myTransL = MyTransL.getInstance(et); + myTransL.setObfuscation(true); + Params params = new Params(); + params.setSplit_sentences(false); + params.setFormat(Params.fType.TEXT); + params.setSource_lang("auto"); + myTransL.setLibretranslateDomain("translate.fedilab.app"); + myTransL.translate(note.note, MyTransL.getLocale(), params, new Results() { + @Override + public void onSuccess(Translate translate) { + if (translate.getTranslatedContent() != null) { + note.noteTranslated = translate.getTranslatedContent(); + notifyItemChanged(holder.getBindingAdapterPosition()); + } else { + Toasty.error(context, context.getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); + } + } + + @Override + public void onFail(HttpsConnectionException httpsConnectionException) { + Toasty.error(context, context.getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); + } + }); + }); + } + + + public static class ReleaseNoteViewHolder extends RecyclerView.ViewHolder { + DrawerReleaseNoteBinding binding; + + ReleaseNoteViewHolder(DrawerReleaseNoteBinding itemView) { + super(itemView.getRoot()); + binding = itemView; + } + } +}
\ No newline at end of file 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 628f39d8e..0b5d18d7b 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 @@ -75,7 +75,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestBuilder; -import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestOptions; import com.github.stom79.mytransl.MyTransL; @@ -129,6 +128,7 @@ import app.fedilab.android.helper.GlideFocus; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.LongClickLinkMovementMethod; import app.fedilab.android.helper.MastodonHelper; +import app.fedilab.android.helper.MediaHelper; import app.fedilab.android.helper.SpannableHelper; import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonContext; @@ -324,6 +324,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> boolean confirmBoost = sharedpreferences.getBoolean(context.getString(R.string.SET_NOTIF_VALIDATION), true); boolean fullAttachement = sharedpreferences.getBoolean(context.getString(R.string.SET_FULL_PREVIEW), false); boolean displayBookmark = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_BOOKMARK), false); + boolean long_press_media = sharedpreferences.getBoolean(context.getString(R.string.SET_LONG_PRESS_STORE_MEDIA), false); if (MainActivity.currentAccount != null && MainActivity.currentAccount.api == Account.API.PLEROMA) { holder.binding.layoutReactions.getRoot().setVisibility(View.VISIBLE); @@ -344,6 +345,9 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> }).setOnEmojiClickListener((emoji, imageView) -> { String emojiStr = imageView.getUnicode(); boolean alreadyAdded = false; + if (status.pleroma == null || status.pleroma.emoji_reactions == null) { + return; + } for (Reaction reaction : status.pleroma.emoji_reactions) { if (reaction.name.compareTo(emojiStr) == 0) { alreadyAdded = true; @@ -386,12 +390,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> GridView gridView = new GridView(context); gridView.setAdapter(new EmojiAdapter(emojis.get(BaseMainActivity.currentInstance))); gridView.setNumColumns(5); - AlertDialog finalAlertDialogEmoji = alertDialogEmoji; gridView.setOnItemClickListener((parent, view, index, id) -> { String emojiStr = emojis.get(BaseMainActivity.currentInstance).get(index).shortcode; String url = emojis.get(BaseMainActivity.currentInstance).get(index).url; String static_url = emojis.get(BaseMainActivity.currentInstance).get(index).static_url; boolean alreadyAdded = false; + if (status.pleroma == null || status.pleroma.emoji_reactions == null) { + return; + } for (Reaction reaction : status.pleroma.emoji_reactions) { if (reaction.name.compareTo(emojiStr) == 0) { alreadyAdded = true; @@ -419,9 +425,6 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } else { actionsVM.addReaction(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id, emojiStr); } - if (finalAlertDialogEmoji != null) { - finalAlertDialogEmoji.dismiss(); - } }); gridView.setPadding(paddingDp, paddingDp, paddingDp, paddingDp); builder.setView(gridView); @@ -431,7 +434,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> textView.setPadding(paddingDp, paddingDp, paddingDp, paddingDp); builder.setView(textView); } - alertDialogEmoji = builder.show(); + builder.show(); }); } @@ -892,7 +895,9 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> holder.binding.username.setCompoundDrawables(null, null, null, null); } + if (statusToDeal.account.bot) { + holder.binding.botIcon.setVisibility(View.VISIBLE); } else { holder.binding.botIcon.setVisibility(View.GONE); } @@ -1121,6 +1126,19 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } else { layoutMediaBinding.playMusic.setVisibility(View.GONE); } + String finalUrl; + if (statusToDeal.media_attachments.get(0).url == null) { + finalUrl = statusToDeal.media_attachments.get(0).remote_url; + } else { + finalUrl = statusToDeal.media_attachments.get(0).url; + } + layoutMediaBinding.media.setOnLongClickListener(v -> { + if (long_press_media) { + MediaHelper.manageMove(context, finalUrl, false); + } + return true; + }); + float focusX = 0.f; float focusY = 0.f; if (statusToDeal.media_attachments.get(0).meta != null && statusToDeal.media_attachments.get(0).meta.focus != null) { @@ -1131,8 +1149,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> if (!mediaObfuscated(statusToDeal) || expand_media) { layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24); RequestBuilder<Drawable> requestBuilder = Glide.with(layoutMediaBinding.media.getContext()) - .load(statusToDeal.media_attachments.get(0).preview_url) - .apply(new RequestOptions().transform(new GlideFocus(focusX, focusY))); + .load(statusToDeal.media_attachments.get(0).preview_url); if (!fullAttachement) { requestBuilder = requestBuilder.apply(new RequestOptions().transform(new GlideFocus(focusX, focusY))); } @@ -1164,6 +1181,18 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> focusY = statusToDeal.media_attachments.get(0).meta.focus.y; } + String finalUrl; + if (attachment.url == null) { + finalUrl = attachment.remote_url; + } else { + finalUrl = attachment.url; + } + layoutMediaBinding.media.setOnLongClickListener(v -> { + if (long_press_media) { + MediaHelper.manageMove(context, finalUrl, false); + } + return true; + }); if (fullAttachement) { lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER); @@ -1185,8 +1214,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> if (!mediaObfuscated(statusToDeal) || expand_media) { layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24); RequestBuilder<Drawable> requestBuilder = Glide.with(layoutMediaBinding.media.getContext()) - .load(attachment.preview_url) - .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners((int) Helper.convertDpToPixel(3, context)))); + .load(attachment.preview_url); if (!fullAttachement) { requestBuilder = requestBuilder.apply(new RequestOptions().transform(new GlideFocus(focusX, focusY))); } diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonContext.java b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonContext.java index 1ce3b38d4..a5138f52e 100644 --- a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonContext.java +++ b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonContext.java @@ -69,8 +69,11 @@ public class FragmentMastodonContext extends Fragment { int position = getPosition(receivedStatus); if (position >= 0) { statuses.get(position).reblog = receivedStatus.reblog; + statuses.get(position).reblogged = receivedStatus.reblogged; statuses.get(position).favourited = receivedStatus.favourited; statuses.get(position).bookmarked = receivedStatus.bookmarked; + statuses.get(position).reblogs_count = receivedStatus.reblogs_count; + statuses.get(position).favourites_count = receivedStatus.favourites_count; statusAdapter.notifyItemChanged(position); } } else if (delete_statuses_for_user != null && statusAdapter != null) { diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java index 6d3ce11f6..47d06170c 100644 --- a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java +++ b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java @@ -76,8 +76,11 @@ public class FragmentMastodonNotification extends Fragment implements Notificati if (position >= 0) { if (notificationList.get(position).status != null) { notificationList.get(position).status.reblog = receivedStatus.reblog; + notificationList.get(position).status.reblogged = receivedStatus.reblogged; notificationList.get(position).status.favourited = receivedStatus.favourited; notificationList.get(position).status.bookmarked = receivedStatus.bookmarked; + notificationList.get(position).status.favourites_count = receivedStatus.favourites_count; + notificationList.get(position).status.reblogs_count = receivedStatus.reblogs_count; notificationAdapter.notifyItemChanged(position); } } diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java index 53fd1aaef..034dbbe33 100644 --- a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java +++ b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java @@ -92,8 +92,11 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. int position = getPosition(receivedStatus); if (position >= 0) { statuses.get(position).reblog = receivedStatus.reblog; + statuses.get(position).reblogged = receivedStatus.reblogged; statuses.get(position).favourited = receivedStatus.favourited; statuses.get(position).bookmarked = receivedStatus.bookmarked; + statuses.get(position).reblogs_count = receivedStatus.reblogs_count; + statuses.get(position).favourites_count = receivedStatus.favourites_count; statusAdapter.notifyItemChanged(position); } } else if (delete_statuses_for_user != null && statusAdapter != null) { |