content: /*
   * Copyright (C) 2019 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 androidx.constraintlayout.core.widgets.analyzer;
  
  import java.util.ArrayList;
  import java.util.List;
  
  public class DependencyNode implements Dependency {
      public Dependency updateDelegate = null;
      public boolean delegateToWidgetRun = false;
      public boolean readyToSolve = false;
  
      enum Type {
          UNKNOWN, HORIZONTAL_DIMENSION, VERTICAL_DIMENSION,
          LEFT, RIGHT, TOP, BOTTOM, BASELINE
      }
  
      WidgetRun mRun;
      Type mType = Type.UNKNOWN;
      int mMargin;
      public int value;
      int mMarginFactor = 1;
      DimensionDependency mMarginDependency = null;
      public boolean resolved = false;
  
      public DependencyNode(WidgetRun run) {
          this.mRun = run;
      }
  
      List<Dependency> mDependencies = new ArrayList<>();
      List<DependencyNode> mTargets = new ArrayList<>();
  
      @Override
      public String toString() {
          return mRun.mWidget.getDebugName() + ":" + mType + "("
                  + (resolved ? value : "unresolved") + ") <t="
                  + mTargets.size() + ":d=" + mDependencies.size() + ">";
      }
  
      // @TODO: add description
      public void resolve(int value) {
          if (resolved) {
              return;
          }
  
          this.resolved = true;
          this.value = value;
          for (Dependency node : mDependencies) {
              node.update(node);
          }
      }
  
      // @TODO: add description
      @Override
      public void update(Dependency node) {
          for (DependencyNode target : mTargets) {
              if (!target.resolved) {
                  return;
              }
          }
          readyToSolve = true;
          if (updateDelegate != null) {
              updateDelegate.update(this);
          }
          if (delegateToWidgetRun) {
              mRun.update(this);
              return;
          }
          DependencyNode target = null;
          int numTargets = 0;
          for (DependencyNode t : mTargets) {
              if (t instanceof DimensionDependency) {
                  continue;
              }
              target = t;
              numTargets++;
          }
          if (target != null && numTargets == 1 && target.resolved) {
              if (mMarginDependency != null) {
                  if (mMarginDependency.resolved) {
                      mMargin = mMarginFactor * mMarginDependency.value;
                  } else {
                      return;
                  }
              }
              resolve(target.value + mMargin);
          }
          if (updateDelegate != null) {
              updateDelegate.update(this);
          }
      }
  
      // @TODO: add description
      public void addDependency(Dependency dependency) {
          mDependencies.add(dependency);
          if (resolved) {
              dependency.update(dependency);
          }
      }
  
      // @TODO: add description
      public String name() {
          String definition = mRun.mWidget.getDebugName();
          if (mType == Type.LEFT
                  || mType == Type.RIGHT) {
              definition += "_HORIZONTAL";
          } else {
              definition += "_VERTICAL";
          }
          definition += ":" + mType.name();
          return definition;
      }
  
      // @TODO: add description
      public void clear() {
          mTargets.clear();
          mDependencies.clear();
          resolved = false;
          value = 0;
          readyToSolve = false;
          delegateToWidgetRun = false;
      }
  }
  