/* * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.stetho.inspector.elements.android; import android.text.Editable; import android.text.TextWatcher; import android.widget.TextView; import com.facebook.stetho.common.Util; import com.facebook.stetho.inspector.elements.AttributeAccumulator; import com.facebook.stetho.inspector.elements.AbstractChainedDescriptor; import java.util.Collections; import java.util.IdentityHashMap; import java.util.Map; final class TextViewDescriptor extends AbstractChainedDescriptor<TextView> { private static final String TEXT_ATTRIBUTE_NAME = "text"; private final Map<TextView, ElementContext> mElementToContextMap = Collections.synchronizedMap(new IdentityHashMap<TextView, ElementContext>()); @Override protected void onHook(final TextView element) { ElementContext context = new ElementContext(); context.hook(element); mElementToContextMap.put(element, context); } protected void onUnhook(TextView element) { ElementContext context = mElementToContextMap.remove(element); context.unhook(); } @Override protected void onGetAttributes(TextView element, AttributeAccumulator attributes) { CharSequence text = element.getText(); if (text != null && text.length() != 0) { attributes.store(TEXT_ATTRIBUTE_NAME, text.toString()); } } private final class ElementContext implements TextWatcher { private TextView mElement; public void hook(TextView element) { mElement = Util.throwIfNull(element); mElement.addTextChangedListener(this); } public void unhook() { if (mElement != null) { mElement.removeTextChangedListener(this); mElement = null; } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (s.length() == 0) { getHost().onAttributeRemoved(mElement, TEXT_ATTRIBUTE_NAME); } else { getHost().onAttributeModified(mElement, TEXT_ATTRIBUTE_NAME, s.toString()); } } } }