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
1443a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam        final int stickyHeader = a.getResourceId(R.styleable.SuwGlifLayout_suwStickyHeader, 0);
1453a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam        if (stickyHeader != 0) {
1463a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam            inflateStickyHeader(stickyHeader);
1473a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam        }
1483a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam
14900e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam        mLayoutFullscreen = a.getBoolean(R.styleable.SuwGlifLayout_suwLayoutFullscreen, true);
15000e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam
151fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        a.recycle();
15200e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam
15300e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam        if (Build.VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP && mLayoutFullscreen) {
15400e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
15500e551ce2deaeb4414fc5a387d8ea8de6a19876cMaurice Lam        }
156fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
157fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
158fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    @Override
159e2a8d27c2a43cf0b48b80e5b05f893222c541e04Maurice Lam    protected View onInflateTemplate(LayoutInflater inflater, @LayoutRes int template) {
160fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        if (template == 0) {
161fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam            template = R.layout.suw_glif_template;
162fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        }
163e2a8d27c2a43cf0b48b80e5b05f893222c541e04Maurice Lam        return inflateTemplate(inflater, R.style.SuwThemeGlif_Light, template);
164fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
165fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
166fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    @Override
167fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    protected ViewGroup findContainer(int containerId) {
168fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        if (containerId == 0) {
169fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam            containerId = R.id.suw_layout_content;
170fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        }
171fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        return super.findContainer(containerId);
172fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
173fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
17448c121912f865be865e564a4d0a899988a100d37Maurice Lam    /**
17548c121912f865be865e564a4d0a899988a100d37Maurice Lam     * Sets the footer of the layout, which is at the bottom of the content area outside the
1763a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam     * scrolling container. The footer can only be inflated once per instance of this layout.
17748c121912f865be865e564a4d0a899988a100d37Maurice Lam     *
17848c121912f865be865e564a4d0a899988a100d37Maurice Lam     * @param footer The layout to be inflated as footer.
17948c121912f865be865e564a4d0a899988a100d37Maurice Lam     * @return The root of the inflated footer view.
18048c121912f865be865e564a4d0a899988a100d37Maurice Lam     */
18148c121912f865be865e564a4d0a899988a100d37Maurice Lam    public View inflateFooter(@LayoutRes int footer) {
1823a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam        ViewStub footerStub = findManagedViewById(R.id.suw_layout_footer);
18348c121912f865be865e564a4d0a899988a100d37Maurice Lam        footerStub.setLayoutResource(footer);
18448c121912f865be865e564a4d0a899988a100d37Maurice Lam        return footerStub.inflate();
18548c121912f865be865e564a4d0a899988a100d37Maurice Lam    }
18648c121912f865be865e564a4d0a899988a100d37Maurice Lam
1873a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam    /**
1883a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam     * Sets the sticky header (i.e. header that doesn't scroll) of the layout, which is at the top
1893a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam     * of the content area outside of the scrolling container. The header can only be inflated once
1903a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam     * per instance of this layout.
1913a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam     *
1923a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam     * @param header The layout to be inflated as the header.
1933a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam     * @return The root of the inflated header view.
1943a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam     */
1953a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam    public View inflateStickyHeader(@LayoutRes int header) {
1963a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam        ViewStub stickyHeaderStub = findManagedViewById(R.id.suw_layout_sticky_header);
1973a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam        stickyHeaderStub.setLayoutResource(header);
1983a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam        return stickyHeaderStub.inflate();
1993a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam    }
2003a3d478a4b8805992f9558fa8128261970d2ee99Maurice Lam
201fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public ScrollView getScrollView() {
20284979a6b2874d09762404c3c8a902f4aad016d01Maurice Lam        final View view = findManagedViewById(R.id.suw_scroll_view);
203fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam        return view instanceof ScrollView ? (ScrollView) view : null;
204fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
205fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
20684979a6b2874d09762404c3c8a902f4aad016d01Maurice Lam    public TextView getHeaderTextView() {
2077514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(HeaderMixin.class).getTextView();
208b01f3ef075d501d1f61e6f61794a5cadd3ff2026Maurice Lam    }
209b01f3ef075d501d1f61e6f61794a5cadd3ff2026Maurice Lam
210fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public void setHeaderText(int title) {
2117514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(HeaderMixin.class).setText(title);
212fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
213fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
214fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public void setHeaderText(CharSequence title) {
2157514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(HeaderMixin.class).setText(title);
216fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
217fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
218fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public CharSequence getHeaderText() {
2197514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(HeaderMixin.class).getText();
220fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
221fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
222fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public void setHeaderColor(ColorStateList color) {
2237514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        final ColoredHeaderMixin mixin = (ColoredHeaderMixin) getMixin(HeaderMixin.class);
2247514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        mixin.setColor(color);
225fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
226fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
227fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public ColorStateList getHeaderColor() {
2287514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        final ColoredHeaderMixin mixin = (ColoredHeaderMixin) getMixin(HeaderMixin.class);
2297514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return mixin.getColor();
230fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
231fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
232fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public void setIcon(Drawable icon) {
2337514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(IconMixin.class).setIcon(icon);
234fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
235fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam
236fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    public Drawable getIcon() {
2377514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(IconMixin.class).getIcon();
238fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam    }
2390a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam
240fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam    /**
241fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam     * Sets the primary color of this layout, which will be used to determine the color of the
242fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam     * progress bar and the background pattern.
243fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam     */
244fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam    public void setPrimaryColor(@NonNull ColorStateList color) {
245ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam        mPrimaryColor = color;
24639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        updateBackground();
2477514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(ProgressBarMixin.class).setColor(color);
248ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    }
249ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
250ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    public ColorStateList getPrimaryColor() {
251ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam        return mPrimaryColor;
252ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    }
253ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
25439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
25539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * Sets the base color of the background view, which is the status bar for phones and the full-
25639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * screen background for tablets. If {@link #isBackgroundPatterned()} is true, the pattern will
25739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * be drawn with this color.
25839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     *
25939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * @param color The color to use as the base color of the background. If {@code null},
26039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     *              {@link #getPrimaryColor()} will be used.
26139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
26239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    public void setBackgroundBaseColor(@Nullable ColorStateList color) {
26339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        mBackgroundBaseColor = color;
26439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        updateBackground();
26539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    }
26639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
26739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
26839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * @return The base color of the background. {@code null} indicates the background will be drawn
26939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     *         with {@link #getPrimaryColor()}.
27039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
27139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    @Nullable
27239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    public ColorStateList getBackgroundBaseColor() {
27339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        return mBackgroundBaseColor;
27439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    }
27539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
27639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
27739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * Sets whether the background should be {@link GlifPatternDrawable}. If {@code false}, the
27839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * background will be a solid color.
27939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
28039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    public void setBackgroundPatterned(boolean patterned) {
28139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        mBackgroundPatterned = patterned;
28239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        updateBackground();
28339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    }
28439056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
28539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    /**
28639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     * @return True if this view uses {@link GlifPatternDrawable} as background.
28739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam     */
28839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    public boolean isBackgroundPatterned() {
28939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam        return mBackgroundPatterned;
29039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    }
29139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam
29239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam    private void updateBackground() {
293fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        final View patternBg = findManagedViewById(R.id.suw_pattern_bg);
294fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        if (patternBg != null) {
29539056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            int backgroundColor = 0;
29639056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            if (mBackgroundBaseColor != null) {
29739056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                backgroundColor = mBackgroundBaseColor.getDefaultColor();
29839056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            } else if (mPrimaryColor != null) {
29939056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                backgroundColor = mPrimaryColor.getDefaultColor();
30039056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            }
30139056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam            Drawable background = mBackgroundPatterned
30239056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                    ? new GlifPatternDrawable(backgroundColor)
30339056e5dc4b068745c2d9be69e5cd0c008bdc117Maurice Lam                    : new ColorDrawable(backgroundColor);
304fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam            if (patternBg instanceof StatusBarBackgroundLayout) {
305fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam                ((StatusBarBackgroundLayout) patternBg).setStatusBarBackground(background);
306fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam            } else {
307fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam                patternBg.setBackgroundDrawable(background);
308fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam            }
309fca3ee628d9d5c1c1109f3df6e02cdd31c57c000Maurice Lam        }
310ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    }
311ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
3120a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam    public boolean isProgressBarShown() {
3137514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(ProgressBarMixin.class).isShown();
3140a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam    }
3150a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam
3160a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam    public void setProgressBarShown(boolean shown) {
3177514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        getMixin(ProgressBarMixin.class).setShown(shown);
3180a51b2852ce9940075774191dce7b81ce91eb4a1Maurice Lam    }
319ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam
320b6fb8bb15f4c6b08eb7f875c21df1005a8679594Maurice Lam    public ProgressBar peekProgressBar() {
3217514f1cee29b3feb4822ce16945c1c312057d24fMaurice Lam        return getMixin(ProgressBarMixin.class).peekProgressBar();
322ac40f3676511e1c7c09a948f5cb8481e5ea12d57Maurice Lam    }
323fce4cf6161b2a1644ad21034f0afe4087d659ab4Maurice Lam}
324