/**
* Wire
* Copyright (C) 2016 Wire Swiss GmbH
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.waz.zclient.pages.main.conversationlist.views.row;
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.waz.api.IConversation;
import com.waz.zclient.R;
import com.waz.zclient.core.stores.connect.InboxLinkConversation;
import com.waz.zclient.core.stores.inappnotification.KnockingEvent;
import com.waz.zclient.pages.main.conversation.ConversationUtils;
import com.waz.zclient.ui.animation.interpolators.penner.Quart;
import com.waz.zclient.ui.text.GlyphTextView;
import com.waz.zclient.utils.ViewUtils;
public class LeftIndicatorView extends FrameLayout {
private GlyphTextView callIndicator;
private GlyphTextView pingIndicator;
private ConversationIndicatorView conversationIndicatorView;
private View currentVisibleIndicator = null;
public LeftIndicatorView(Context context, int accentColor) {
super(context);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT);
layoutParams.gravity = Gravity.LEFT;
setLayoutParams(layoutParams);
LayoutInflater.from(getContext()).inflate(R.layout.conv_list_item_unread, this, true);
conversationIndicatorView = ViewUtils.getView(this, R.id.civ__list_row);
callIndicator = ViewUtils.getView(this, R.id.gtv__list__call_indicator);
pingIndicator = ViewUtils.getView(this, R.id.gtv__list__ping);
ViewUtils.setPaddingTop(this, getResources().getDimensionPixelSize(R.dimen.calling__conversation_list__margin_top));
setAccentColor(accentColor);
}
/**
* The color of the circles.
*/
public void setAccentColor(int accentColor) {
conversationIndicatorView.setAccentColor(accentColor);
}
/**
* Binds the conversation to this view.
*/
public void setConversation(final IConversation conversation) {
conversationIndicatorView.setVisibility(View.GONE);
callIndicator.setVisibility(GONE);
pingIndicator.setVisibility(GONE);
if (conversation.hasUnjoinedCall()) {
callIndicator.setVisibility(VISIBLE);
callIndicator.setText(getContext().getString(R.string.glyph__call));
callIndicator.setTextColor(ContextCompat.getColor(getContext(), R.color.accent_green));
return;
}
if (conversation.hasMissedCall()) {
callIndicator.setVisibility(VISIBLE);
callIndicator.setText(getContext().getString(R.string.glyph__end_call));
callIndicator.setTextColor(ContextCompat.getColor(getContext(), R.color.accent_red));
return;
}
conversationIndicatorView.setVisibility(View.VISIBLE);
// Outlined indicator for link to connect inbox or outgoing pending connect request
if (conversation instanceof InboxLinkConversation || conversation.getType() == IConversation.Type.WAIT_FOR_CONNECTION && !conversation.isArchived()) {
conversationIndicatorView.setState(ConversationIndicatorView.State.PENDING);
return;
}
if (conversation.getFailedCount() > 0) {
conversationIndicatorView.setState(ConversationIndicatorView.State.UNSENT);
return;
}
conversationIndicatorView.setState(ConversationIndicatorView.State.UNREAD);
// show unread
int radius = ConversationUtils.getListUnreadIndicatorRadiusPx(getContext(), conversation.getUnreadCount());
conversationIndicatorView.setUnreadSize(radius);
invalidate();
}
/**
* knocking event occured. Fade out unread and pulser and start knocking animation.
* Afterwards bring the view back into its original state.
*/
public void knock(KnockingEvent knockingEvent) {
if (callIndicator.getVisibility() == VISIBLE) {
currentVisibleIndicator = callIndicator;
} else {
currentVisibleIndicator = conversationIndicatorView;
}
currentVisibleIndicator.animate()
.alpha(0)
.setInterpolator(new Quart.EaseOut())
.setDuration(getResources().getInteger(R.integer.list_hello_indicator_fade_in_out_animation_duration))
.withEndAction(new Runnable() {
@Override
public void run() {
showPing();
}
});
pingIndicator.setTextColor(knockingEvent.getColor());
}
private void showPing() {
pingIndicator.setAlpha(0);
pingIndicator.setVisibility(VISIBLE);
pingIndicator.animate().alpha(1)
.setInterpolator(new Quart.EaseOut())
.setDuration(getResources().getInteger(R.integer.list_hello_indicator_fade_in_out_animation_duration))
.withEndAction(
new Runnable() {
@Override
public void run() {
hidePing();
}
});
}
private void hidePing() {
pingIndicator.animate().alpha(0)
.setInterpolator(new Quart.EaseIn())
.setDuration(getResources().getInteger(R.integer.list_hello_indicator_fade_in_out_animation_duration))
.withEndAction(
new Runnable() {
@Override
public void run() {
resetAfterKnocking();
}
});
}
/**
* After knocking event has occured, bring the view back to its original state.
*/
private void resetAfterKnocking() {
currentVisibleIndicator.animate().alpha(1).setInterpolator(new Quart.EaseOut()).setDuration(getResources().getInteger(R.integer.list_hello_indicator_fade_in_out_animation_duration));
pingIndicator.setVisibility(GONE);
}
}