summaryrefslogtreecommitdiffstats
path: root/app/src/main/java/app/fedilab/android/ui/drawer
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/app/fedilab/android/ui/drawer')
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java9
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/DomainBlockAdapter.java95
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java13
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/FilterAdapter.java7
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/ReorderBottomMenuAdapter.java4
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/ReorderTabAdapter.java74
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java89
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/SuggestionAdapter.java143
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/admin/AdminAccountAdapter.java (renamed from app/src/main/java/app/fedilab/android/ui/drawer/AdminAccountAdapter.java)9
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/admin/AdminDomainAdapter.java101
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/admin/ReportAdapter.java (renamed from app/src/main/java/app/fedilab/android/ui/drawer/ReportAdapter.java)4
11 files changed, 502 insertions, 46 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 d2b2d6397..dff83d9b0 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
@@ -143,6 +143,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
private AlertDialog alertDialogEmoji;
private List<Emoji> emojisList = new ArrayList<>();
public promptDraftListener promptDraftListener;
+ private boolean unlisted_changed = false;
public ComposeAdapter(List<Status> statusList, int statusCount, BaseAccount account, app.fedilab.android.client.entities.api.Account mentionedAccount, String visibility, String editMessageId) {
this.statusList = statusList;
@@ -619,7 +620,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
matcherEmoji = emojiPattern.matcher(searchIn);
if (matcherMention.matches()) {
String searchGroup = matcherMention.group();
- accountsVM.searchAccounts(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, searchGroup, 10, true, false).observe((LifecycleOwner) context, accounts -> {
+ accountsVM.searchAccounts(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, searchGroup, 5, false, false).observe((LifecycleOwner) context, accounts -> {
if (accounts == null) {
return;
}
@@ -1244,10 +1245,10 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
} else {
statusDraft.visibility = "public";
}
- if (position == 0 && unlistedReplies && statusDraft.visibility.equalsIgnoreCase("public") && statusList.size() > 1) {
+ if (!unlisted_changed && position == 0 && unlistedReplies && statusDraft.visibility.equalsIgnoreCase("public") && statusList.size() > 1) {
statusDraft.visibility = "unlisted";
}
- } else if (position == statusCount && unlistedReplies && statusDraft.visibility.equalsIgnoreCase("public") && statusList.size() > 1) {
+ } else if (!unlisted_changed && position == statusCount && unlistedReplies && statusDraft.visibility.equalsIgnoreCase("public") && statusList.size() > 1) {
statusDraft.visibility = "unlisted";
}
@@ -1277,6 +1278,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
holder.binding.visibilityPanel.setVisibility(View.GONE);
holder.binding.buttonVisibility.setImageResource(R.drawable.ic_compose_visibility_direct);
statusDraft.visibility = MastodonHelper.visibility.DIRECT.name();
+
});
holder.binding.buttonVisibilityPrivate.setOnClickListener(v -> {
holder.binding.visibilityPanel.setVisibility(View.GONE);
@@ -1292,6 +1294,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
holder.binding.visibilityPanel.setVisibility(View.GONE);
holder.binding.buttonVisibility.setImageResource(R.drawable.ic_compose_visibility_public);
statusDraft.visibility = MastodonHelper.visibility.PUBLIC.name();
+ unlisted_changed = true;
});
if (statusDraft.spoilerChecked) {
holder.binding.contentSpoiler.setVisibility(View.VISIBLE);
diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/DomainBlockAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/DomainBlockAdapter.java
new file mode 100644
index 000000000..a539f5e3e
--- /dev/null
+++ b/app/src/main/java/app/fedilab/android/ui/drawer/DomainBlockAdapter.java
@@ -0,0 +1,95 @@
+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.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.lifecycle.ViewModelStoreOwner;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.List;
+
+import app.fedilab.android.R;
+import app.fedilab.android.activities.MainActivity;
+import app.fedilab.android.databinding.DrawerDomainBlockBinding;
+import app.fedilab.android.helper.Helper;
+import app.fedilab.android.viewmodel.mastodon.AccountsVM;
+
+
+public class DomainBlockAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+ private final List<String> domainList;
+ private Context context;
+
+ public DomainBlockAdapter(List<String> domainList) {
+ this.domainList = domainList;
+ }
+
+ public int getCount() {
+ return domainList.size();
+ }
+
+ public String getItem(int position) {
+ return domainList.get(position);
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ context = parent.getContext();
+ DrawerDomainBlockBinding itemBinding = DrawerDomainBlockBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
+ return new DomainBlockViewHolder(itemBinding);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
+ String domain = domainList.get(position);
+ DomainBlockViewHolder holder = (DomainBlockViewHolder) viewHolder;
+ holder.binding.domainName.setText(domain);
+ AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) context).get(AccountsVM.class);
+ holder.binding.unblockDomain.setOnClickListener(v -> {
+ AlertDialog.Builder alt_bld = new AlertDialog.Builder(context, Helper.dialogStyle());
+ alt_bld.setMessage(context.getString(R.string.unblock_domain_confirm, domain));
+ alt_bld.setPositiveButton(R.string.yes, (dialog, id) -> {
+ accountsVM.removeDomainBlocks(MainActivity.currentInstance, MainActivity.currentToken, domain);
+ domainList.remove(position);
+ notifyItemRemoved(position);
+ dialog.dismiss();
+ });
+ alt_bld.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss());
+ AlertDialog alert = alt_bld.create();
+ alert.show();
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return domainList.size();
+ }
+
+
+ public static class DomainBlockViewHolder extends RecyclerView.ViewHolder {
+ DrawerDomainBlockBinding binding;
+
+ DomainBlockViewHolder(DrawerDomainBlockBinding itemView) {
+ super(itemView.getRoot());
+ binding = itemView;
+ }
+ }
+}
diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java
index b4b39fc10..3513525eb 100644
--- a/app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java
+++ b/app/src/main/java/app/fedilab/android/ui/drawer/FieldAdapter.java
@@ -38,10 +38,11 @@ public class FieldAdapter extends RecyclerView.Adapter<FieldAdapter.FieldViewHol
private final List<Field> fields;
private Context context;
- private Account account;
+ private final Account account;
- public FieldAdapter(List<Field> fields) {
+ public FieldAdapter(List<Field> fields, Account account) {
this.fields = fields;
+ this.account = account;
}
@Override
@@ -68,12 +69,18 @@ public class FieldAdapter extends RecyclerView.Adapter<FieldAdapter.FieldViewHol
if (field.verified_at != null) {
holder.binding.value.setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(context, R.drawable.ic_baseline_verified_24), null);
}
+
holder.binding.value.setText(
field.getValueSpan(context, account,
new WeakReference<>(holder.binding.value)),
TextView.BufferType.SPANNABLE);
holder.binding.value.setMovementMethod(LinkMovementMethod.getInstance());
- holder.binding.label.setText(field.name);
+
+ holder.binding.label.setText(
+ field.getValueSpan(context, account,
+ new WeakReference<>(holder.binding.label)),
+ TextView.BufferType.SPANNABLE);
+ holder.binding.label.setMovementMethod(LinkMovementMethod.getInstance());
}
diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/FilterAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/FilterAdapter.java
index e7f8bf287..954369d44 100644
--- a/app/src/main/java/app/fedilab/android/ui/drawer/FilterAdapter.java
+++ b/app/src/main/java/app/fedilab/android/ui/drawer/FilterAdapter.java
@@ -78,11 +78,14 @@ public class FilterAdapter extends RecyclerView.Adapter<FilterAdapter.FilterView
contextString.append(ct).append(" ");
holder.binding.filterContext.setText(contextString.toString());
holder.binding.editFilter.setOnClickListener(v -> FilterActivity.addEditFilter(context, filter, filter1 -> {
- if (filter1 != null) {
+ if (filter1 != null && BaseMainActivity.mainFilters.size() > position) {
BaseMainActivity.mainFilters.get(position).context = filter1.context;
BaseMainActivity.mainFilters.get(position).expires_at = filter1.expires_at;
+ BaseMainActivity.mainFilters.get(position).filter_action = filter1.filter_action;
+ BaseMainActivity.mainFilters.get(position).keywords = filter1.keywords;
+ BaseMainActivity.mainFilters.get(position).title = filter1.title;
+ filterAdapter.notifyItemChanged(position);
}
- filterAdapter.notifyItemChanged(position);
}));
holder.binding.deleteFilter.setOnClickListener(v -> {
AlertDialog.Builder builder = new AlertDialog.Builder(context, Helper.dialogStyle());
diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/ReorderBottomMenuAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/ReorderBottomMenuAdapter.java
index 5d0e4dd01..052a5c678 100644
--- a/app/src/main/java/app/fedilab/android/ui/drawer/ReorderBottomMenuAdapter.java
+++ b/app/src/main/java/app/fedilab/android/ui/drawer/ReorderBottomMenuAdapter.java
@@ -20,7 +20,6 @@ import android.content.Context;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.ViewGroup;
-import android.widget.Toast;
import androidx.recyclerview.widget.RecyclerView;
@@ -36,7 +35,6 @@ import app.fedilab.android.exception.DBException;
import app.fedilab.android.helper.itemtouchhelper.ItemTouchHelperAdapter;
import app.fedilab.android.helper.itemtouchhelper.ItemTouchHelperViewHolder;
import app.fedilab.android.helper.itemtouchhelper.OnStartDragListener;
-import es.dmoral.toasty.Toasty;
/**
@@ -130,8 +128,6 @@ public class ReorderBottomMenuAdapter extends RecyclerView.Adapter<RecyclerView.
@Override
public void onItemDismiss(int position) {
- notifyItemChanged(position);
- Toasty.info(context, context.getString(R.string.warning_main_timeline), Toast.LENGTH_SHORT).show();
}
@Override
diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/ReorderTabAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/ReorderTabAdapter.java
index 4f0739105..e85afc093 100644
--- a/app/src/main/java/app/fedilab/android/ui/drawer/ReorderTabAdapter.java
+++ b/app/src/main/java/app/fedilab/android/ui/drawer/ReorderTabAdapter.java
@@ -21,14 +21,17 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.Toast;
+import androidx.appcompat.app.AlertDialog;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.lifecycle.ViewModelStoreOwner;
import androidx.recyclerview.widget.RecyclerView;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
+import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
import app.fedilab.android.activities.ReorderTimelinesActivity;
import app.fedilab.android.client.entities.app.Pinned;
@@ -36,11 +39,11 @@ import app.fedilab.android.client.entities.app.PinnedTimeline;
import app.fedilab.android.client.entities.app.Timeline;
import app.fedilab.android.databinding.DrawerReorderBinding;
import app.fedilab.android.exception.DBException;
+import app.fedilab.android.helper.Helper;
import app.fedilab.android.helper.itemtouchhelper.ItemTouchHelperAdapter;
import app.fedilab.android.helper.itemtouchhelper.ItemTouchHelperViewHolder;
import app.fedilab.android.helper.itemtouchhelper.OnStartDragListener;
-import app.fedilab.android.helper.itemtouchhelper.OnUndoListener;
-import es.dmoral.toasty.Toasty;
+import app.fedilab.android.viewmodel.mastodon.TimelinesVM;
/**
@@ -52,13 +55,11 @@ import es.dmoral.toasty.Toasty;
public class ReorderTabAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements ItemTouchHelperAdapter {
private final OnStartDragListener mDragStartListener;
- private final OnUndoListener mUndoListener;
private final Pinned pinned;
private Context context;
- public ReorderTabAdapter(Pinned pinned, OnStartDragListener dragStartListener, OnUndoListener undoListener) {
+ public ReorderTabAdapter(Pinned pinned, OnStartDragListener dragStartListener) {
this.mDragStartListener = dragStartListener;
- this.mUndoListener = undoListener;
this.pinned = pinned;
}
@@ -169,24 +170,61 @@ public class ReorderTabAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
}
holder.binding.delete.setOnClickListener(v -> {
if (item.type == Timeline.TimeLineEnum.TAG || item.type == Timeline.TimeLineEnum.REMOTE || item.type == Timeline.TimeLineEnum.LIST) {
- mUndoListener.onUndo(item, position);
- pinned.pinnedTimelines.remove(position);
- notifyItemRemoved(position);
+ AlertDialog.Builder alt_bld = new AlertDialog.Builder(context, Helper.dialogStyle());
+ String title = "";
+ String message = "";
+ alt_bld.setTitle(R.string.action_lists_delete);
+ alt_bld.setMessage(R.string.action_lists_confirm_delete);
+ switch (item.type) {
+ case TAG:
+ case REMOTE:
+ title = context.getString(R.string.action_pinned_delete);
+ message = context.getString(R.string.unpin_timeline_description);
+ break;
+ case LIST:
+ title = context.getString(R.string.action_lists_delete);
+ message = context.getString(R.string.action_lists_confirm_delete);
+ break;
+ }
+ alt_bld.setTitle(title);
+ alt_bld.setMessage(message);
+
+ alt_bld.setPositiveButton(R.string.delete, (dialog, id) -> {
+ //change position of pinned that are after the removed item
+ if (position < pinned.pinnedTimelines.size()) {
+ for (int i = item.position + 1; i < pinned.pinnedTimelines.size(); i++) {
+ pinned.pinnedTimelines.get(i).position -= 1;
+ }
+ pinned.pinnedTimelines.remove(position);
+ notifyItemRemoved(position);
+ notifyItemChanged(position, pinned.pinnedTimelines.size() - position);
+ try {
+ new Pinned(context).updatePinned(pinned);
+ } catch (DBException e) {
+ e.printStackTrace();
+ }
+ }
+
+ if (item.type == Timeline.TimeLineEnum.LIST) {
+ TimelinesVM timelinesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(TimelinesVM.class);
+ timelinesVM.deleteList(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, item.mastodonList.id);
+ }
+
+
+ ((ReorderTimelinesActivity) context).setChanges(true);
+ dialog.dismiss();
+
+ });
+ alt_bld.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss());
+ AlertDialog alert = alt_bld.create();
+ alert.show();
+
}
});
}
@Override
public void onItemDismiss(int position) {
- PinnedTimeline item = pinned.pinnedTimelines.get(position);
- if (item.type == Timeline.TimeLineEnum.TAG || item.type == Timeline.TimeLineEnum.REMOTE || item.type == Timeline.TimeLineEnum.LIST) {
- mUndoListener.onUndo(item, position);
- pinned.pinnedTimelines.remove(position);
- notifyItemRemoved(position);
- } else {
- notifyItemChanged(position);
- Toasty.info(context, context.getString(R.string.warning_main_timeline), Toast.LENGTH_SHORT).show();
- }
}
@Override
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 bc36b5ef6..af62860f7 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
@@ -24,6 +24,7 @@ import static app.fedilab.android.BaseMainActivity.regex_public;
import static app.fedilab.android.BaseMainActivity.show_boosts;
import static app.fedilab.android.BaseMainActivity.show_replies;
import static app.fedilab.android.activities.ContextActivity.expand;
+import static app.fedilab.android.helper.Helper.PREF_USER_TOKEN;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -38,6 +39,8 @@ import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
+import android.os.Handler;
+import android.os.Looper;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
@@ -100,20 +103,22 @@ import java.util.regex.Pattern;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
-import app.fedilab.android.activities.AdminAccountActivity;
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;
import app.fedilab.android.activities.StatusHistoryActivity;
import app.fedilab.android.activities.StatusInfoActivity;
+import app.fedilab.android.activities.admin.AdminAccountActivity;
import app.fedilab.android.client.entities.api.Attachment;
import app.fedilab.android.client.entities.api.Poll;
import app.fedilab.android.client.entities.api.Reaction;
import app.fedilab.android.client.entities.api.Status;
import app.fedilab.android.client.entities.app.Account;
+import app.fedilab.android.client.entities.app.BaseAccount;
import app.fedilab.android.client.entities.app.StatusCache;
import app.fedilab.android.client.entities.app.StatusDraft;
import app.fedilab.android.client.entities.app.Timeline;
@@ -1240,8 +1245,10 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
layoutMediaBinding.media.setOnClickListener(v -> {
if (statusToDeal.isMediaObfuscated && mediaObfuscated(statusToDeal) && !expand_media) {
statusToDeal.isMediaObfuscated = false;
- adapter.notifyItemChanged(holder.getBindingAdapterPosition());
+ int position = holder.getBindingAdapterPosition();
+ adapter.notifyItemChanged(position);
final int timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5);
+
if (timeout > 0) {
new CountDownTimer((timeout * 1000L), 1000) {
public void onTick(long millisUntilFinished) {
@@ -1249,7 +1256,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
public void onFinish() {
status.isMediaObfuscated = true;
- adapter.notifyItemChanged(holder.getBindingAdapterPosition());
+ adapter.notifyItemChanged(position);
}
}.start();
}
@@ -1609,7 +1616,11 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
.observe((LifecycleOwner) context, poll -> {
int i = 0;
for (Poll.PollItem item : statusToDeal.poll.options) {
- poll.options.get(i).span_title = item.span_title;
+ if (item.span_title != null) {
+ poll.options.get(i).span_title = item.span_title;
+ } else {
+ poll.options.get(i).span_title = new SpannableString(item.title);
+ }
i++;
}
statusToDeal.poll = poll;
@@ -1625,7 +1636,11 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
if (poll != null) {
int i = 0;
for (Poll.PollItem item : statusToDeal.poll.options) {
- poll.options.get(i).span_title = item.span_title;
+ if (item.span_title != null) {
+ poll.options.get(i).span_title = item.span_title;
+ } else {
+ poll.options.get(i).span_title = new SpannableString(item.title);
+ }
i++;
}
statusToDeal.poll = poll;
@@ -1640,7 +1655,11 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
//Store span elements
int i = 0;
for (Poll.PollItem item : statusToDeal.poll.options) {
- poll.options.get(i).span_title = item.span_title;
+ if (item.span_title != null) {
+ poll.options.get(i).span_title = item.span_title;
+ } else {
+ poll.options.get(i).span_title = new SpannableString(item.title);
+ }
i++;
}
statusToDeal.poll = poll;
@@ -1849,14 +1868,18 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
AlertDialog.Builder builderInner = new AlertDialog.Builder(context, Helper.dialogStyle());
builderInner.setTitle(stringArrayConf[0]);
builderInner.setMessage(statusToDeal.account.acct);
- builderInner.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
- builderInner.setPositiveButton(R.string.yes, (dialog, which) -> accountsVM.mute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.account.id, null, null)
+ builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
+ builderInner.setNegativeButton(R.string.keep_notifications, (dialog, which) -> accountsVM.mute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.account.id, false, null)
+ .observe((LifecycleOwner) context, relationShip -> {
+ sendAction(context, Helper.ARG_STATUS_ACCOUNT_ID_DELETED, null, statusToDeal.account.id);
+ Toasty.info(context, context.getString(R.string.toast_mute), Toasty.LENGTH_LONG).show();
+ }));
+ builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> accountsVM.mute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.account.id, null, null)
.observe((LifecycleOwner) context, relationShip -> {
sendAction(context, Helper.ARG_STATUS_ACCOUNT_ID_DELETED, null, statusToDeal.account.id);
Toasty.info(context, context.getString(R.string.toast_mute), Toasty.LENGTH_LONG).show();
}));
builderInner.show();
-
} else if (itemId == R.id.action_mute_conversation) {
if (statusToDeal.muted) {
statusesVM.unMute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.id).observe((LifecycleOwner) context, status1 -> Toasty.info(context, context.getString(R.string.toast_unmute_conversation)).show());
@@ -1993,6 +2016,54 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
b.putSerializable(Helper.ARG_STATUS_MENTION, statusToDeal);
intent.putExtras(b);
context.startActivity(intent);
+ } else if (itemId == R.id.action_open_with) {
+ new Thread(() -> {
+ try {
+ List<BaseAccount> accounts = new Account(context).getCrossAccounts();
+ if (accounts.size() > 1) {
+ List<app.fedilab.android.client.entities.api.Account> accountList = new ArrayList<>();
+ for (BaseAccount account : accounts) {
+ accountList.add(account.mastodon_account);
+ }
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ Runnable myRunnable = () -> {
+ AlertDialog.Builder builderSingle = new AlertDialog.Builder(context, Helper.dialogStyle());
+ builderSingle.setTitle(context.getString(R.string.choose_accounts));
+ final AccountsSearchAdapter accountsSearchAdapter = new AccountsSearchAdapter(context, accountList);
+ final BaseAccount[] accountArray = new BaseAccount[accounts.size()];
+ int i = 0;
+ for (BaseAccount account : accounts) {
+ accountArray[i] = account;
+ i++;
+ }
+ builderSingle.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
+ builderSingle.setAdapter(accountsSearchAdapter, (dialog, which) -> {
+ BaseAccount account = accountArray[which];
+
+ Toasty.info(context, context.getString(R.string.toast_account_changed, "@" + account.mastodon_account.acct + "@" + account.instance), Toasty.LENGTH_LONG).show();
+ BaseMainActivity.currentToken = account.token;
+ BaseMainActivity.currentUserID = account.user_id;
+ BaseMainActivity.currentInstance = account.instance;
+ MainActivity.currentAccount = account;
+ SharedPreferences.Editor editor = sharedpreferences.edit();
+ editor.putString(PREF_USER_TOKEN, account.token);
+ editor.commit();
+ Intent mainActivity = new Intent(context, MainActivity.class);
+ mainActivity.putExtra(Helper.INTENT_ACTION, Helper.OPEN_WITH_ANOTHER_ACCOUNT);
+ mainActivity.putExtra(Helper.PREF_MESSAGE_URL, statusToDeal.url);
+ context.startActivity(mainActivity);
+ ((Activity) context).finish();
+ dialog.dismiss();
+ });
+ builderSingle.show();
+ };
+ mainHandler.post(myRunnable);
+ }
+
+ } catch (DBException e) {
+ e.printStackTrace();
+ }
+ }).start();
}
return true;
});
diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/SuggestionAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/SuggestionAdapter.java
new file mode 100644
index 000000000..ced0db250
--- /dev/null
+++ b/app/src/main/java/app/fedilab/android/ui/drawer/SuggestionAdapter.java
@@ -0,0 +1,143 @@
+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.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.ColorStateList;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.content.ContextCompat;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.lifecycle.ViewModelStoreOwner;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+import app.fedilab.android.BaseMainActivity;
+import app.fedilab.android.R;
+import app.fedilab.android.activities.ProfileActivity;
+import app.fedilab.android.client.entities.api.Account;
+import app.fedilab.android.client.entities.api.Suggestion;
+import app.fedilab.android.databinding.DrawerSuggestionBinding;
+import app.fedilab.android.helper.Helper;
+import app.fedilab.android.helper.MastodonHelper;
+import app.fedilab.android.viewmodel.mastodon.AccountsVM;
+
+
+public class SuggestionAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private final List<Suggestion> suggestionList;
+ private Context context;
+
+ public SuggestionAdapter(List<Suggestion> suggestionList) {
+ this.suggestionList = suggestionList;
+ }
+
+
+ public int getCount() {
+ return suggestionList.size();
+ }
+
+ public Suggestion getItem(int position) {
+ return suggestionList.get(position);
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ this.context = parent.getContext();
+ DrawerSuggestionBinding itemBinding = DrawerSuggestionBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
+ return new SuggestionViewHolder(itemBinding);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
+ Account account = suggestionList.get(position).account;
+ SuggestionViewHolder holder = (SuggestionViewHolder) viewHolder;
+ MastodonHelper.loadPPMastodon(holder.binding.avatar, account);
+
+
+ AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) context).get(AccountsVM.class);
+
+ holder.binding.avatar.setOnClickListener(v -> {
+ Intent intent = new Intent(context, ProfileActivity.class);
+ Bundle b = new Bundle();
+ b.putSerializable(Helper.ARG_ACCOUNT, account);
+ intent.putExtras(b);
+ ActivityOptionsCompat options = ActivityOptionsCompat
+ .makeSceneTransitionAnimation((Activity) context, holder.binding.avatar, context.getString(R.string.activity_porfile_pp));
+ // start the new activity
+ context.startActivity(intent, options.toBundle());
+ });
+ holder.binding.followAction.setIconResource(R.drawable.ic_baseline_person_add_24);
+ holder.binding.followAction.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(context, R.color.cyanea_accent_dark_reference)));
+ if (account == null) {
+ return;
+ }
+ holder.binding.displayName.setText(
+ account.getSpanDisplayName(context,
+ new WeakReference<>(holder.binding.displayName)),
+ TextView.BufferType.SPANNABLE);
+ holder.binding.username.setText(String.format("@%s", account.acct));
+ holder.binding.bio.setText(
+ account.getSpanNote(context,
+ new WeakReference<>(holder.binding.bio)),
+ TextView.BufferType.SPANNABLE);
+
+ holder.binding.followAction.setEnabled(false);