Yaaic/app/src/main/java/org/yaaic/indicator/ConversationIndicator.java

304 lines
8.1 KiB
Java

/*
Yaaic - Yet Another Android IRC Client
Copyright 2009-2013 Sebastian Kaspari
This file is part of Yaaic.
Yaaic 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.
Yaaic 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 Yaaic. If not, see <http://www.gnu.org/licenses/>.
*/
package org.yaaic.indicator;
import org.yaaic.adapter.ConversationPagerAdapter;
import org.yaaic.indicator.ConversationTitlePageIndicator.IndicatorStyle;
import org.yaaic.irc.IRCService;
import org.yaaic.model.Conversation;
import org.yaaic.model.Server;
import org.yaaic.utils.DisplayUtils;
import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
/**
* A ConversationIndicator is a group of a ConversationTitlePageIndicator in the
* center and two drawables left and right to indicate the state of the items
* that are not displayed by the ConversationTitlePageIndicator.
*
* @author Sebastian Kaspari <sebastian@yaaic.org>
*/
public class ConversationIndicator extends FrameLayout implements OnPageChangeListener {
private Server server;
private ViewPager pager;
private View leftIndicatorView;
private View rightIndicatorView;
private ConversationTitlePageIndicator titleIndicator;
private ConversationStateProvider stateProvider;
/**
* Create a new {@link ConversationIndicator} instance for the given context.
*
* @param context
*/
public ConversationIndicator(Context context) {
super(context);
init();
}
/**
* Create a new {@link ConversationIndicator} instance for the given context
* and attribute set.
*
* @param context
* @param attrs
*/
public ConversationIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
/**
* Initialize the indicator view.
*/
public void init() {
titleIndicator = new ConversationTitlePageIndicator(getContext());
titleIndicator.setLayoutParams(
new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,
Gravity.CENTER
)
);
int indicatorWidth = DisplayUtils.convertToPixels(getContext(), 5);
int indicatorHeight = DisplayUtils.convertToPixels(getContext(), 5);
leftIndicatorView = new View(getContext());
leftIndicatorView.setLayoutParams(
new LayoutParams(
indicatorWidth,
indicatorHeight,
Gravity.LEFT | Gravity.BOTTOM
)
);
leftIndicatorView.setVisibility(View.INVISIBLE);
rightIndicatorView = new View(getContext());
rightIndicatorView.setLayoutParams(
new LayoutParams(
indicatorWidth,
indicatorHeight,
Gravity.RIGHT | Gravity.BOTTOM
)
);
rightIndicatorView.setVisibility(View.INVISIBLE);
addView(leftIndicatorView);
addView(rightIndicatorView);
addView(titleIndicator);
}
/**
* Set the {@link Server} this indicator is used for.
*
* @param server
*/
public void setServer(Server server) {
this.server = server;
}
/**
* Set typeface of title indicator.
*
* @param typeface
*/
public void setTypeface(Typeface typeface)
{
titleIndicator.setTypeface(typeface);
}
/**
* Set the {@link ViewPager} this indicator is used for.
*
* @param pager
*/
public void setViewPager(ViewPager pager)
{
this.pager = pager;
titleIndicator.setViewPager(pager);
titleIndicator.setOnPageChangeListener(this);
stateProvider = (ConversationStateProvider) pager.getAdapter();
}
/**
* Set the color of the footer line.
*
* @param footerColor
*/
public void setFooterColor(int footerColor)
{
titleIndicator.setFooterColor(footerColor);
}
/**
* Set the height of the footer line.
*
* @param footerLineHeight
*/
public void setFooterLineHeight(float footerLineHeight)
{
titleIndicator.setFooterLineHeight(footerLineHeight);
}
/**
* Set the height of the footer indicator.
*
* @param footerTriangleHeight
*/
public void setFooterIndicatorHeight(float footerTriangleHeight)
{
titleIndicator.setFooterIndicatorHeight(footerTriangleHeight);
}
/**
* Set the style of the footer indicator.
*
* @param indicatorStyle
*/
public void setFooterIndicatorStyle(IndicatorStyle indicatorStyle)
{
titleIndicator.setFooterIndicatorStyle(indicatorStyle);
}
/**
* Set wether selected items should be displayed as bold text.
*
* @param selectedBold
*/
public void setSelectedBold(boolean selectedBold)
{
titleIndicator.setSelectedBold(selectedBold);
}
/**
* Set the text color of a selected item.
*
* @param selectedColor
*/
public void setSelectedColor(int selectedColor)
{
titleIndicator.setSelectedColor(selectedColor);
}
/**
* Set the text size for the title indicator.
*
* @param textSize
*/
public void setTextSize(float textSize)
{
titleIndicator.setTextSize(textSize);
}
/**
* On page selected: Update states of the indicators.
*/
@Override
public void onPageSelected(int page)
{
updateStateColors();
}
/**
* Update the colors of the state indicators.
*/
public void updateStateColors() {
int page = pager.getCurrentItem();
ConversationPagerAdapter adapter = (ConversationPagerAdapter) pager.getAdapter();
Conversation conversation = adapter.getItem(page);
Conversation previousConversation = server.getConversation(server.getSelectedConversation());
if (previousConversation != null) {
previousConversation.setStatus(Conversation.STATUS_DEFAULT);
}
if (conversation.getNewMentions() > 0) {
Context context = pager.getContext();
Intent intent = new Intent(context, IRCService.class);
intent.setAction(IRCService.ACTION_ACK_NEW_MENTIONS);
intent.putExtra(IRCService.EXTRA_ACK_SERVERID, server.getId());
intent.putExtra(IRCService.EXTRA_ACK_CONVTITLE, conversation.getName());
context.startService(intent);
}
conversation.setStatus(Conversation.STATUS_SELECTED);
server.setSelectedConversation(conversation.getName());
if (page - 2 >= 0) {
int color = stateProvider.getColorForLowerThan(page - 1);
leftIndicatorView.setBackgroundColor(color);
leftIndicatorView.setVisibility(
color == ConversationPagerAdapter.COLOR_NONE ? View.INVISIBLE : View.VISIBLE
);
} else {
leftIndicatorView.setVisibility(View.INVISIBLE);
}
if (page + 2 < adapter.getCount()) {
int color = stateProvider.getColorForGreaterThan(page + 1);
rightIndicatorView.setBackgroundColor(color);
rightIndicatorView.setVisibility(
color == ConversationPagerAdapter.COLOR_NONE ? View.INVISIBLE : View.VISIBLE
);
} else {
rightIndicatorView.setVisibility(View.INVISIBLE);
}
titleIndicator.invalidate();
}
/**
* On scroll state of page changed.
*/
@Override
public void onPageScrollStateChanged(int page)
{
// Not used.
}
/**
* On page scrolled.
*/
@Override
public void onPageScrolled(int arg0, float arg1, int arg2)
{
// Not used.
}
}