1457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 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
14ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * limitations under the License.
15457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler */
16457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.preference.internal;
18457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
19ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas
21457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.content.Context;
22457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.graphics.Outline;
23457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.util.AttributeSet;
24457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.view.View;
25457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.view.ViewOutlineProvider;
26457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerimport android.widget.FrameLayout;
27457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
288619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport androidx.annotation.RequiresApi;
298619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport androidx.annotation.RestrictTo;
308619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas
31457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler/**
32457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * {@link FrameLayout} subclass that provides an outline only when it has children, so that it does
33457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * not cast a shadow when empty.
34457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler *
35457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler * @hide
36457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler */
378f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viverette@RequiresApi(21)
388e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas@RestrictTo(LIBRARY_GROUP)
39457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantlerpublic class OutlineOnlyWithChildrenFrameLayout extends FrameLayout {
40457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
41457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    private ViewOutlineProvider mMagicalOutlineProvider;
42457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    private ViewOutlineProvider mInnerOutlineProvider;
43457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
44457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public OutlineOnlyWithChildrenFrameLayout(Context context) {
45457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super(context);
46457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
47457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
48457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public OutlineOnlyWithChildrenFrameLayout(Context context, AttributeSet attrs) {
49457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super(context, attrs);
50457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
51457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
52457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public OutlineOnlyWithChildrenFrameLayout(Context context, AttributeSet attrs,
53457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            int defStyleAttr) {
54457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super(context, attrs, defStyleAttr);
55457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
56457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
57457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public OutlineOnlyWithChildrenFrameLayout(Context context, AttributeSet attrs,
58457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            int defStyleAttr, int defStyleRes) {
59457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super(context, attrs, defStyleAttr, defStyleRes);
60457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
61457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
62457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    @Override
63457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
64457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super.onLayout(changed, left, top, right, bottom);
65457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        invalidateOutline();
66457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
67457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler
68457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    @Override
69457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    public void setOutlineProvider(ViewOutlineProvider provider) {
70457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        mInnerOutlineProvider = provider;
71457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        if (mMagicalOutlineProvider == null) {
72457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            // Can't initialize this directly because this method is called from the superclass's
73457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            // constructor.
74457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            mMagicalOutlineProvider = new ViewOutlineProvider() {
75457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                @Override
76457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                public void getOutline(View view, Outline outline) {
77457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                    if (getChildCount() > 0) {
78457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                        mInnerOutlineProvider.getOutline(view, outline);
79457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                    } else {
80457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
81457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                    }
82457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler                }
83457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler            };
84457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        }
85457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler        super.setOutlineProvider(mMagicalOutlineProvider);
86457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler    }
87457c75a3c5942bcd7ad2f6ed48658bd705e31accTony Mantler}
88