/**
* 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.ui.views;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.EditText;
import com.waz.zclient.ui.R;
import com.waz.zclient.ui.utils.TypefaceUtils;
import java.util.Collections;
import java.util.Set;
import java.util.WeakHashMap;
public class SketchEditText extends EditText {
public Set<SketchEditTextListener> weakListenerSet;
private String customHint;
private int textFontId;
private int hintFontId;
private float regularTextSize;
private float hintTextSize;
private float sketchScale;
private int regularHorizontalPadding;
private int hintHorizontalPadding;
private int regularVerticalPadding;
private int hintVerticalPadding;
private float mediumRegularTextSize;
private float mediumHintTextSize;
private float mediumPaddingSize;
public SketchEditText(Context context, AttributeSet attrs) {
super(context, attrs);
weakListenerSet = Collections.newSetFromMap(
new WeakHashMap<SketchEditTextListener, Boolean>());
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
updateField();
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mediumRegularTextSize = getResources().getDimensionPixelSize(com.waz.zclient.ui.R.dimen.wire__text_size__regular);
mediumHintTextSize = getResources().getDimensionPixelSize(com.waz.zclient.ui.R.dimen.wire__text_size__small);
mediumPaddingSize = getResources().getDimensionPixelSize(R.dimen.wire__padding__regular);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
notifyListeners();
}
public void addListener(SketchEditTextListener listener) {
weakListenerSet.add(listener);
}
public void removeListener(SketchEditTextListener listener) {
weakListenerSet.remove(listener);
}
public void notifyListeners() {
for (SketchEditTextListener listener : weakListenerSet) {
listener.editTextChanged();
}
}
private void updateField() {
int textLength = getText().length();
if (textLength > 0) {
setHint("");
setTypeface(TypefaceUtils.getTypeface(getContext().getString(textFontId)));
setTextSize(TypedValue.COMPLEX_UNIT_PX, regularTextSize);
setPadding(regularHorizontalPadding, regularVerticalPadding, regularHorizontalPadding, regularVerticalPadding);
} else {
setHint(customHint);
setTypeface(TypefaceUtils.getTypeface(getContext().getString(hintFontId)));
setTextSize(TypedValue.COMPLEX_UNIT_PX, hintTextSize);
setPadding(hintHorizontalPadding, hintVerticalPadding, hintHorizontalPadding, hintVerticalPadding);
}
}
public void setCustomHint(String customHint) {
this.customHint = customHint;
if (getText().length() == 0) {
setHint(customHint);
}
}
public void setTextFontId(int textFontId) {
this.textFontId = textFontId;
updateField();
}
public void setHintFontId(int hintFontId) {
this.hintFontId = hintFontId;
updateField();
}
public void setRegularTextSize(float textSize) {
this.regularTextSize = textSize;
updateField();
}
public float getHintTextSize() {
return hintTextSize;
}
public void setHintTextSize(float hintSize) {
this.hintTextSize = hintSize;
updateField();
}
private void setRegularPaddingSize(int horizontal, int vertical) {
this.regularVerticalPadding = vertical;
this.regularHorizontalPadding = horizontal;
updateField();
}
private void setHintPaddingSize(int horizontal, int vertical) {
this.hintVerticalPadding = vertical;
this.hintHorizontalPadding = horizontal;
updateField();
}
public void setSketchScale(float scale) {
sketchScale = scale;
float newRegularSize = mediumRegularTextSize * scale;
setRegularTextSize(newRegularSize);
float newHintSize = mediumHintTextSize * scale;
setHintTextSize(newHintSize);
int newPaddingSize = (int) (mediumPaddingSize * scale);
setRegularPaddingSize(newPaddingSize, newPaddingSize);
float hintVerticalPadding = mediumPaddingSize + (mediumRegularTextSize - mediumHintTextSize) / 2;
int newHintVerticalPadding = (int) (hintVerticalPadding * scale);
setHintPaddingSize(newPaddingSize, newHintVerticalPadding);
}
public float getSketchScale() {
return sketchScale;
}
public interface SketchEditTextListener {
void editTextChanged();
}
}