/*
* Copyright(c) 2017 lizhaotailang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.github.marktony.espresso.mvp.search;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.support.v7.widget.AppCompatTextView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import de.hdodenhof.circleimageview.CircleImageView;
import io.github.marktony.espresso.R;
import io.github.marktony.espresso.data.Company;
import io.github.marktony.espresso.data.Package;
import io.github.marktony.espresso.interfaze.OnRecyclerViewItemClickListener;
/**
* Created by lizhaotailang on 2017/3/26.
*/
public class SearchResultsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@NonNull
private final Context context;
@NonNull
private LayoutInflater inflater;
private List<Package> packages;
private List<Company> companies;
private List<ItemWrapper> list;
private String[] packageStatus;
private OnRecyclerViewItemClickListener listener;
public SearchResultsAdapter(@NonNull Context context,
@NonNull List<Package> packages,
@NonNull List<Company> companies) {
this.context = context;
this.inflater = LayoutInflater.from(context);
this.packages = packages;
this.companies = companies;
packageStatus = context.getResources().getStringArray(R.array.package_status);
this.list = new ArrayList<>();
this.list.add(new ItemWrapper(ItemWrapper.TYPE_CATEGORY));
if (packages.size() > 0) {
for (int i = 0; i < packages.size(); i++) {
ItemWrapper wrapper = new ItemWrapper(ItemWrapper.TYPE_PACKAGE);
wrapper.index = i;
list.add(wrapper);
}
} else {
list.add(new ItemWrapper(ItemWrapper.TYPE_EMPTY));
}
this.list.add(new ItemWrapper(ItemWrapper.TYPE_CATEGORY));
if (companies.size() > 0) {
for (int i = 0; i < companies.size(); i++) {
ItemWrapper wrapper = new ItemWrapper(ItemWrapper.TYPE_COMPANY);
wrapper.index = i;
list.add(wrapper);
}
} else {
list.add(new ItemWrapper(ItemWrapper.TYPE_EMPTY));
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
switch (viewType) {
case ItemWrapper.TYPE_EMPTY:
viewHolder = new EmptyHolder(inflater.inflate(R.layout.item_search_result_empty, parent, false));
break;
case ItemWrapper.TYPE_CATEGORY:
viewHolder = new ResultCategoryHolder(inflater.inflate(R.layout.item_search_result_category, parent, false));
break;
case ItemWrapper.TYPE_PACKAGE:
viewHolder = new PackageHolder(inflater.inflate(R.layout.item_package, parent, false), listener);
break;
case ItemWrapper.TYPE_COMPANY:
viewHolder = new CompanyHolder(inflater.inflate(R.layout.item_company, parent, false), listener);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ItemWrapper iw = list.get(position);
switch (iw.viewType) {
case ItemWrapper.TYPE_EMPTY:
EmptyHolder emptyHolder = (EmptyHolder) holder;
emptyHolder.textView.setText(
(position == 1 ? packages == null : companies == null) ?
R.string.item_loading :
R.string.no_result);
break;
case ItemWrapper.TYPE_CATEGORY:
ResultCategoryHolder categoryHolder = (ResultCategoryHolder) holder;
categoryHolder.textView.setText(position > 0 ? R.string.search_label_company : R.string.search_label_package);
break;
case ItemWrapper.TYPE_PACKAGE:
PackageHolder packageHolder = (PackageHolder) holder;
Package pkg = packages.get(iw.index);
if (pkg.getData() != null && pkg.getData().size() > 0) {
int state = Integer.parseInt(pkg.getState());
packageHolder.textViewStatus.setText(String.valueOf(packageStatus[state]) + " - " + pkg.getData().get(0).getContext());
packageHolder.textViewTime.setText(pkg.getData().get(0).getTime());
} else {
packageHolder.textViewTime.setText("");
packageHolder.textViewStatus.setText(R.string.get_status_error);
}
if (pkg.isReadable()) {
packageHolder.textViewPackageName.setTypeface(null, Typeface.BOLD);
packageHolder.textViewTime.setTypeface(null, Typeface.BOLD);
packageHolder.textViewStatus.setTypeface(null, Typeface.BOLD);
} else {
packageHolder.textViewPackageName.setTypeface(null, Typeface.NORMAL);
packageHolder.textViewTime.setTypeface(null, Typeface.NORMAL);
packageHolder.textViewStatus.setTypeface(null, Typeface.NORMAL);
}
packageHolder.textViewPackageName.setText(pkg.getName());
packageHolder.textViewAvatar.setText(pkg.getName().substring(0,1));
packageHolder.avatar.setImageResource(pkg.getColorAvatar());
break;
case ItemWrapper.TYPE_COMPANY:
Company company = companies.get(iw.index);
CompanyHolder companyHolder = (CompanyHolder) holder;
companyHolder.textViewAvatar.setText(company.getName().substring(0, 1).toUpperCase());
companyHolder.textViewCompanyTel.setText(company.getTel());
companyHolder.textViewCompanyName.setText(company.getName());
companyHolder.avatar.setColorFilter(Color.parseColor(company.getAvatarColor()));
break;
}
}
@Override
public int getItemCount() {
return list != null ? list.size() : 0;
}
@Override
public int getItemViewType(int position) {
return list.get(position).viewType;
}
public void updateData(List<Package> packages, List<Company> companies) {
this.packages.clear();
this.companies.clear();
this.list.clear();
this.list.add(new ItemWrapper(ItemWrapper.TYPE_CATEGORY));
if (packages.size() > 0) {
for (int i = 0; i < packages.size(); i++) {
ItemWrapper wrapper = new ItemWrapper(ItemWrapper.TYPE_PACKAGE);
wrapper.index = i;
list.add(wrapper);
this.packages.add(packages.get(i));
}
} else {
list.add(new ItemWrapper(ItemWrapper.TYPE_EMPTY));
}
this.list.add(new ItemWrapper(ItemWrapper.TYPE_CATEGORY));
if (companies.size() > 0) {
for (int i = 0; i < companies.size(); i++) {
ItemWrapper wrapper = new ItemWrapper(ItemWrapper.TYPE_COMPANY);
wrapper.index = i;
list.add(wrapper);
this.companies.add(companies.get(i));
}
} else {
list.add(new ItemWrapper(ItemWrapper.TYPE_EMPTY));
}
notifyDataSetChanged();
}
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
this.listener = listener;
}
public int getOriginalIndex(int position) {
return list.get(position).index;
}
private class PackageHolder extends RecyclerView.ViewHolder
implements View.OnClickListener{
CircleImageView avatar;
AppCompatTextView textViewTime, textViewStatus;
AppCompatTextView textViewPackageName, textViewAvatar;
private OnRecyclerViewItemClickListener listener;
PackageHolder(View itemView, OnRecyclerViewItemClickListener listener) {
super(itemView);
avatar = (CircleImageView) itemView.findViewById(R.id.circleImageView);
textViewPackageName = (AppCompatTextView) itemView.findViewById(R.id.textViewPackageName);
textViewStatus = (AppCompatTextView) itemView.findViewById(R.id.textViewStatus);
textViewTime = (AppCompatTextView) itemView.findViewById(R.id.textViewTime);
textViewAvatar = (AppCompatTextView) itemView.findViewById(R.id.textViewAvatar);
this.listener = listener;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (this.listener != null) {
listener.OnItemClick(v, getLayoutPosition());
}
}
}
private class ResultCategoryHolder extends RecyclerView.ViewHolder {
AppCompatTextView textView;
ResultCategoryHolder(View itemView) {
super(itemView);
textView = (AppCompatTextView) itemView.findViewById(R.id.tv_title);
}
}
private class EmptyHolder extends RecyclerView.ViewHolder {
AppCompatTextView textView;
EmptyHolder(View itemView) {
super(itemView);
textView = (AppCompatTextView) itemView.findViewById(R.id.tv_title);
}
}
private class CompanyHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
CircleImageView avatar;
AppCompatTextView textViewCompanyName, textViewAvatar, textViewCompanyTel;
private OnRecyclerViewItemClickListener listener;
CompanyHolder(View itemView, OnRecyclerViewItemClickListener listener) {
super(itemView);
avatar = (CircleImageView) itemView.findViewById(R.id.imageViewAvatar);
textViewAvatar = (AppCompatTextView) itemView.findViewById(R.id.textViewAvatar);
textViewCompanyName = (AppCompatTextView) itemView.findViewById(R.id.textViewCompanyName);
textViewCompanyTel = (AppCompatTextView) itemView.findViewById(R.id.textViewCompanyTel);
this.listener = listener;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (listener != null) {
listener.OnItemClick(v, getLayoutPosition());
}
}
}
public static class ItemWrapper {
public final static int TYPE_PACKAGE = 0, TYPE_COMPANY = 1, TYPE_CATEGORY = 2, TYPE_EMPTY = 3;
public int viewType;
// Optional
public int index;
public ItemWrapper(int viewType) {
this.viewType = viewType;
}
}
}