Update registration UI.

This commit is contained in:
Greyson Parrelli
2019-02-13 11:52:55 -08:00
parent 6b476876d9
commit bf28e109d3
67 changed files with 1096 additions and 813 deletions

View File

@@ -0,0 +1,89 @@
package org.thoughtcrime.securesms.components;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.thoughtcrime.securesms.R;
public class LabeledEditText extends FrameLayout implements View.OnFocusChangeListener {
private TextView label;
private EditText input;
private View border;
private ViewGroup textContainer;
public LabeledEditText(@NonNull Context context) {
super(context);
init(null);
}
public LabeledEditText(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
private void init(@Nullable AttributeSet attrs) {
inflate(getContext(), R.layout.labeled_edit_text, this);
String labelText = "";
int backgroundColor = Color.BLACK;
int textLayout = R.layout.labeled_edit_text_default;
if (attrs != null) {
TypedArray typedArray = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.LabeledEditText, 0, 0);
labelText = typedArray.getString(R.styleable.LabeledEditText_labeledEditText_label);
backgroundColor = typedArray.getColor(R.styleable.LabeledEditText_labeledEditText_background, Color.BLACK);
textLayout = typedArray.getResourceId(R.styleable.LabeledEditText_labeledEditText_textLayout, R.layout.labeled_edit_text_default);
typedArray.recycle();
}
label = findViewById(R.id.label);
border = findViewById(R.id.border);
textContainer = findViewById(R.id.text_container);
inflate(getContext(), textLayout, textContainer);
input = findViewById(R.id.input);
label.setText(labelText);
label.setBackgroundColor(backgroundColor);
if (TextUtils.isEmpty(labelText)) {
label.setVisibility(INVISIBLE);
}
input.setOnFocusChangeListener(this);
}
public EditText getInput() {
return input;
}
public void setText(String text) {
input.setText(text);
}
public Editable getText() {
return input.getText();
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
border.setBackgroundResource(hasFocus ? R.drawable.labeled_edit_text_background_active
: R.drawable.labeled_edit_text_background_inactive);
}
}

View File

@@ -9,99 +9,54 @@ import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import org.thoughtcrime.securesms.R;
public class CallMeCountDownView extends RelativeLayout {
public class CallMeCountDownView extends android.support.v7.widget.AppCompatButton {
private ImageView phone;
private TextView callMeText;
private TextView availableInText;
private TextView countDownText;
private int countDown;
private OnClickListener listener;
private int countDown;
public CallMeCountDownView(Context context) {
super(context);
initialize();
}
public CallMeCountDownView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize();
}
public CallMeCountDownView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialize();
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public CallMeCountDownView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initialize();
}
private void initialize() {
inflate(getContext(), R.layout.registration_call_me_view, this);
this.phone = findViewById(R.id.phone_icon);
this.callMeText = findViewById(R.id.call_me_text);
this.availableInText = findViewById(R.id.available_in_text);
this.countDownText = findViewById(R.id.countdown);
}
public void setOnClickListener(@Nullable OnClickListener listener) {
this.listener = listener;
}
public void startCountDown(int countDown) {
setVisibility(View.VISIBLE);
this.phone.setColorFilter(null);
this.phone.setOnClickListener(null);
this.callMeText.setTextColor(getResources().getColor(R.color.grey_700));
this.callMeText.setOnClickListener(null);
this.availableInText.setVisibility(View.VISIBLE);
this.countDownText.setVisibility(View.VISIBLE);
this.countDown = countDown;
updateCountDown();
}
public void setCallEnabled() {
setVisibility(View.VISIBLE);
this.phone.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.signal_primary), PorterDuff.Mode.SRC_IN));
this.callMeText.setTextColor(getResources().getColor(R.color.signal_primary));
this.availableInText.setVisibility(View.GONE);
this.countDownText.setVisibility(View.GONE);
this.phone.setOnClickListener(v -> handlePhoneCallRequest());
this.callMeText.setOnClickListener(v -> handlePhoneCallRequest());
setText(R.string.RegistrationActivity_call);
setEnabled(true);
setAlpha(1.0f);
}
private void updateCountDown() {
if (countDown > 0) {
setEnabled(false);
setAlpha(0.5f);
countDown--;
int minutesRemaining = countDown / 60;
int secondsRemaining = countDown - (minutesRemaining * 60);
countDownText.setText(String.format("%02d:%02d", minutesRemaining, secondsRemaining));
countDownText.postDelayed(this::updateCountDown, 1000);
setText(getResources().getString(R.string.RegistrationActivity_call_me_instead_available_in, minutesRemaining, secondsRemaining));
postDelayed(this::updateCountDown, 1000);
} else if (countDown == 0) {
setCallEnabled();
}
}
private void handlePhoneCallRequest() {
if (listener != null) listener.onClick(this);
}
}

