content: /*
   * Copyright (C) 2017 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 com.android.launcher3.anim;
  
  import android.graphics.Rect;
  
  import com.android.launcher3.popup.PopupContainerWithArrow;
  
  import static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_BOTTOM_CORNERS;
  import static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_TOP_CORNERS;
  
  /**
   * A {@link RevealOutlineAnimation} that provides an outline that interpolates between two radii
   * and two {@link Rect}s.
   *
   * An example usage of this provider is an outline that starts out as a circle and ends
   * as a rounded rectangle.
   */
  public class RoundedRectRevealOutlineProvider extends RevealOutlineAnimation {
      private final float mStartRadius;
      private final float mEndRadius;
  
      private final Rect mStartRect;
      private final Rect mEndRect;
  
      private final @PopupContainerWithArrow.RoundedCornerFlags int mRoundedCorners;
  
      public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect,
              Rect endRect) {
          this(startRadius, endRadius, startRect, endRect,
                  ROUNDED_TOP_CORNERS | ROUNDED_BOTTOM_CORNERS);
      }
  
      public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect,
              Rect endRect, int roundedCorners) {
          mStartRadius = startRadius;
          mEndRadius = endRadius;
          mStartRect = startRect;
          mEndRect = endRect;
          mRoundedCorners = roundedCorners;
      }
  
      @Override
      public boolean shouldRemoveElevationDuringAnimation() {
          return false;
      }
  
      @Override
      public void setProgress(float progress) {
          mOutlineRadius = (1 - progress) * mStartRadius + progress * mEndRadius;
  
          mOutline.left = (int) ((1 - progress) * mStartRect.left + progress * mEndRect.left);
          mOutline.top = (int) ((1 - progress) * mStartRect.top + progress * mEndRect.top);
          if ((mRoundedCorners & ROUNDED_TOP_CORNERS) == 0) {
              mOutline.top -= mOutlineRadius;
          }
          mOutline.right = (int) ((1 - progress) * mStartRect.right + progress * mEndRect.right);
          mOutline.bottom = (int) ((1 - progress) * mStartRect.bottom + progress * mEndRect.bottom);
          if ((mRoundedCorners & ROUNDED_BOTTOM_CORNERS) == 0) {
              mOutline.bottom += mOutlineRadius;
          }
      }
  }
  