/*
* Author: Balch
* Created: 9/4/14 12:26 AM
*
* This file is part of MockTrade.
*
* MockTrade 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.
*
* MockTrade 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 MockTrade. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (C) 2014
*/
package com.balch.mocktrade.portfolio;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.balch.mocktrade.R;
import com.balch.mocktrade.ViewProvider;
import com.balch.mocktrade.account.Account;
import com.balch.mocktrade.investment.Investment;
import com.balch.mocktrade.settings.Settings;
import com.balch.mocktrade.shared.PerformanceItem;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class PortfolioAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int VIEW_TYPE_ACCOUNT_HEADER = 0;
private static final int VIEW_TYPE_PORTFOLIO_ITEM = 1;
private static final int VIEW_TYPE_NEW_ACCOUNT_ITEM = 2;
public interface PortfolioAdapterListener {
boolean onLongClickAccount(Account account);
boolean onLongClickInvestment(Investment investment);
void createNewAccount();
void createNewDogsAccount();
}
private AccountViewHolder.AccountItemViewListener mAccountItemViewListener;
private final Settings mSettings;
private final ViewProvider mViewProvider;
private PortfolioAdapterListener mPortfolioAdapterListener;
private PortfolioData mPortfolioData = new PortfolioData();
private List<Object> mDataList;
public PortfolioAdapter(Settings settings, ViewProvider viewProvider) {
mSettings = settings;
mViewProvider = viewProvider;
}
public void bind(PortfolioData portfolioData) {
mPortfolioData = portfolioData;
mDataList = new ArrayList<>();
for (Account account : portfolioData.getAccounts()) {
mDataList.add(account);
mDataList.addAll(portfolioData.getInvestments(account.getId()));
}
notifyDataSetChanged();
}
public void clear(boolean notify) {
mDataList = null;
mPortfolioData = null;
if (notify) {
notifyDataSetChanged();
}
}
public void setAccountItemViewListener(AccountViewHolder.AccountItemViewListener accountItemViewListener) {
mAccountItemViewListener = accountItemViewListener;
}
public void setListener(PortfolioAdapterListener listener) {
mPortfolioAdapterListener = listener;
}
@Override
public int getItemViewType(int position) {
return (mDataList.size() == 0) ? VIEW_TYPE_NEW_ACCOUNT_ITEM :
(mDataList.get(position) instanceof Investment) ?
VIEW_TYPE_PORTFOLIO_ITEM : VIEW_TYPE_ACCOUNT_HEADER;
}
@Override
public int getItemCount() {
// ensure that we always have one so we can show the empty view
return (mDataList == null) ? 0 : Math.max(mDataList.size(), 1);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
switch (viewType) {
case VIEW_TYPE_ACCOUNT_HEADER:
viewHolder = new AccountViewHolder(parent, mAccountItemViewListener, mSettings, mViewProvider);
break;
case VIEW_TYPE_PORTFOLIO_ITEM:
viewHolder = new InvestmentViewHolder(parent, mViewProvider);
break;
case VIEW_TYPE_NEW_ACCOUNT_ITEM:
viewHolder = new NewAccountViewHolder(parent, mPortfolioAdapterListener);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof AccountViewHolder) {
AccountViewHolder accountViewHolder = (AccountViewHolder) holder;
final Account account = (Account) mDataList.get(position);
List<Investment> investments = mPortfolioData.getInvestments(account.getId());
PerformanceItem performanceItem = account.getPerformanceItem(investments, new Date());
accountViewHolder.bind(account, performanceItem, mPortfolioData.getOpenOrderCount(account.getId()));
View view = accountViewHolder.itemView;
view.setLongClickable(true);
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
boolean consumed = false;
if (mPortfolioAdapterListener != null) {
consumed = mPortfolioAdapterListener.onLongClickAccount(account);
}
return consumed;
}
});
} else if (holder instanceof InvestmentViewHolder) {
InvestmentViewHolder investmentItemView = (InvestmentViewHolder) holder;
final Investment investment = (Investment) mDataList.get(position);
investmentItemView.bind(investment);
View view = investmentItemView.itemView;
view.setLongClickable(true);
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
boolean consumed = false;
if (mPortfolioAdapterListener != null) {
consumed = mPortfolioAdapterListener.onLongClickInvestment(investment);
}
return consumed;
}
});
}
}
private static class NewAccountViewHolder extends RecyclerView.ViewHolder {
NewAccountViewHolder(ViewGroup parent, final PortfolioAdapterListener listener) {
super(LayoutInflater.from(parent.getContext()).inflate(R.layout.portfolio_view_holder_empty, parent, false));
itemView.findViewById(R.id.portfolio_view_holder_empty_create)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.createNewAccount();
}
}
});
itemView.findViewById(R.id.portfolio_view_holder_empty_dogs)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.createNewDogsAccount();
}
}
});
}
}
}