docs: protected boolean removeChild(final Widget child,
                                    final GVRSceneObject childRootSceneObject, boolean preventLayout) {
          final boolean removed = mChildren.remove(child);
  
          Log.d(Log.SUBSYSTEM.WIDGET, TAG, "removeChild [%s] %b", child, removed);
          if (removed) {
              Log.d(Log.SUBSYSTEM.WIDGET, TAG, "removeChild(): '%s' removed", child.getName());
              if (childRootSceneObject.getParent() != getSceneObject()) {
                  Log.e(Log.SUBSYSTEM.WIDGET, TAG,
                          "removeChild(): '%s' is not a child of '%s' GVRSceneObject!",
                          child.getName(), getName());
              }
              getSceneObject().removeChildObject(childRootSceneObject);
              child.doOnDetached();
  
              final List<OnHierarchyChangedListener> listeners;
              synchronized (mOnHierarchyChangedListeners) {
                  listeners = new ArrayList<>(mOnHierarchyChangedListeners);
              }
              for (OnHierarchyChangedListener listener : listeners) {
                  listener.onChildWidgetRemoved(this, child);
              }
  
              onTransformChanged();
              if (!preventLayout) {
                  invalidateAllLayouts();
                  requestLayout();
              }
          } else {
              Log.w(TAG, "removeChild(): '%s' is not a child of '%s'!",
                      child.getName(), getName());
          }
          return removed;
      }