1457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler/*
2457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * Copyright (C) 2016 The Android Open Source Project
3457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler *
4457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
5457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * you may not use this file except in compliance with the License.
6457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * You may obtain a copy of the License at
7457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler *
8457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
9457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler *
10457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * Unless required by applicable law or agreed to in writing, software
11457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
12457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * See the License for the specific language governing permissions and
14457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * limitations under the License
15457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler */
16457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
17457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerpackage android.support.v17.internal.widget;
18457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas
21457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.content.Context;
22457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.graphics.Outline;
238f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viveretteimport android.support.annotation.RequiresApi;
24c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo;
25457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.util.AttributeSet;
26457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.view.View;
27457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.view.ViewOutlineProvider;
28457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.widget.FrameLayout;
29457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
30457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler/**
31457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * {@link FrameLayout} subclass that provides an outline only when it has children, so that it does
32457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * not cast a shadow when empty.
33457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler *
34457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * @hide
35457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler */
368f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viverette@RequiresApi(21)
378e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas@RestrictTo(LIBRARY_GROUP)
38457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerpublic class OutlineOnlyWithChildrenFrameLayout extends FrameLayout {
39457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
40457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    private ViewOutlineProvider mMagicalOutlineProvider;
41457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    private ViewOutlineProvider mInnerOutlineProvider;
42457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
43457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public OutlineOnlyWithChildrenFrameLayout(Context context) {
44457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super(context);
45457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
46457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
47457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public OutlineOnlyWithChildrenFrameLayout(Context context, AttributeSet attrs) {
48457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super(context, attrs);
49457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
50457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
51457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public OutlineOnlyWithChildrenFrameLayout(Context context, AttributeSet attrs,
52457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            int defStyleAttr) {
53457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super(context, attrs, defStyleAttr);
54457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
55457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
56457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public OutlineOnlyWithChildrenFrameLayout(Context context, AttributeSet attrs,
57457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            int defStyleAttr, int defStyleRes) {
58457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super(context, attrs, defStyleAttr, defStyleRes);
59457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
60457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
61457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    @Override
62457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
63457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super.onLayout(changed, left, top, right, bottom);
64457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        invalidateOutline();
65457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
66457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
67457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    @Override
68457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public void setOutlineProvider(ViewOutlineProvider provider) {
69457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        mInnerOutlineProvider = provider;
70457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        if (mMagicalOutlineProvider == null) {
71457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            // Can't initialize this directly because this method is called from the superclass's
72457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            // constructor.
73457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            mMagicalOutlineProvider = new ViewOutlineProvider() {
74457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                @Override
75457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                public void getOutline(View view, Outline outline) {
76457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                    if (getChildCount() > 0) {
77457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                        mInnerOutlineProvider.getOutline(view, outline);
78457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                    } else {
79457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
80457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                    }
81457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                }
82457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            };
83457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        }
84457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super.setOutlineProvider(mMagicalOutlineProvider);
85457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
86457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler}
87