package org.wikipedia.descriptions; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.design.widget.TextInputLayout; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.util.AttributeSet; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import org.apache.commons.lang3.StringUtils; import org.wikipedia.R; import org.wikipedia.page.PageTitle; import org.wikipedia.util.FeedbackUtil; import org.wikipedia.util.StringUtil; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.OnEditorAction; import butterknife.OnTextChanged; public class DescriptionEditView extends LinearLayout { @BindView(R.id.view_description_edit_header) TextView headerText; @BindView(R.id.view_description_edit_page_title) TextView pageTitleText; @BindView(R.id.view_description_edit_license_text) TextView licenseText; @BindView(R.id.view_description_edit_save_button) View saveButton; @BindView(R.id.view_description_edit_cancel_button) View cancelButton; @BindView(R.id.view_description_edit_help_button) View helpButton; @BindView(R.id.view_description_edit_text) EditText pageDescriptionText; @BindView(R.id.view_description_edit_text_layout) TextInputLayout pageDescriptionLayout; @BindView(R.id.view_description_edit_progress_bar) ProgressBar progressBar; @Nullable private String originalDescription; @Nullable private Callback callback; public interface Callback { void onSaveClick(); void onHelpClick(); void onCancelClick(); } public DescriptionEditView(Context context) { super(context); init(); } public DescriptionEditView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DescriptionEditView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public DescriptionEditView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } public void setCallback(@Nullable Callback callback) { this.callback = callback; } public void setPageTitle(@NonNull PageTitle pageTitle) { setTitle(pageTitle.getDisplayText()); originalDescription = pageTitle.getDescription(); setDescription(originalDescription); headerText.setText(getContext().getString(TextUtils.isEmpty(originalDescription) ? R.string.description_edit_add_description : R.string.description_edit_edit_description)); } public void setSaveState(boolean saving) { showProgressBar(saving); if (saving) { enableSaveButton(false); } else { updateSaveButtonEnabled(); } } @NonNull public String getDescription() { return pageDescriptionText.getText().toString(); } public void setError(@Nullable CharSequence text) { pageDescriptionLayout.setError(text); } @OnClick(R.id.view_description_edit_save_button) void onSaveClick() { if (callback != null) { callback.onSaveClick(); } } @OnClick(R.id.view_description_edit_help_button) void onHelpClick() { if (callback != null) { callback.onHelpClick(); } } @OnClick(R.id.view_description_edit_cancel_button) void onCancelClick() { if (callback != null) { callback.onCancelClick(); } } @OnTextChanged(value = R.id.view_description_edit_text, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) void pageDescriptionTextChanged() { updateSaveButtonEnabled(); setError(null); } @OnEditorAction(R.id.view_description_edit_text) protected boolean descriptionTextEditorAction(int id) { if (id == EditorInfo.IME_ACTION_DONE) { if (saveButton.isEnabled() && callback != null) { callback.onSaveClick(); } return true; } return false; } @VisibleForTesting void setTitle(@Nullable CharSequence text) { pageTitleText.setText(text); } @VisibleForTesting void setDescription(@Nullable String text) { pageDescriptionText.setText(text); } private void init() { inflate(getContext(), R.layout.view_description_edit, this); ButterKnife.bind(this); licenseText.setText(StringUtil.fromHtml(String .format(getContext().getString(R.string.description_edit_license_notice), getContext().getString(R.string.terms_of_use_url), getContext().getString(R.string.cc_0_url)))); licenseText.setMovementMethod(new LinkMovementMethod()); FeedbackUtil.setToolbarButtonLongPressToast(saveButton, cancelButton, helpButton); setOrientation(VERTICAL); } private void updateSaveButtonEnabled() { if (!TextUtils.isEmpty(pageDescriptionText.getText()) && !StringUtils.equals(originalDescription, pageDescriptionText.getText())) { enableSaveButton(true); } else { enableSaveButton(false); } } private void enableSaveButton(boolean enabled) { final float disabledAlpha = 0.5f; saveButton.setEnabled(enabled); saveButton.setAlpha(enabled ? 1f : disabledAlpha); } private void showProgressBar(boolean show) { progressBar.setVisibility(show ? View.VISIBLE : View.GONE); } }