/* * 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.graphics.Rect; import android.view.View; import com.facebook.stetho.common.Accumulator; import com.facebook.stetho.common.LogUtil; import com.facebook.stetho.common.android.FragmentAccessor; import com.facebook.stetho.common.android.FragmentCompat; import com.facebook.stetho.common.android.ResourcesUtil; import com.facebook.stetho.inspector.elements.AttributeAccumulator; import com.facebook.stetho.inspector.elements.AbstractChainedDescriptor; import com.facebook.stetho.inspector.elements.Descriptor; import com.facebook.stetho.inspector.elements.DescriptorMap; import javax.annotation.Nullable; final class FragmentDescriptor extends AbstractChainedDescriptor<Object> implements HighlightableDescriptor<Object> { private static final String ID_ATTRIBUTE_NAME = "id"; private static final String TAG_ATTRIBUTE_NAME = "tag"; private final FragmentAccessor mAccessor; public static DescriptorMap register(DescriptorMap map) { maybeRegister(map, FragmentCompat.getSupportLibInstance()); maybeRegister(map, FragmentCompat.getFrameworkInstance()); return map; } private static void maybeRegister(DescriptorMap map, @Nullable FragmentCompat compat) { if (compat != null) { Class<?> fragmentClass = compat.getFragmentClass(); LogUtil.d("Adding support for %s", fragmentClass.getName()); map.registerDescriptor(fragmentClass, new FragmentDescriptor(compat)); } } private FragmentDescriptor(FragmentCompat compat) { mAccessor = compat.forFragment(); } @Override protected void onGetAttributes(Object element, AttributeAccumulator attributes) { int id = mAccessor.getId(element); if (id != FragmentAccessor.NO_ID) { String value = ResourcesUtil.getIdStringQuietly( element, mAccessor.getResources(element), id); attributes.store(ID_ATTRIBUTE_NAME, value); } String tag = mAccessor.getTag(element); if (tag != null && tag.length() > 0) { attributes.store(TAG_ATTRIBUTE_NAME, tag); } } @Override protected void onGetChildren(Object element, Accumulator<Object> children) { View view = mAccessor.getView(element); if (view != null) { children.store(view); } } @Override @Nullable public View getViewAndBoundsForHighlighting(Object element, Rect bounds) { return mAccessor.getView(element); } @Nullable @Override public Object getElementToHighlightAtPosition(Object element, int x, int y, Rect bounds) { final Descriptor.Host host = getHost(); View view = null; HighlightableDescriptor descriptor = null; if (host instanceof AndroidDescriptorHost) { view = mAccessor.getView(element); descriptor = ((AndroidDescriptorHost) host).getHighlightableDescriptor(view); } return descriptor == null ? null : descriptor.getElementToHighlightAtPosition(view, x, y, bounds); } }