2017-01-31 15:51:02 +11:00
|
|
|
/* Copyright 2017 Andrew Dawson
|
|
|
|
*
|
2017-04-10 10:12:31 +10:00
|
|
|
* This file is a part of Tusky.
|
2017-01-31 15:51:02 +11:00
|
|
|
*
|
2017-04-10 10:12:31 +10:00
|
|
|
* 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.
|
2017-01-31 15:51:02 +11:00
|
|
|
*
|
|
|
|
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
2017-04-10 10:12:31 +10:00
|
|
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
|
|
* Public License for more details.
|
2017-01-31 15:51:02 +11:00
|
|
|
*
|
2017-04-10 10:12:31 +10:00
|
|
|
* You should have received a copy of the GNU General Public License along with Tusky; if not,
|
|
|
|
* see <http://www.gnu.org/licenses>. */
|
2017-01-31 15:51:02 +11:00
|
|
|
|
2017-05-05 08:55:34 +10:00
|
|
|
package com.keylesspalace.tusky.adapter;
|
2017-01-31 15:51:02 +11:00
|
|
|
|
2017-04-22 16:06:19 +10:00
|
|
|
import android.support.annotation.Nullable;
|
2017-01-31 15:51:02 +11:00
|
|
|
import android.support.v7.widget.RecyclerView;
|
|
|
|
|
2017-03-09 09:19:03 +11:00
|
|
|
import com.keylesspalace.tusky.entity.Account;
|
2017-05-05 08:55:34 +10:00
|
|
|
import com.keylesspalace.tusky.interfaces.AccountActionListener;
|
2017-07-14 10:17:50 +10:00
|
|
|
import com.keylesspalace.tusky.util.ListUtils;
|
2017-03-09 09:19:03 +11:00
|
|
|
|
2017-01-31 15:51:02 +11:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2017-05-05 08:55:34 +10:00
|
|
|
public abstract class AccountAdapter extends RecyclerView.Adapter {
|
2017-02-22 13:12:49 +11:00
|
|
|
List<Account> accountList;
|
|
|
|
AccountActionListener accountActionListener;
|
2017-07-01 08:30:25 +10:00
|
|
|
FooterViewHolder.State footerState;
|
|
|
|
|
2017-06-30 16:31:58 +10:00
|
|
|
private String topId;
|
|
|
|
private String bottomId;
|
2017-01-31 15:51:02 +11:00
|
|
|
|
2017-03-11 07:12:40 +11:00
|
|
|
AccountAdapter(AccountActionListener accountActionListener) {
|
2017-01-31 15:51:02 +11:00
|
|
|
super();
|
2017-02-22 13:12:49 +11:00
|
|
|
accountList = new ArrayList<>();
|
2017-01-31 15:51:02 +11:00
|
|
|
this.accountActionListener = accountActionListener;
|
2017-07-01 08:30:25 +10:00
|
|
|
footerState = FooterViewHolder.State.END;
|
2017-01-31 15:51:02 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getItemCount() {
|
2017-02-22 13:12:49 +11:00
|
|
|
return accountList.size() + 1;
|
2017-01-31 15:51:02 +11:00
|
|
|
}
|
|
|
|
|
2017-06-30 16:31:58 +10:00
|
|
|
public void update(@Nullable List<Account> newAccounts, @Nullable String fromId,
|
2018-03-03 06:56:09 +11:00
|
|
|
@Nullable String uptoId) {
|
2017-03-20 18:03:03 +11:00
|
|
|
if (newAccounts == null || newAccounts.isEmpty()) {
|
|
|
|
return;
|
|
|
|
}
|
2018-03-03 06:56:09 +11:00
|
|
|
|
|
|
|
bottomId = fromId;
|
|
|
|
topId = uptoId;
|
|
|
|
|
2017-03-20 18:03:03 +11:00
|
|
|
if (accountList.isEmpty()) {
|
2017-07-14 10:17:50 +10:00
|
|
|
accountList = ListUtils.removeDuplicates(newAccounts);
|
2017-01-31 15:51:02 +11:00
|
|
|
} else {
|
2017-03-20 18:03:03 +11:00
|
|
|
int index = accountList.indexOf(newAccounts.get(newAccounts.size() - 1));
|
|
|
|
for (int i = 0; i < index; i++) {
|
|
|
|
accountList.remove(0);
|
|
|
|
}
|
|
|
|
int newIndex = newAccounts.indexOf(accountList.get(0));
|
|
|
|
if (newIndex == -1) {
|
2017-02-22 13:12:49 +11:00
|
|
|
accountList.addAll(0, newAccounts);
|
2017-01-31 15:51:02 +11:00
|
|
|
} else {
|
2017-03-20 18:03:03 +11:00
|
|
|
accountList.addAll(0, newAccounts.subList(0, newIndex));
|
2017-01-31 15:51:02 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
notifyDataSetChanged();
|
|
|
|
}
|
|
|
|
|
2017-06-30 16:31:58 +10:00
|
|
|
public void addItems(List<Account> newAccounts, @Nullable String fromId) {
|
|
|
|
if (fromId != null) {
|
|
|
|
bottomId = fromId;
|
|
|
|
}
|
2017-02-22 13:12:49 +11:00
|
|
|
int end = accountList.size();
|
2017-06-30 16:31:58 +10:00
|
|
|
Account last = accountList.get(end - 1);
|
2018-03-03 23:24:03 +11:00
|
|
|
if (last != null && !findAccount(newAccounts, last.getId())) {
|
2017-06-30 16:31:58 +10:00
|
|
|
accountList.addAll(newAccounts);
|
|
|
|
notifyItemRangeInserted(end, newAccounts.size());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean findAccount(List<Account> accounts, String id) {
|
|
|
|
for (Account account : accounts) {
|
2018-03-03 23:24:03 +11:00
|
|
|
if (account.getId().equals(id)) {
|
2017-06-30 16:31:58 +10:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
2017-01-31 15:51:02 +11:00
|
|
|
}
|
|
|
|
|
2017-04-22 16:06:19 +10:00
|
|
|
@Nullable
|
2017-05-05 08:55:34 +10:00
|
|
|
public Account removeItem(int position) {
|
2017-04-22 16:06:19 +10:00
|
|
|
if (position < 0 || position >= accountList.size()) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
Account account = accountList.remove(position);
|
|
|
|
notifyItemRemoved(position);
|
|
|
|
return account;
|
|
|
|
}
|
|
|
|
|
2017-05-05 08:55:34 +10:00
|
|
|
public void addItem(Account account, int position) {
|
2017-04-22 16:06:19 +10:00
|
|
|
if (position < 0 || position > accountList.size()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
accountList.add(position, account);
|
|
|
|
notifyItemInserted(position);
|
|
|
|
}
|
|
|
|
|
2017-06-30 16:31:58 +10:00
|
|
|
@Nullable
|
2017-01-31 15:51:02 +11:00
|
|
|
public Account getItem(int position) {
|
2017-02-22 13:12:49 +11:00
|
|
|
if (position >= 0 && position < accountList.size()) {
|
|
|
|
return accountList.get(position);
|
2017-01-31 15:51:02 +11:00
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2017-06-30 16:31:58 +10:00
|
|
|
|
2017-07-01 08:30:25 +10:00
|
|
|
public void setFooterState(FooterViewHolder.State newFooterState) {
|
|
|
|
footerState = newFooterState;
|
|
|
|
}
|
|
|
|
|
2017-06-30 16:31:58 +10:00
|
|
|
@Nullable
|
|
|
|
public String getBottomId() {
|
|
|
|
return bottomId;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Nullable
|
|
|
|
public String getTopId() {
|
|
|
|
return topId;
|
|
|
|
}
|
2017-01-31 15:51:02 +11:00
|
|
|
}
|