View File

@@ -18,23 +18,20 @@ import android.view.animation.AnimationSet;
import android.view.animation.OvershootInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.ArrayList;
import java.util.List;
public class VerificationCodeView extends FrameLayout {
private final List<View> spaces = new ArrayList<>(6);
private final List<TextView> codes = new ArrayList<>(6);
private final List<View> containers = new ArrayList<>(7);
private final List<View> containers = new ArrayList<>(6);
private OnCodeEnteredListener listener;
private int index = 0;
@@ -68,13 +65,6 @@ public class VerificationCodeView extends FrameLayout {
try {
TextView separator = findViewById(R.id.separator);
this.spaces.add(findViewById(R.id.space_zero));
this.spaces.add(findViewById(R.id.space_one));
this.spaces.add(findViewById(R.id.space_two));
this.spaces.add(findViewById(R.id.space_three));
this.spaces.add(findViewById(R.id.space_four));
this.spaces.add(findViewById(R.id.space_five));
this.codes.add(findViewById(R.id.code_zero));
this.codes.add(findViewById(R.id.code_one));
this.codes.add(findViewById(R.id.code_two));
@@ -85,25 +75,16 @@ public class VerificationCodeView extends FrameLayout {
this.containers.add(findViewById(R.id.container_zero));
this.containers.add(findViewById(R.id.container_one));
this.containers.add(findViewById(R.id.container_two));
this.containers.add(findViewById(R.id.separator_container));
this.containers.add(findViewById(R.id.container_three));
this.containers.add(findViewById(R.id.container_four));
this.containers.add(findViewById(R.id.container_five));
Stream.of(spaces).forEach(view -> view.setBackgroundColor(typedArray.getColor(R.styleable.VerificationCodeView_vcv_inputColor, Color.BLACK)));
Stream.of(spaces).forEach(view -> view.setLayoutParams(new LinearLayout.LayoutParams(typedArray.getDimensionPixelSize(R.styleable.VerificationCodeView_vcv_inputWidth, ViewUtil.dpToPx(context, 20)),
typedArray.getDimensionPixelSize(R.styleable.VerificationCodeView_vcv_inputHeight, ViewUtil.dpToPx(context, 1)))));
Stream.of(codes).forEach(textView -> textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, typedArray.getDimension(R.styleable.VerificationCodeView_vcv_textSize, 30)));
Stream.of(codes).forEach(textView -> textView.setTextColor(typedArray.getColor(R.styleable.VerificationCodeView_vcv_textColor, Color.GRAY)));
Stream.of(containers).forEach(view -> {
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)view.getLayoutParams();
params.setMargins(typedArray.getDimensionPixelSize(R.styleable.VerificationCodeView_vcv_spacing, ViewUtil.dpToPx(context, 5)),
params.topMargin, params.rightMargin, params.bottomMargin);
view.setLayoutParams(params);
});
separator.setTextSize(TypedValue.COMPLEX_UNIT_SP, typedArray.getDimension(R.styleable.VerificationCodeView_vcv_textSize, 30));
separator.setTextColor(typedArray.getColor(R.styleable.VerificationCodeView_vcv_textColor, Color.GRAY));
} finally {
if (typedArray != null) typedArray.recycle();
}
@@ -118,6 +99,9 @@ public class VerificationCodeView extends FrameLayout {
public void append(int value) {
if (index >= codes.size()) return;
setInactive(containers);
setActive(containers.get(index));
TextView codeView = codes.get(index++);
Animation translateIn = new TranslateAnimation(0, 0, codeView.getHeight(), 0);
@@ -146,6 +130,8 @@ public class VerificationCodeView extends FrameLayout {
public void delete() {
if (index <= 0) return;
codes.get(--index).setText("");
setInactive(containers);
setActive(containers.get(index));
}
@MainThread
@@ -154,6 +140,15 @@ public class VerificationCodeView extends FrameLayout {
Stream.of(codes).forEach(code -> code.setText(""));
index = 0;
}
setInactive(containers);
}
private void setInactive(List<View> views) {
Stream.of(views).forEach(c -> c.setBackgroundResource(R.drawable.labeled_edit_text_background_inactive));
}
private void setActive(@NonNull View container) {
container.setBackgroundResource(R.drawable.labeled_edit_text_background_active);
}
public interface OnCodeEnteredListener {