1d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda/*
2d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * Copyright (C) 2017 The Android Open Source Project
3d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda *
4d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * Licensed under the Apache License, Version 2.0 (the "License");
5d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * you may not use this file except in compliance with the License.
6d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * You may obtain a copy of the License at
7d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda *
8d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda *      http://www.apache.org/licenses/LICENSE-2.0
9d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda *
10d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * Unless required by applicable law or agreed to in writing, software
11d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * distributed under the License is distributed on an "AS IS" BASIS,
12d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * See the License for the specific language governing permissions and
14d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * limitations under the License.
15d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda */
16d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda
17d4d171425e64ee23a8e3034eebeee3270f21002bJon Mirandapackage com.android.launcher3.anim;
18d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda
19d4d171425e64ee23a8e3034eebeee3270f21002bJon Mirandaimport android.graphics.Rect;
20d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda
21acaf5b3a37af11b40166c10e856175bb96cb1476Tonyimport com.android.launcher3.popup.PopupContainerWithArrow;
22acaf5b3a37af11b40166c10e856175bb96cb1476Tony
23acaf5b3a37af11b40166c10e856175bb96cb1476Tonyimport static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_BOTTOM_CORNERS;
24acaf5b3a37af11b40166c10e856175bb96cb1476Tonyimport static com.android.launcher3.popup.PopupContainerWithArrow.ROUNDED_TOP_CORNERS;
25acaf5b3a37af11b40166c10e856175bb96cb1476Tony
26d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda/**
27d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * A {@link RevealOutlineAnimation} that provides an outline that interpolates between two radii
28d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * and two {@link Rect}s.
29d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda *
30d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * An example usage of this provider is an outline that starts out as a circle and ends
31d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda * as a rounded rectangle.
32d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda */
33d4d171425e64ee23a8e3034eebeee3270f21002bJon Mirandapublic class RoundedRectRevealOutlineProvider extends RevealOutlineAnimation {
34d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    private final float mStartRadius;
35d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    private final float mEndRadius;
36d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda
37d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    private final Rect mStartRect;
38d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    private final Rect mEndRect;
39d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda
40acaf5b3a37af11b40166c10e856175bb96cb1476Tony    private final @PopupContainerWithArrow.RoundedCornerFlags int mRoundedCorners;
41acaf5b3a37af11b40166c10e856175bb96cb1476Tony
42d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect,
43d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda            Rect endRect) {
44acaf5b3a37af11b40166c10e856175bb96cb1476Tony        this(startRadius, endRadius, startRect, endRect,
45acaf5b3a37af11b40166c10e856175bb96cb1476Tony                ROUNDED_TOP_CORNERS | ROUNDED_BOTTOM_CORNERS);
46acaf5b3a37af11b40166c10e856175bb96cb1476Tony    }
47acaf5b3a37af11b40166c10e856175bb96cb1476Tony
48acaf5b3a37af11b40166c10e856175bb96cb1476Tony    public RoundedRectRevealOutlineProvider(float startRadius, float endRadius, Rect startRect,
49acaf5b3a37af11b40166c10e856175bb96cb1476Tony            Rect endRect, int roundedCorners) {
50d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mStartRadius = startRadius;
51d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mEndRadius = endRadius;
52d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mStartRect = startRect;
53d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mEndRect = endRect;
54acaf5b3a37af11b40166c10e856175bb96cb1476Tony        mRoundedCorners = roundedCorners;
55d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    }
56d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda
57d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    @Override
58d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    public boolean shouldRemoveElevationDuringAnimation() {
59aa2272f81cc4a62f847db777efda7959cc2b9979Tony Wickham        return false;
60d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    }
61d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda
62d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    @Override
63d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    public void setProgress(float progress) {
64d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mOutlineRadius = (1 - progress) * mStartRadius + progress * mEndRadius;
65d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda
66d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mOutline.left = (int) ((1 - progress) * mStartRect.left + progress * mEndRect.left);
67d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mOutline.top = (int) ((1 - progress) * mStartRect.top + progress * mEndRect.top);
68acaf5b3a37af11b40166c10e856175bb96cb1476Tony        if ((mRoundedCorners & ROUNDED_TOP_CORNERS) == 0) {
69acaf5b3a37af11b40166c10e856175bb96cb1476Tony            mOutline.top -= mOutlineRadius;
70acaf5b3a37af11b40166c10e856175bb96cb1476Tony        }
71d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mOutline.right = (int) ((1 - progress) * mStartRect.right + progress * mEndRect.right);
72d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda        mOutline.bottom = (int) ((1 - progress) * mStartRect.bottom + progress * mEndRect.bottom);
73acaf5b3a37af11b40166c10e856175bb96cb1476Tony        if ((mRoundedCorners & ROUNDED_BOTTOM_CORNERS) == 0) {
74acaf5b3a37af11b40166c10e856175bb96cb1476Tony            mOutline.bottom += mOutlineRadius;
75acaf5b3a37af11b40166c10e856175bb96cb1476Tony        }
76d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda    }
77d4d171425e64ee23a8e3034eebeee3270f21002bJon Miranda}
78