| /* |
| * Copyright 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.car.settings.common; |
| |
| import android.app.AlertDialog; |
| import android.os.Bundle; |
| import android.text.Editable; |
| import android.text.TextWatcher; |
| import android.view.View; |
| import android.widget.EditText; |
| import android.widget.TextView; |
| |
| import com.android.car.ui.preference.EditTextPreferenceDialogFragment; |
| |
| /** |
| * Adds optional text validation logic to {@link EditTextPreferenceDialogFragment}. Disables |
| * Positive Button and the ability to press Enter to submit the dialog if the input is invalid. |
| * Validator must be provided by {@link ValidatedEditTextPreference} before launching the Dialog |
| * Fragment for it to be attached to its View. |
| */ |
| public class ValidatedEditTextPreferenceDialogFragment extends |
| EditTextPreferenceDialogFragment implements TextView.OnEditorActionListener { |
| |
| private final EditTextWatcher mTextWatcher = new EditTextWatcher(); |
| |
| private ValidatedEditTextPreference.Validator mValidator; |
| private EditText mEditText; |
| |
| /** |
| * Returns a new instance of {@link ValidatedEditTextPreferenceDialogFragment} for the |
| * {@link ValidatedEditTextPreference} with the given {@code key}. |
| */ |
| public static ValidatedEditTextPreferenceDialogFragment newInstance(String key) { |
| ValidatedEditTextPreferenceDialogFragment fragment = |
| new ValidatedEditTextPreferenceDialogFragment(); |
| Bundle b = new Bundle(/* capacity= */ 1); |
| b.putString(ARG_KEY, key); |
| fragment.setArguments(b); |
| return fragment; |
| } |
| |
| @Override |
| protected void onBindDialogView(View view) { |
| super.onBindDialogView(view); |
| mEditText = view.findViewById(android.R.id.edit); |
| if (getPreference() instanceof ValidatedEditTextPreference) { |
| ValidatedEditTextPreference.Validator validator = |
| ((ValidatedEditTextPreference) getPreference()).getValidator(); |
| if (validator != null) { |
| attachValidatorToView(view, validator); |
| } |
| } |
| |
| } |
| |
| @Override |
| public void onStart() { |
| super.onStart(); |
| allowDialogSubmissionOnlyIfValidInput((AlertDialog) getDialog()); |
| } |
| |
| private void attachValidatorToView(View view, ValidatedEditTextPreference.Validator validator) { |
| mValidator = validator; |
| EditText editText = view.findViewById(android.R.id.edit); |
| if (mValidator != null && editText != null) { |
| editText.removeTextChangedListener(mTextWatcher); |
| editText.addTextChangedListener(mTextWatcher); |
| } |
| } |
| |
| private class EditTextWatcher implements TextWatcher { |
| @Override |
| public void onTextChanged(CharSequence s, int start, int before, int count) { |
| } |
| |
| @Override |
| public void beforeTextChanged(CharSequence s, int start, int before, int count) { |
| } |
| |
| @Override |
| public void afterTextChanged(Editable s) { |
| allowDialogSubmissionOnlyIfValidInput((AlertDialog) getDialog()); |
| } |
| } |
| |
| private void allowDialogSubmissionOnlyIfValidInput(AlertDialog dialog) { |
| if (dialog != null && mValidator != null && mEditText != null) { |
| boolean valid = mValidator.isTextValid(mEditText.getText().toString()); |
| dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(valid); |
| setAllowEnterToSubmit(valid); |
| } |
| } |
| } |