/*
* 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.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.Window;
import com.facebook.stetho.common.Accumulator;
import com.facebook.stetho.common.StringUtil;
import com.facebook.stetho.common.android.FragmentActivityAccessor;
import com.facebook.stetho.common.android.FragmentCompat;
import com.facebook.stetho.common.android.FragmentManagerAccessor;
import com.facebook.stetho.inspector.elements.AbstractChainedDescriptor;
import com.facebook.stetho.inspector.elements.Descriptor;
import javax.annotation.Nullable;
import java.util.List;
final class ActivityDescriptor
extends AbstractChainedDescriptor<Activity> implements HighlightableDescriptor<Activity> {
@Override
protected String onGetNodeName(Activity element) {
String className = element.getClass().getName();
return StringUtil.removePrefix(className, "android.app.");
}
@Override
protected void onGetChildren(Activity element, Accumulator<Object> children) {
getDialogFragments(FragmentCompat.getSupportLibInstance(), element, children);
getDialogFragments(FragmentCompat.getFrameworkInstance(), element, children);
Window window = element.getWindow();
if (window != null) {
children.store(window);
}
}
@Nullable
@Override
public View getViewAndBoundsForHighlighting(Activity element, Rect bounds) {
final Descriptor.Host host = getHost();
Window window = null;
HighlightableDescriptor descriptor = null;
if (host instanceof AndroidDescriptorHost) {
window = element.getWindow();
descriptor = ((AndroidDescriptorHost) host).getHighlightableDescriptor(window);
}
return descriptor == null
? null
: descriptor.getViewAndBoundsForHighlighting(window, bounds);
}
@Nullable
@Override
public Object getElementToHighlightAtPosition(Activity element, int x, int y, Rect bounds) {
final Descriptor.Host host = getHost();
Window window = null;
HighlightableDescriptor descriptor = null;
if (host instanceof AndroidDescriptorHost) {
window = element.getWindow();
descriptor = ((AndroidDescriptorHost) host).getHighlightableDescriptor(window);
}
return descriptor == null
? null
: descriptor.getElementToHighlightAtPosition(window, x, y, bounds);
}
private static void getDialogFragments(
@Nullable FragmentCompat compat,
Activity activity,
Accumulator<Object> accumulator) {
if (compat == null || !compat.getFragmentActivityClass().isInstance(activity)) {
return;
}
FragmentActivityAccessor activityAccessor = compat.forFragmentActivity();
Object fragmentManager = activityAccessor.getFragmentManager(activity);
if (fragmentManager == null) {
return;
}
FragmentManagerAccessor fragmentManagerAccessor = compat.forFragmentManager();
List<Object> addedFragments = fragmentManagerAccessor.getAddedFragments(fragmentManager);
if (addedFragments == null) {
return;
}
for (int i = 0, N = addedFragments.size(); i < N; ++i) {
final Object fragment = addedFragments.get(i);
if (compat.getDialogFragmentClass().isInstance(fragment)) {
accumulator.store(fragment);
}
}
}
}