/*
* Copyright 2015. Appsi Mobile
*
* 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 com.appsimobile.appsii.module.search;
import android.content.res.Resources;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.appsimobile.appsii.R;
import com.appsimobile.appsii.module.BaseContactInfo;
import com.appsimobile.appsii.module.apps.AppEntry;
import com.appsimobile.appsii.module.people.ContactView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by nick on 18/02/15.
*/
class SearchAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements
OnShowAllClickedListener {
static final int TYPE_APP_SUMMARY = 0;
static final int TYPE_PEOPLE_SUMMARY = 1;
static final int TYPE_APP = 2;
static final int TYPE_PERSON = 3;
final ArrayList<Object> mItems = new ArrayList<>(12);
final OnAppClickedListener mOnAppClickedListener;
final OnPersonClickedListener mOnPersonClickedListener;
final ContactView.PeopleActionListener mPeopleActionListener;
final ArrayList<BaseContactInfo> mContactInfos = new ArrayList<>(12);
final ArrayList<AppEntry> mApps = new ArrayList<>(12);
boolean mShowPlainApps;
boolean mShowPlainContacts;
int mSpanCount;
final GridLayoutManager.SpanSizeLookup mSpanSizeLookup =
new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return SearchAdapter.this.getSpanSize(position);
}
};
SearchAdapter(OnAppClickedListener onAppClickedListener,
OnPersonClickedListener onPersonClickedListener,
ContactView.PeopleActionListener peopleActionListener) {
mOnAppClickedListener = onAppClickedListener;
mOnPersonClickedListener = onPersonClickedListener;
mPeopleActionListener = peopleActionListener;
setHasStableIds(true);
}
int getSpanSize(int position) {
Object item = mItems.get(position);
if (item == mApps) {
return mSpanCount;
} else if (item == mContactInfos) {
return mSpanCount;
} else {
return 1;
}
}
public void setSpanCount(int spanCount) {
mSpanCount = spanCount;
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case TYPE_APP_SUMMARY:
return onCreateAppsSummaryViewHolder(parent, layoutInflater);
case TYPE_PEOPLE_SUMMARY:
return onCreatePeopleSummaryViewHolder(parent, layoutInflater);
case TYPE_PERSON:
return onCreatePersonViewHolder(parent, layoutInflater);
case TYPE_APP:
return onCreateAppViewHolder(parent, layoutInflater);
default:
throw new IllegalArgumentException("Invalid viewtype: " + viewType);
}
}
private AppItemTileViewHolder onCreateAppsSummaryViewHolder(
ViewGroup parent, LayoutInflater layoutInflater) {
View view = layoutInflater.inflate(
R.layout.list_item_search_result_tile, parent, false);
return new AppItemTileViewHolder(view, TYPE_APP_SUMMARY, this, mOnAppClickedListener);
}
private ContactItemTileViewHolder onCreatePeopleSummaryViewHolder(
ViewGroup parent, LayoutInflater layoutInflater) {
View view = layoutInflater.inflate(
R.layout.list_item_search_result_tile, parent, false);
return new ContactItemTileViewHolder(view, TYPE_PEOPLE_SUMMARY, this,
mOnPersonClickedListener, mPeopleActionListener);
}
private PeopleViewHolder onCreatePersonViewHolder(
ViewGroup parent, LayoutInflater layoutInflater) {
View view = layoutInflater.inflate(
R.layout.grid_item_people_tile_search, parent, false);
return new PeopleViewHolder(view, mOnPersonClickedListener, mPeopleActionListener);
}
private AppsViewHolder onCreateAppViewHolder(
ViewGroup parent, LayoutInflater layoutInflater) {
View view = layoutInflater.inflate(
R.layout.grid_item_app_tile, parent, false);
return new AppsViewHolder(view, mOnAppClickedListener);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof AppItemTileViewHolder) {
onBindItemTileViewHolder((AppItemTileViewHolder) holder, position);
} else if (holder instanceof ContactItemTileViewHolder) {
onBindItemTileViewHolder((ContactItemTileViewHolder) holder, position);
} else if (holder instanceof AppsViewHolder) {
((AppsViewHolder) holder).bind((AppEntry) mItems.get(position));
} else if (holder instanceof PeopleViewHolder) {
((PeopleViewHolder) holder).bind((BaseContactInfo) mItems.get(position));
}
}
@Override
public int getItemViewType(int position) {
Object item = mItems.get(position);
if (item == mApps) {
return TYPE_APP_SUMMARY;
} else if (item == mContactInfos) {
return TYPE_PEOPLE_SUMMARY;
} else if (item instanceof AppEntry) {
return TYPE_APP;
} else {
return TYPE_PERSON;
}
}
@Override
public long getItemId(int position) {
Object item = mItems.get(position);
if (item == mContactInfos) {
return 14324;
} else if (item == mApps) {
return 14334;
} else if (item instanceof AppEntry) {
return ((AppEntry) item).getComponentName().hashCode();
} else {
return ((BaseContactInfo) item).mContactId;
}
}
@Override
public int getItemCount() {
return mItems.size();
}
public void onBindItemTileViewHolder(AppItemTileViewHolder holder, int position) {
ArrayList<AppEntry> o = (ArrayList<AppEntry>) mItems.get(position);
Resources res = holder.itemView.getResources();
String title = res.getQuantityString(R.plurals.search_app_count, o.size(), o.size());
holder.bindResults(title, o);
}
public void onBindItemTileViewHolder(ContactItemTileViewHolder holder, int position) {
ArrayList<BaseContactInfo> o = (ArrayList<BaseContactInfo>) mItems.get(position);
Resources res = holder.itemView.getResources();
String title = res.getQuantityString(R.plurals.search_people_count, o.size(), o.size());
holder.bindResults(title, o);
}
public void clear() {
mItems.clear();
mShowPlainContacts = false;
mShowPlainApps = false;
notifyDataSetChanged();
}
public void setPeopleInfos(List<? extends BaseContactInfo> contactInfos) {
mContactInfos.clear();
mContactInfos.addAll(contactInfos);
rebuildItemList();
notifyDataSetChanged();
}
private void rebuildItemList() {
mItems.clear();
if (!mApps.isEmpty()) {
if (mShowPlainApps || mApps.size() <= 6) {
mItems.addAll(mApps);
} else {
mItems.add(mApps);
}
}
if (!mContactInfos.isEmpty()) {
if (mShowPlainContacts || mContactInfos.size() <= 6) {
mItems.addAll(mContactInfos);
} else {
mItems.add(mContactInfos);
}
}
}
public void setApps(List<AppEntry> apps) {
mApps.clear();
if (apps != null) {
// this may be null. Probably in case it failed to load the list
// of apps for some reason
mApps.addAll(apps);
}
rebuildItemList();
notifyDataSetChanged();
}
@Override
public void onShowAllPeopleClicked(int id, ContactItemTileViewHolder holder) {
mShowPlainContacts = true;
int position = holder.getPosition();
List<?> items = (List<?>) mItems.remove(position);
mItems.addAll(position, items);
notifyDataSetChanged();
}
@Override
public void onShowAllAppsClicked(int id, AppItemTileViewHolder holder) {
mShowPlainApps = true;
int position = holder.getPosition();
List<?> items = (List<?>) mItems.remove(position);
mItems.addAll(position, items);
notifyDataSetChanged();
}
}