summaryrefslogtreecommitdiffstats
path: root/app/src/main/java/app/fedilab/android/ui
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/app/fedilab/android/ui')
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java30
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/NotificationAdapter.java11
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/ReleaseNoteAdapter.java119
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java48
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonContext.java3
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonNotification.java3
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java3
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) {