package org.commcare.adapters;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import org.commcare.activities.StandardHomeActivity;
import org.commcare.activities.HomeButtons;
import org.commcare.dalvik.R;
import org.commcare.views.CustomBanner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;
/**
* Shows home screen buttons and header banner
*
* @author Phillip Mates (pmates@dimagi.com)
*/
public class HomeScreenAdapter
extends SquareButtonAdapter {
private final HomeCardDisplayData[] buttonData;
private static final int TYPE_HEADER = 1;
private final int screenHeight, screenWidth;
private final int syncButtonPosition;
private final HashMap<Integer, String> messagePayload = new HashMap<>();
public HomeScreenAdapter(StandardHomeActivity activity,
Vector<String> buttonsToHide,
boolean isDemoUser) {
super(activity);
buttonData = HomeButtons.buildButtonData(activity, buttonsToHide, isDemoUser);
syncButtonPosition = calcSyncButtonPos();
// get screen dimensions for drawing custom header image
DisplayMetrics displaymetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
screenHeight = displaymetrics.heightPixels;
screenWidth = displaymetrics.widthPixels;
}
private int calcSyncButtonPos() {
for (int i = 0; i < buttonData.length; i++) {
if (buttonData[i].imageResource == R.drawable.home_sync) {
// pos in button array plus initial custom header
return i + 1;
}
}
return -1;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View header = inflater.inflate(R.layout.grid_header_top_banner, parent, false);
return new HeaderViewHolder(header);
} else {
return super.onCreateViewHolder(parent, viewType);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int i, List<Object> payload) {
if (holder instanceof HeaderViewHolder) {
bindHeader((HeaderViewHolder)holder);
} else {
if (payload == null || payload.isEmpty()) {
payload = new ArrayList<>();
payload.add(messagePayload.remove(i));
}
super.onBindViewHolder(holder, i, payload);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) {
if (holder instanceof HeaderViewHolder) {
bindHeader((HeaderViewHolder)holder);
} else {
ArrayList<Object> payload = new ArrayList<>();
payload.add(messagePayload.remove(i));
super.onBindViewHolder(holder, i, payload);
}
}
@Override
protected HomeCardDisplayData getItem(int position) {
return buttonData[position - 1];
}
private void bindHeader(HeaderViewHolder headerHolder) {
StaggeredGridLayoutManager.LayoutParams layoutParams =
(StaggeredGridLayoutManager.LayoutParams)headerHolder.itemView.getLayoutParams();
layoutParams.setFullSpan(true);
boolean noCustomBanner =
!CustomBanner.useCustomBanner(context, screenHeight,
screenWidth, headerHolder.headerImage);
if (noCustomBanner) {
headerHolder.headerImage.setImageResource(R.drawable.commcare_logo);
}
}
@Override
public int getItemCount() {
// buttons and header
return buttonData.length + 1;
}
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position)) {
return TYPE_HEADER;
} else {
return super.getItemViewType(position);
}
}
private boolean isPositionHeader(int position) {
return position == 0;
}
public int getSyncButtonPosition() {
return syncButtonPosition;
}
public void setMessagePayload(int position, String message) {
messagePayload.put(position, message);
}
private static class HeaderViewHolder extends RecyclerView.ViewHolder {
public final ImageView headerImage;
public HeaderViewHolder(View itemView) {
super(itemView);
headerImage = (ImageView)itemView.findViewById(R.id.main_top_banner);
}
}
}