GlifLayout.java revision 00e551ce2deaeb4414fc5a387d8ea8de6a19876c
1fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam/*
2fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * Copyright (C) 2015 The Android Open Source Project
3fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *
4fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * Licensed under the Apache License, Version 2.0 (the "License");
5fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * you may not use this file except in compliance with the License.
6fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * You may obtain a copy of the License at
7fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *
8fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *      http://www.apache.org/licenses/LICENSE-2.0
9fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *
10fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * Unless required by applicable law or agreed to in writing, software
11fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * distributed under the License is distributed on an "AS IS" BASIS,
12fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * See the License for the specific language governing permissions and
14fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * limitations under the License.
15fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam */
16fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
17fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lampackage com.android.setupwizardlib;
18fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
19fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.annotation.TargetApi;
20fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.content.Context;
21fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.content.res.ColorStateList;
22fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.content.res.TypedArray;
2339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lamimport android.graphics.drawable.ColorDrawable;
24fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.graphics.drawable.Drawable;
25c3eebe9f664af4b77e5948a14bf266b25dc25cc8Maurice Lamimport android.os.Build;
26fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.os.Build.VERSION_CODES;
27e2a8d27c2a43cf0b48b80e5b05f893222c541e04Maurice Lamimport android.support.annotation.LayoutRes;
28fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lamimport android.support.annotation.NonNull;
2939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lamimport android.support.annotation.Nullable;
30fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.util.AttributeSet;
31fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.view.LayoutInflater;
32fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.view.View;
33fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.view.ViewGroup;
3448c121912f865be865e564a4d0a899988a100d37Maurice Lamimport android.view.ViewStub;
35ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lamimport android.widget.ProgressBar;
36fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.widget.ScrollView;
37fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lamimport android.widget.TextView;
38fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
398721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport com.android.setupwizardlib.template.ButtonFooterMixin;
407514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lamimport com.android.setupwizardlib.template.ColoredHeaderMixin;
417514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lamimport com.android.setupwizardlib.template.HeaderMixin;
427514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lamimport com.android.setupwizardlib.template.IconMixin;
437514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lamimport com.android.setupwizardlib.template.ProgressBarMixin;
440ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport com.android.setupwizardlib.template.RequireScrollMixin;
450ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport com.android.setupwizardlib.template.ScrollViewScrollHandlingDelegate;
46c3eebe9f664af4b77e5948a14bf266b25dc25cc8Maurice Lamimport com.android.setupwizardlib.view.StatusBarBackgroundLayout;
47c3eebe9f664af4b77e5948a14bf266b25dc25cc8Maurice Lam
48fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam/**
49fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * Layout for the GLIF theme used in Setup Wizard for N.
50fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *
51fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * <p>Example usage:
52fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * <pre>{@code
53fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * &lt;com.android.setupwizardlib.GlifLayout
54fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *     xmlns:android="http://schemas.android.com/apk/res/android"
55fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *     xmlns:app="http://schemas.android.com/apk/res-auto"
56fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *     android:layout_width="match_parent"
57fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *     android:layout_height="match_parent"
58fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *     android:icon="@drawable/my_icon"
59fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *     app:suwHeaderText="@string/my_title">
60fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *
61fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *     &lt;!-- Content here -->
62fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam *
63fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * &lt;/com.android.setupwizardlib.GlifLayout>
64fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam * }</pre>
65fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam */
66fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lampublic class GlifLayout extends TemplateLayout {
67fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
68fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    private static final String TAG = "GlifLayout";
69fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
70ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    private ColorStateList mPrimaryColor;
71ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
7239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    private boolean mBackgroundPatterned = true;
7339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
7439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
7539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * The color of the background. If null, the color will inherit from mPrimaryColor.
7639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
7739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    @Nullable
7839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    private ColorStateList mBackgroundBaseColor;
7939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
8000e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam    private boolean mLayoutFullscreen = true;
8100e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam
82fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public GlifLayout(Context context) {
83fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        this(context, 0, 0);
84fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
85fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
86fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public GlifLayout(Context context, int template) {
87fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        this(context, template, 0);
88fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
89fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
90fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public GlifLayout(Context context, int template, int containerId) {
91fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        super(context, template, containerId);
92fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        init(null, R.attr.suwLayoutTheme);
93fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
94fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
95fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public GlifLayout(Context context, AttributeSet attrs) {
96fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        super(context, attrs);
97fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        init(attrs, R.attr.suwLayoutTheme);
98fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
99fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
100fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    @TargetApi(VERSION_CODES.HONEYCOMB)
101fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public GlifLayout(Context context, AttributeSet attrs, int defStyleAttr) {
102fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        super(context, attrs, defStyleAttr);
103fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        init(attrs, defStyleAttr);
104fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
105fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
106fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    // All the constructors delegate to this init method. The 3-argument constructor is not
107fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    // available in LinearLayout before v11, so call super with the exact same arguments.
108fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    private void init(AttributeSet attrs, int defStyleAttr) {
1097514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        registerMixin(HeaderMixin.class, new ColoredHeaderMixin(this, attrs, defStyleAttr));
1107514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        registerMixin(IconMixin.class, new IconMixin(this, attrs, defStyleAttr));
1117514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        registerMixin(ProgressBarMixin.class, new ProgressBarMixin(this));
1128721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        registerMixin(ButtonFooterMixin.class, new ButtonFooterMixin(this));
1130ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        final RequireScrollMixin requireScrollMixin = new RequireScrollMixin(this);
1140ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        registerMixin(RequireScrollMixin.class, requireScrollMixin);
1150ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
1160ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        final ScrollView scrollView = getScrollView();
1170ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        if (scrollView != null) {
1180ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            requireScrollMixin.setScrollHandlingDelegate(
1190ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam                    new ScrollViewScrollHandlingDelegate(requireScrollMixin, scrollView));
1200ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        }
1217514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam
122a6d30093e9308a88fc875b484cf16cda385c2f98Maurice Lam        TypedArray a = getContext().obtainStyledAttributes(attrs,
123fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam                R.styleable.SuwGlifLayout, defStyleAttr, 0);
124fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
125a6d30093e9308a88fc875b484cf16cda385c2f98Maurice Lam        ColorStateList primaryColor =
126a6d30093e9308a88fc875b484cf16cda385c2f98Maurice Lam                a.getColorStateList(R.styleable.SuwGlifLayout_suwColorPrimary);
127fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        if (primaryColor != null) {
128fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam            setPrimaryColor(primaryColor);
129a6d30093e9308a88fc875b484cf16cda385c2f98Maurice Lam        }
130a6d30093e9308a88fc875b484cf16cda385c2f98Maurice Lam
13139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        ColorStateList backgroundColor =
13239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                a.getColorStateList(R.styleable.SuwGlifLayout_suwBackgroundBaseColor);
13339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        setBackgroundBaseColor(backgroundColor);
13439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
13539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        boolean backgroundPatterned =
13639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                a.getBoolean(R.styleable.SuwGlifLayout_suwBackgroundPatterned, true);
13739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        setBackgroundPatterned(backgroundPatterned);
13839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
13948c121912f865be865e564a4d0a899988a100d37Maurice Lam        final int footer = a.getResourceId(R.styleable.SuwGlifLayout_suwFooter, 0);
14048c121912f865be865e564a4d0a899988a100d37Maurice Lam        if (footer != 0) {
14148c121912f865be865e564a4d0a899988a100d37Maurice Lam            inflateFooter(footer);
14248c121912f865be865e564a4d0a899988a100d37Maurice Lam        }
14348c121912f865be865e564a4d0a899988a100d37Maurice Lam
14400e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam        mLayoutFullscreen = a.getBoolean(R.styleable.SuwGlifLayout_suwLayoutFullscreen, true);
14500e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam
146fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        a.recycle();
14700e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam
14800e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam        if (Build.VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP && mLayoutFullscreen) {
14900e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
15000e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam        }
151fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
152fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
153fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    @Override
154e2a8d27c2a43cf0b48b80e5b05f893222c541e04Maurice Lam    protected View onInflateTemplate(LayoutInflater inflater, @LayoutRes int template) {
155fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        if (template == 0) {
156fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam            template = R.layout.suw_glif_template;
157fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        }
158e2a8d27c2a43cf0b48b80e5b05f893222c541e04Maurice Lam        return inflateTemplate(inflater, R.style.SuwThemeGlif_Light, template);
159fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
160fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
161fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    @Override
162fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    protected ViewGroup findContainer(int containerId) {
163fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        if (containerId == 0) {
164fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam            containerId = R.id.suw_layout_content;
165fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        }
166fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        return super.findContainer(containerId);
167fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
168fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
16948c121912f865be865e564a4d0a899988a100d37Maurice Lam    /**
17048c121912f865be865e564a4d0a899988a100d37Maurice Lam     * Sets the footer of the layout, which is at the bottom of the content area outside the
17148c121912f865be865e564a4d0a899988a100d37Maurice Lam     * scrolling container. The footer can only be inflated once per layout.
17248c121912f865be865e564a4d0a899988a100d37Maurice Lam     *
17348c121912f865be865e564a4d0a899988a100d37Maurice Lam     * @param footer The layout to be inflated as footer.
17448c121912f865be865e564a4d0a899988a100d37Maurice Lam     * @return The root of the inflated footer view.
17548c121912f865be865e564a4d0a899988a100d37Maurice Lam     */
17648c121912f865be865e564a4d0a899988a100d37Maurice Lam    public View inflateFooter(@LayoutRes int footer) {
17748c121912f865be865e564a4d0a899988a100d37Maurice Lam        ViewStub footerStub = (ViewStub) findManagedViewById(R.id.suw_layout_footer);
17848c121912f865be865e564a4d0a899988a100d37Maurice Lam        footerStub.setLayoutResource(footer);
17948c121912f865be865e564a4d0a899988a100d37Maurice Lam        return footerStub.inflate();
18048c121912f865be865e564a4d0a899988a100d37Maurice Lam    }
18148c121912f865be865e564a4d0a899988a100d37Maurice Lam
182fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public ScrollView getScrollView() {
18384979a6b2874d09762404c3c8a902f4aad016d01Maurice Lam        final View view = findManagedViewById(R.id.suw_scroll_view);
184fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        return view instanceof ScrollView ? (ScrollView) view : null;
185fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
186fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
18784979a6b2874d09762404c3c8a902f4aad016d01Maurice Lam    public TextView getHeaderTextView() {
1887514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(HeaderMixin.class).getTextView();
189b01f3ef075d501d1f61e6f61794a5cadd3ff2026Maurice Lam    }
190b01f3ef075d501d1f61e6f61794a5cadd3ff2026Maurice Lam
191fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public void setHeaderText(int title) {
1927514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(HeaderMixin.class).setText(title);
193fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
194fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
195fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public void setHeaderText(CharSequence title) {
1967514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(HeaderMixin.class).setText(title);
197fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
198fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
199fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public CharSequence getHeaderText() {
2007514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(HeaderMixin.class).getText();
201fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
202fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
203fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public void setHeaderColor(ColorStateList color) {
2047514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        final ColoredHeaderMixin mixin = (ColoredHeaderMixin) getMixin(HeaderMixin.class);
2057514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        mixin.setColor(color);
206fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
207fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
208fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public ColorStateList getHeaderColor() {
2097514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        final ColoredHeaderMixin mixin = (ColoredHeaderMixin) getMixin(HeaderMixin.class);
2107514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return mixin.getColor();
211fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
212fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
213fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public void setIcon(Drawable icon) {
2147514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(IconMixin.class).setIcon(icon);
215fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
216fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
217fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public Drawable getIcon() {
2187514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(IconMixin.class).getIcon();
219fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
2200a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam
221fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam    /**
222fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam     * Sets the primary color of this layout, which will be used to determine the color of the
223fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam     * progress bar and the background pattern.
224fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam     */
225fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam    public void setPrimaryColor(@NonNull ColorStateList color) {
226ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam        mPrimaryColor = color;
22739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        updateBackground();
2287514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(ProgressBarMixin.class).setColor(color);
229ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    }
230ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
231ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    public ColorStateList getPrimaryColor() {
232ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam        return mPrimaryColor;
233ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    }
234ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
23539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
23639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * Sets the base color of the background view, which is the status bar for phones and the full-
23739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * screen background for tablets. If {@link #isBackgroundPatterned()} is true, the pattern will
23839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * be drawn with this color.
23939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     *
24039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * @param color The color to use as the base color of the background. If {@code null},
24139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     *              {@link #getPrimaryColor()} will be used.
24239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
24339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    public void setBackgroundBaseColor(@Nullable ColorStateList color) {
24439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        mBackgroundBaseColor = color;
24539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        updateBackground();
24639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    }
24739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
24839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
24939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * @return The base color of the background. {@code null} indicates the background will be drawn
25039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     *         with {@link #getPrimaryColor()}.
25139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
25239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    @Nullable
25339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    public ColorStateList getBackgroundBaseColor() {
25439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        return mBackgroundBaseColor;
25539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    }
25639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
25739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
25839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * Sets whether the background should be {@link GlifPatternDrawable}. If {@code false}, the
25939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * background will be a solid color.
26039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
26139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    public void setBackgroundPatterned(boolean patterned) {
26239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        mBackgroundPatterned = patterned;
26339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        updateBackground();
26439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    }
26539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
26639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
26739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * @return True if this view uses {@link GlifPatternDrawable} as background.
26839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
26939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    public boolean isBackgroundPatterned() {
27039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        return mBackgroundPatterned;
27139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    }
27239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
27339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    private void updateBackground() {
274fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        final View patternBg = findManagedViewById(R.id.suw_pattern_bg);
275fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        if (patternBg != null) {
27639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            int backgroundColor = 0;
27739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            if (mBackgroundBaseColor != null) {
27839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                backgroundColor = mBackgroundBaseColor.getDefaultColor();
27939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            } else if (mPrimaryColor != null) {
28039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                backgroundColor = mPrimaryColor.getDefaultColor();
28139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            }
28239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            Drawable background = mBackgroundPatterned
28339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                    ? new GlifPatternDrawable(backgroundColor)
28439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                    : new ColorDrawable(backgroundColor);
285fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam            if (patternBg instanceof StatusBarBackgroundLayout) {
286fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam                ((StatusBarBackgroundLayout) patternBg).setStatusBarBackground(background);
287fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam            } else {
288fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam                patternBg.setBackgroundDrawable(background);
289fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam            }
290fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        }
291ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    }
292ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
2930a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam    public boolean isProgressBarShown() {
2947514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(ProgressBarMixin.class).isShown();
2950a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam    }
2960a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam
2970a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam    public void setProgressBarShown(boolean shown) {
2987514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(ProgressBarMixin.class).setShown(shown);
2990a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam    }
300ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
301b6fb8bb15f4c6b08eb7f875c21df1005a8679594Maurice Lam    public ProgressBar peekProgressBar() {
3027514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(ProgressBarMixin.class).peekProgressBar();
303ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    }
304fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam}
305