package com.novoda.bonfire.channel.view;
import android.content.Context;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Switch;
import com.novoda.bonfire.R;
import com.novoda.bonfire.channel.displayer.NewChannelDisplayer;
import com.novoda.notils.caster.Views;
public class NewChannelView extends LinearLayout implements NewChannelDisplayer {
private ChannelCreationListener channelCreationListener;
private EditText newChannelName;
private Switch privateChannelSwitch;
private Toolbar toolbar;
public NewChannelView(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(VERTICAL);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
View.inflate(getContext(), R.layout.merge_new_channel_view, this);
newChannelName = Views.findById(this, R.id.new_channel_name);
privateChannelSwitch = Views.findById(this, R.id.private_channel_switch);
setupToolbar();
}
private void setupToolbar() {
toolbar = Views.findById(this, R.id.toolbar);
toolbar.setTitle(R.string.createChannel);
toolbar.inflateMenu(R.menu.new_channel_menu);
toolbar.setNavigationIcon(R.drawable.ic_clear_white);
}
@Override
public void attach(final ChannelCreationListener channelCreationListener) {
this.channelCreationListener = channelCreationListener;
newChannelName.addTextChangedListener(channelNameTextWatcher);
toolbar.setOnMenuItemClickListener(menuItemClickListener);
toolbar.setNavigationOnClickListener(navigationOnClickListener);
getCreateItem().setEnabled(false);
}
private MenuItem getCreateItem() {
return toolbar.getMenu().findItem(R.id.actionCreate);
}
@Override
public void detach(ChannelCreationListener channelCreationListener) {
newChannelName.removeTextChangedListener(channelNameTextWatcher);
privateChannelSwitch.setOnCheckedChangeListener(null);
toolbar.setOnMenuItemClickListener(null);
toolbar.setNavigationOnClickListener(null);
this.channelCreationListener = null;
}
@Override
public void showChannelCreationError() {
setChannelNameError(R.string.channel_cannot_be_created);
}
private void setChannelNameError(int stringId) {
newChannelName.setError(getContext().getString(stringId));
}
private final TextWatcher channelNameTextWatcher = new TextWatcher() {
private boolean isValidInput;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
isValidInput = inputWasEmpty(start, before) && sequenceIsValidEmoji(s, start, count)
|| characterRemoved(count) && sequenceIsValidEmoji(s, 0, start);
}
private boolean inputWasEmpty(int start, int before) {
return start == 0 && before == 0;
}
private boolean characterRemoved(int count) {
return count == 0;
}
private boolean sequenceIsValidEmoji(CharSequence sequence, int start, int count) {
boolean isSequenceValid = true;
for (int i = start; i < (start + count); i++) {
char character = sequence.charAt(i);
isSequenceValid = isSequenceValid && isEmojiComponent(character);
}
return isSequenceValid;
}
private boolean isEmojiComponent(char c) {
int type = Character.getType(c);
return type == Character.NON_SPACING_MARK || type == Character.SURROGATE || type == Character.OTHER_SYMBOL;
}
@Override
public void afterTextChanged(Editable s) {
getCreateItem().setEnabled(s.length() > 0 && isValidInput);
if (!isValidInput) {
setChannelNameError(R.string.only_single_emoji_allowed);
}
}
};
private final Toolbar.OnMenuItemClickListener menuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.actionCreate) {
channelCreationListener.onCreateChannelClicked(newChannelName.getText().toString(), privateChannelSwitch.isChecked());
return true;
} else {
return false;
}
}
};
private final OnClickListener navigationOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
channelCreationListener.onCancel();
}
};
}