content: /*
   * Copyright (C) 2021 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.motion.key;
  
  import androidx.constraintlayout.core.motion.CustomVariable;
  import androidx.constraintlayout.core.motion.MotionWidget;
  import androidx.constraintlayout.core.motion.utils.FloatRect;
  import androidx.constraintlayout.core.motion.utils.SplineSet;
  
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Locale;
  
  public class MotionKeyTrigger extends MotionKey {
      private static final String TAG = "KeyTrigger";
      public static final String VIEW_TRANSITION_ON_CROSS = "viewTransitionOnCross";
      public static final String VIEW_TRANSITION_ON_POSITIVE_CROSS = "viewTransitionOnPositiveCross";
      public static final String VIEW_TRANSITION_ON_NEGATIVE_CROSS = "viewTransitionOnNegativeCross";
      public static final String POST_LAYOUT = "postLayout";
      public static final String TRIGGER_SLACK = "triggerSlack";
      public static final String TRIGGER_COLLISION_VIEW = "triggerCollisionView";
      public static final String TRIGGER_COLLISION_ID = "triggerCollisionId";
      public static final String TRIGGER_ID = "triggerID";
      public static final String POSITIVE_CROSS = "positiveCross";
      public static final String NEGATIVE_CROSS = "negativeCross";
      public static final String TRIGGER_RECEIVER = "triggerReceiver";
      public static final String CROSS = "CROSS";
  
      private int mCurveFit = -1;
      private String mCross = null;
      private int mTriggerReceiver = UNSET;
      private String mNegativeCross = null;
      private String mPositiveCross = null;
      private int mTriggerID = UNSET;
      private int mTriggerCollisionId = UNSET;
      //   TODO private MotionWidget mTriggerCollisionView = null;
      float mTriggerSlack = .1f;
      private boolean mFireCrossReset = true;
      private boolean mFireNegativeReset = true;
      private boolean mFirePositiveReset = true;
      private float mFireThreshold = Float.NaN;
      private float mFireLastPos;
      private boolean mPostLayout = false;
      int mViewTransitionOnNegativeCross = UNSET;
      int mViewTransitionOnPositiveCross = UNSET;
      int mViewTransitionOnCross = UNSET;
  
      public static final int TYPE_VIEW_TRANSITION_ON_CROSS = 301;
      public static final int TYPE_VIEW_TRANSITION_ON_POSITIVE_CROSS = 302;
      public static final int TYPE_VIEW_TRANSITION_ON_NEGATIVE_CROSS = 303;
      public static final int TYPE_POST_LAYOUT = 304;
      public static final int TYPE_TRIGGER_SLACK = 305;
      public static final int TYPE_TRIGGER_COLLISION_VIEW = 306;
      public static final int TYPE_TRIGGER_COLLISION_ID = 307;
      public static final int TYPE_TRIGGER_ID = 308;
      public static final int TYPE_POSITIVE_CROSS = 309;
      public static final int TYPE_NEGATIVE_CROSS = 310;
      public static final int TYPE_TRIGGER_RECEIVER = 311;
      public static final int TYPE_CROSS = 312;
  
      FloatRect mCollisionRect = new FloatRect();
      FloatRect mTargetRect = new FloatRect();
      public static final int KEY_TYPE = 5;
  
      {
          mType = KEY_TYPE;
          mCustom = new HashMap<>();
      }
  
      @Override
      public void getAttributeNames(HashSet<String> attributes) {
  
      }
  
      @Override
      public void addValues(HashMap<String, SplineSet> splines) {
  
      }
  
      @Override
      public int getId(String name) {
          switch (name) {
              case VIEW_TRANSITION_ON_CROSS:
                  return TYPE_VIEW_TRANSITION_ON_CROSS;
              case VIEW_TRANSITION_ON_POSITIVE_CROSS:
                  return TYPE_VIEW_TRANSITION_ON_POSITIVE_CROSS;
              case VIEW_TRANSITION_ON_NEGATIVE_CROSS:
                  return TYPE_VIEW_TRANSITION_ON_NEGATIVE_CROSS;
              case POST_LAYOUT:
                  return TYPE_POST_LAYOUT;
              case TRIGGER_SLACK:
                  return TYPE_TRIGGER_SLACK;
              case TRIGGER_COLLISION_VIEW:
                  return TYPE_TRIGGER_COLLISION_VIEW;
              case TRIGGER_COLLISION_ID:
                  return TYPE_TRIGGER_COLLISION_ID;
              case TRIGGER_ID:
                  return TYPE_TRIGGER_ID;
              case POSITIVE_CROSS:
                  return TYPE_POSITIVE_CROSS;
              case NEGATIVE_CROSS:
                  return TYPE_NEGATIVE_CROSS;
              case TRIGGER_RECEIVER:
                  return TYPE_TRIGGER_RECEIVER;
          }
          return -1;
      }
  
      // @TODO: add description
      @Override
      public MotionKeyTrigger copy(MotionKey src) {
          super.copy(src);
          MotionKeyTrigger k = (MotionKeyTrigger) src;
          mCurveFit = k.mCurveFit;
          mCross = k.mCross;
          mTriggerReceiver = k.mTriggerReceiver;
          mNegativeCross = k.mNegativeCross;
          mPositiveCross = k.mPositiveCross;
          mTriggerID = k.mTriggerID;
          mTriggerCollisionId = k.mTriggerCollisionId;
          // TODO mTriggerCollisionView = k.mTriggerCollisionView;
          mTriggerSlack = k.mTriggerSlack;
          mFireCrossReset = k.mFireCrossReset;
          mFireNegativeReset = k.mFireNegativeReset;
          mFirePositiveReset = k.mFirePositiveReset;
          mFireThreshold = k.mFireThreshold;
          mFireLastPos = k.mFireLastPos;
          mPostLayout = k.mPostLayout;
          mCollisionRect = k.mCollisionRect;
          mTargetRect = k.mTargetRect;
          return this;
      }
  
      // @TODO: add description
      @Override
      public MotionKey clone() {
          return new MotionKeyTrigger().copy(this);
      }
  
      @SuppressWarnings("unused")
      private void fireCustom(String str, MotionWidget widget) {
          boolean callAll = str.length() == 1;
          if (!callAll) {
              str = str.substring(1).toLowerCase(Locale.ROOT);
          }
          for (String name : mCustom.keySet()) {
              String lowerCase = name.toLowerCase(Locale.ROOT);
              if (callAll || lowerCase.matches(str)) {
                  CustomVariable custom = mCustom.get(name);
                  if (custom != null) {
                      custom.applyToWidget(widget);
                  }
              }
          }
      }
  
      // @TODO: add description
      public void conditionallyFire(float position, MotionWidget child) {
      }
  
      // @TODO: add description
      @Override
      public boolean setValue(int type, int value) {
          switch (type) {
              case TriggerType.TYPE_TRIGGER_RECEIVER:
                  mTriggerReceiver = value;
                  break;
              case TriggerType.TYPE_TRIGGER_ID:
                  mTriggerID = toInt(value);
                  break;
              case TriggerType.TYPE_TRIGGER_COLLISION_ID:
                  mTriggerCollisionId = value;
                  break;
              case TriggerType.TYPE_VIEW_TRANSITION_ON_NEGATIVE_CROSS:
                  mViewTransitionOnNegativeCross = value;
                  break;
              case TriggerType.TYPE_VIEW_TRANSITION_ON_POSITIVE_CROSS:
                  mViewTransitionOnPositiveCross = value;
                  break;
  
              case TriggerType.TYPE_VIEW_TRANSITION_ON_CROSS:
                  mViewTransitionOnCross = value;
                  break;
              default:
                  return super.setValue(type, value);
          }
          return true;
      }
  
      // @TODO: add description
      @Override
      public boolean setValue(int type, float value) {
          switch (type) {
              case TriggerType.TYPE_TRIGGER_SLACK:
                  mTriggerSlack = value;
                  break;
              default:
                  return super.setValue(type, value);
          }
          return true;
      }
  
      // @TODO: add description
      @Override
      public boolean setValue(int type, String value) {
          switch (type) {
              case TriggerType.TYPE_CROSS:
                  mCross = value;
                  break;
              case TriggerType.TYPE_NEGATIVE_CROSS:
                  mNegativeCross = value;
                  break;
              case TriggerType.TYPE_POSITIVE_CROSS:
                  mPositiveCross = value;
                  break;
  //                TODO
  //            case TRIGGER_COLLISION_VIEW:
  //                mTriggerCollisionView = (MotionWidget) value;
  //                break;
  
              default:
  
                  return super.setValue(type, value);
          }
          return true;
      }
  
      // @TODO: add description
      @Override
      public boolean setValue(int type, boolean value) {
          switch (type) {
              case TriggerType.TYPE_POST_LAYOUT:
                  mPostLayout = value;
                  break;
              default:
                  return super.setValue(type, value);
          }
          return true;
      }
  
  
  }
  