diff options
Diffstat (limited to 'app/src/main/java/app/fedilab/android/ui/drawer')
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); |