/*
 * Copyright (C) 2015 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.example.android.nfcprovisioning;

import android.text.Editable;
import android.text.TextWatcher;

/**
 * This class wraps {@link TextWatcher} and delegates {@link TextWatcher#afterTextChanged} event to
 * {@link OnTextChangedListener} while hiding all other unnecessary events.
 */
public class TextWatcherWrapper implements TextWatcher {

    private final int mId;
    private final OnTextChangedListener mListener;

    public TextWatcherWrapper(int id, OnTextChangedListener listener) {
        mId = id;
        mListener = listener;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // Ignore
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // Ignore
    }

    @Override
    public void afterTextChanged(Editable s) {
        mListener.onTextChanged(mId, s.toString());
    }

    public interface OnTextChangedListener {
        public void onTextChanged(int id, String s);
    }

}
