package com.novoda.bonfire.channel.view; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; import android.support.design.widget.FloatingActionButton; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import com.novoda.bonfire.R; import com.novoda.bonfire.channel.data.model.Channels; import com.novoda.bonfire.channel.displayer.ChannelsDisplayer; import com.novoda.notils.caster.Views; public class ChannelsView extends LinearLayout implements ChannelsDisplayer { private final ChannelsAdapter channelsAdapter; private FloatingActionButton newChannelFab; private Toolbar toolbar; private ChannelsInteractionListener channelsInteractionListener; public ChannelsView(Context context, AttributeSet attrs) { super(context, attrs); channelsAdapter = new ChannelsAdapter(LayoutInflater.from(context)); setOrientation(VERTICAL); } @Override protected void onFinishInflate() { super.onFinishInflate(); View.inflate(getContext(), R.layout.merge_channels_view, this); RecyclerView channels = Views.findById(this, R.id.channels); channels.addItemDecoration(new ChannelItemDecoration()); channels.setAdapter(channelsAdapter); newChannelFab = Views.findById(this, R.id.new_channel_fab); toolbar = Views.findById(this, R.id.toolbar); toolbar.setTitle(R.string.app_name); toolbar.inflateMenu(R.menu.channels_menu); } private int getSpanCount() { return getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? 2 : 4; } @Override public void display(Channels channels) { channelsAdapter.update(channels); } @Override public void attach(ChannelsInteractionListener channelsInteractionListener) { this.channelsInteractionListener = channelsInteractionListener; channelsAdapter.attach(channelsInteractionListener); newChannelFab.setOnClickListener(fabClickListener); toolbar.setOnMenuItemClickListener(menuItemClickListener); } @Override public void detach(ChannelsInteractionListener channelsInteractionListener) { channelsAdapter.detach(channelsInteractionListener); newChannelFab.setOnClickListener(null); toolbar.setOnMenuItemClickListener(null); this.channelsInteractionListener = null; } private Toolbar.OnMenuItemClickListener menuItemClickListener = new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == R.id.actionInvite) { channelsInteractionListener.onInviteUsersClicked(); return true; } return false; } }; private final OnClickListener fabClickListener = new OnClickListener() { @Override public void onClick(View v) { channelsInteractionListener.onAddNewChannel(); } }; private class ChannelItemDecoration extends RecyclerView.ItemDecoration { private final int itemPaddingInPixel = getResources().getDimensionPixelOffset(R.dimen.channel_item_padding); private final int gridPaddingInPixel = getResources().getDimensionPixelOffset(R.dimen.channel_grid_padding); @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.top = itemPaddingInPixel; outRect.bottom = itemPaddingInPixel; outRect.left = itemPaddingInPixel; outRect.right = itemPaddingInPixel; int position = parent.getChildAdapterPosition(view); int spanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount(); if (isTopRow(position, spanCount)) { outRect.top += gridPaddingInPixel; } else if (isBottomRow(parent, position, spanCount)) { outRect.bottom += gridPaddingInPixel; } if (isLeftEdge(position, spanCount)) { outRect.left += gridPaddingInPixel; } else if (isRightEdge(position, spanCount)) { outRect.right += gridPaddingInPixel; } } private boolean isTopRow(int position, int spanCount) { return position < spanCount; } private boolean isBottomRow(RecyclerView parent, int position, int spanCount) { return position >= parent.getAdapter().getItemCount() - spanCount; } private boolean isLeftEdge(int position, int spanCount) { return (position % spanCount) == 0; } private boolean isRightEdge(int position, int spanCount) { return (position % spanCount) == (spanCount - 1); } } }