271 lines
12 KiB
Java
271 lines
12 KiB
Java
package app.fedilab.fedilabtube.drawer;
|
|
/* Copyright 2020 Thomas Schneider
|
|
*
|
|
* This file is a part of TubeLab
|
|
*
|
|
* 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.
|
|
*
|
|
* TubeLab 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 TubeLab; if not,
|
|
* see <http://www.gnu.org/licenses>. */
|
|
|
|
import android.app.AlertDialog;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import android.text.Html;
|
|
import android.text.util.Linkify;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.ImageView;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.TextView;
|
|
import android.widget.Toast;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
import androidx.fragment.app.FragmentTransaction;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
|
|
|
import java.util.List;
|
|
|
|
import app.fedilab.fedilabtube.R;
|
|
import app.fedilab.fedilabtube.ShowAccountActivity;
|
|
import app.fedilab.fedilabtube.asynctasks.PostActionAsyncTask;
|
|
import app.fedilab.fedilabtube.asynctasks.RetrieveAccountsAsyncTask;
|
|
import app.fedilab.fedilabtube.client.HttpsConnection;
|
|
import app.fedilab.fedilabtube.client.PeertubeAPI;
|
|
import app.fedilab.fedilabtube.client.entities.Account;
|
|
import app.fedilab.fedilabtube.client.entities.Error;
|
|
import app.fedilab.fedilabtube.fragment.DisplayPlaylistsFragment;
|
|
import app.fedilab.fedilabtube.helper.Helper;
|
|
import app.fedilab.fedilabtube.interfaces.OnPostActionInterface;
|
|
import es.dmoral.toasty.Toasty;
|
|
|
|
|
|
public class AccountsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements OnPostActionInterface {
|
|
|
|
public AllAccountsRemoved allAccountsRemoved;
|
|
private List<Account> accounts;
|
|
private Context context;
|
|
private AccountsListAdapter accountsListAdapter;
|
|
private RetrieveAccountsAsyncTask.accountFetch type;
|
|
|
|
public AccountsListAdapter(RetrieveAccountsAsyncTask.accountFetch type, List<Account> accounts) {
|
|
this.accounts = accounts;
|
|
this.accountsListAdapter = this;
|
|
this.type = type;
|
|
}
|
|
|
|
@NonNull
|
|
@Override
|
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
context = parent.getContext();
|
|
LayoutInflater layoutInflater = LayoutInflater.from(context);
|
|
return new ViewHolder(layoutInflater.inflate(R.layout.drawer_account, parent, false));
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
|
final AccountsListAdapter.ViewHolder holder = (AccountsListAdapter.ViewHolder) viewHolder;
|
|
final Account account = accounts.get(position);
|
|
if (type == RetrieveAccountsAsyncTask.accountFetch.CHANNEL) {
|
|
holder.account_action.show();
|
|
holder.account_action.setImageResource(R.drawable.ic_baseline_delete_24);
|
|
holder.account_action.setContentDescription(context.getString(R.string.delete_channel));
|
|
holder.account_action.setOnClickListener(view -> {
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
|
builder.setTitle(context.getString(R.string.action_channel_delete) + ": " + account.getAcct());
|
|
builder.setMessage(context.getString(R.string.action_channel_confirm_delete));
|
|
builder.setIcon(android.R.drawable.ic_dialog_alert)
|
|
.setPositiveButton(R.string.yes, (dialog, which) -> {
|
|
accounts.remove(account);
|
|
notifyDataSetChanged();
|
|
new Thread(() -> {
|
|
try {
|
|
new PeertubeAPI(context).deleteChannel(account.getAcct());
|
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
|
Runnable myRunnable = () -> {
|
|
DisplayPlaylistsFragment displayPlaylistsFragment;
|
|
if (context == null)
|
|
return;
|
|
displayPlaylistsFragment = (DisplayPlaylistsFragment) ((AppCompatActivity) context).getSupportFragmentManager().findFragmentByTag("CHANNELS");
|
|
final FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
|
|
if (displayPlaylistsFragment != null) {
|
|
ft.detach(displayPlaylistsFragment);
|
|
ft.attach(displayPlaylistsFragment);
|
|
ft.commit();
|
|
}
|
|
};
|
|
mainHandler.post(myRunnable);
|
|
} catch (HttpsConnection.HttpsConnectionException e) {
|
|
e.printStackTrace();
|
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
|
Runnable myRunnable = () -> {
|
|
if (e.getMessage() != null) {
|
|
Toasty.error(context, e.getMessage(), Toast.LENGTH_LONG).show();
|
|
} else {
|
|
Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show();
|
|
}
|
|
};
|
|
mainHandler.post(myRunnable);
|
|
}
|
|
}).start();
|
|
dialog.dismiss();
|
|
})
|
|
.setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss())
|
|
.show();
|
|
});
|
|
} else if (type == RetrieveAccountsAsyncTask.accountFetch.MUTED) {
|
|
holder.account_action.setOnClickListener(v -> new PostActionAsyncTask(context, PeertubeAPI.StatusAction.UNMUTE, account.getAcct(), AccountsListAdapter.this).execute());
|
|
} else {
|
|
holder.account_action.hide();
|
|
}
|
|
|
|
if (account.getDisplay_name() != null && !account.getDisplay_name().trim().equals(""))
|
|
holder.account_dn.setText(account.getDisplay_name());
|
|
else
|
|
holder.account_dn.setText(account.getUsername().replace("@", ""));
|
|
holder.account_un.setText(String.format("@%s", account.getUsername()));
|
|
holder.account_ac.setText(account.getAcct());
|
|
if (account.getUsername().equals(account.getAcct()))
|
|
holder.account_ac.setVisibility(View.GONE);
|
|
else
|
|
holder.account_ac.setVisibility(View.VISIBLE);
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
|
|
holder.account_ds.setText(Html.fromHtml(account.getNote(), Html.FROM_HTML_MODE_LEGACY));
|
|
else
|
|
holder.account_ds.setText(Html.fromHtml(account.getNote()));
|
|
holder.account_ds.setAutoLinkMask(Linkify.WEB_URLS);
|
|
holder.account_sc.setText(Helper.withSuffix(account.getStatuses_count()));
|
|
holder.account_fgc.setText(Helper.withSuffix(account.getFollowing_count()));
|
|
holder.account_frc.setText(Helper.withSuffix(account.getFollowers_count()));
|
|
//Profile picture
|
|
Helper.loadGiF(context, account, holder.account_pp);
|
|
if (account.isMakingAction()) {
|
|
holder.account_action.setEnabled(false);
|
|
} else {
|
|
holder.account_action.setEnabled(true);
|
|
}
|
|
//Follow button
|
|
if (type == RetrieveAccountsAsyncTask.accountFetch.MUTED) {
|
|
holder.account_action.show();
|
|
holder.account_action.setImageResource(R.drawable.ic_baseline_volume_mute_24);
|
|
}
|
|
|
|
|
|
holder.account_pp.setOnClickListener(v -> {
|
|
Intent intent = new Intent(context, ShowAccountActivity.class);
|
|
Bundle b = new Bundle();
|
|
b.putBoolean("peertubeaccount", true);
|
|
b.putBoolean("ischannel", true);
|
|
b.putString("targetedid", account.getAcct());
|
|
b.putParcelable("account", account);
|
|
intent.putExtras(b);
|
|
context.startActivity(intent);
|
|
});
|
|
|
|
|
|
}
|
|
|
|
@Override
|
|
public long getItemId(int position) {
|
|
return position;
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
return accounts.size();
|
|
}
|
|
|
|
@Override
|
|
public void onPostAction(int statusCode, PeertubeAPI.StatusAction statusAction, String targetedId, Error error) {
|
|
if (error != null) {
|
|
Toasty.error(context, error.getError(), Toast.LENGTH_LONG).show();
|
|
return;
|
|
}
|
|
|
|
if (statusAction == PeertubeAPI.StatusAction.FOLLOW) {
|
|
for (Account account : accounts) {
|
|
if (account.getId().equals(targetedId)) {
|
|
account.setFollowType(Account.followAction.FOLLOW);
|
|
account.setMakingAction(false);
|
|
}
|
|
}
|
|
accountsListAdapter.notifyDataSetChanged();
|
|
}
|
|
if (statusAction == PeertubeAPI.StatusAction.UNMUTE) {
|
|
Account tmpAccount = null;
|
|
int position = 0;
|
|
for (Account account : accounts) {
|
|
if (account.getAcct().equals(targetedId)) {
|
|
tmpAccount = account;
|
|
break;
|
|
}
|
|
position++;
|
|
}
|
|
if (tmpAccount != null) {
|
|
accounts.remove(position);
|
|
accountsListAdapter.notifyItemRemoved(position);
|
|
}
|
|
}
|
|
if (statusAction == PeertubeAPI.StatusAction.UNFOLLOW) {
|
|
for (Account account : accounts) {
|
|
if (account.getId().equals(targetedId)) {
|
|
account.setFollowType(Account.followAction.NOT_FOLLOW);
|
|
account.setMakingAction(false);
|
|
}
|
|
}
|
|
accountsListAdapter.notifyDataSetChanged();
|
|
if (accounts.size() == 0) {
|
|
allAccountsRemoved.onAllAccountsRemoved();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public interface AllAccountsRemoved {
|
|
void onAllAccountsRemoved();
|
|
}
|
|
|
|
private static class ViewHolder extends RecyclerView.ViewHolder {
|
|
ImageView account_pp;
|
|
TextView account_ac;
|
|
TextView account_dn;
|
|
TextView account_un;
|
|
TextView account_ds;
|
|
TextView account_sc;
|
|
TextView account_fgc;
|
|
TextView account_frc;
|
|
LinearLayout account_info;
|
|
FloatingActionButton account_action;
|
|
LinearLayout account_container;
|
|
|
|
ViewHolder(View itemView) {
|
|
super(itemView);
|
|
account_pp = itemView.findViewById(R.id.account_pp);
|
|
account_dn = itemView.findViewById(R.id.account_dn);
|
|
account_ac = itemView.findViewById(R.id.account_ac);
|
|
account_un = itemView.findViewById(R.id.account_un);
|
|
account_ds = itemView.findViewById(R.id.account_ds);
|
|
account_sc = itemView.findViewById(R.id.account_sc);
|
|
account_fgc = itemView.findViewById(R.id.account_fgc);
|
|
account_frc = itemView.findViewById(R.id.account_frc);
|
|
account_action = itemView.findViewById(R.id.account_action);
|
|
account_info = itemView.findViewById(R.id.account_info);
|
|
account_container = itemView.findViewById(R.id.account_container);
|
|
}
|
|
}
|
|
|
|
} |