1ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam/*
2ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * Copyright (C) 2017 The Android Open Source Project
3ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam *
4ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * Licensed under the Apache License, Version 2.0 (the "License");
5ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * you may not use this file except in compliance with the License.
6ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * You may obtain a copy of the License at
7ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam *
8ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam *      http://www.apache.org/licenses/LICENSE-2.0
9ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam *
10ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * Unless required by applicable law or agreed to in writing, software
11ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * distributed under the License is distributed on an "AS IS" BASIS,
12ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * See the License for the specific language governing permissions and
14ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * limitations under the License.
15ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam */
16ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
17ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lampackage com.android.setupwizardlib.view;
18ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
19ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lamimport android.annotation.TargetApi;
20ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lamimport android.content.Context;
21ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lamimport android.os.Build.VERSION_CODES;
22ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lamimport android.support.annotation.Nullable;
23ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lamimport android.util.AttributeSet;
24ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lamimport android.widget.Checkable;
25ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lamimport android.widget.LinearLayout;
26ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
27ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam/**
28ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * A LinearLayout which is checkable. This will set the checked state when
29ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * {@link #onCreateDrawableState(int)} is called, and can be used with
30ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * {@code android:duplicateParentState} to propagate the drawable state to child views.
31ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam */
32ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lampublic class CheckableLinearLayout extends LinearLayout implements Checkable {
33ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
34ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    private boolean mChecked = false;
35ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
36ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    public CheckableLinearLayout(Context context) {
37ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        super(context);
38ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    }
39ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
40ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    public CheckableLinearLayout(Context context, @Nullable AttributeSet attrs) {
41ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        super(context, attrs);
42ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    }
43ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
44ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    @TargetApi(VERSION_CODES.HONEYCOMB)
45ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    public CheckableLinearLayout(
46ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            Context context,
47ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            @Nullable AttributeSet attrs,
48ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            int defStyleAttr) {
49ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        super(context, attrs, defStyleAttr);
50ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    }
51ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
52ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    @TargetApi(VERSION_CODES.LOLLIPOP)
53ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    public CheckableLinearLayout(
54ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            Context context,
55ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            AttributeSet attrs,
56ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            int defStyleAttr,
57ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            int defStyleRes) {
58ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        super(context, attrs, defStyleAttr, defStyleRes);
59ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    }
60ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
61b3617935a276aab4c72c11da340a1096d96225d7Maurice Lam    {
62b3617935a276aab4c72c11da340a1096d96225d7Maurice Lam        setFocusable(true);
63b3617935a276aab4c72c11da340a1096d96225d7Maurice Lam    }
64b3617935a276aab4c72c11da340a1096d96225d7Maurice Lam
65ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    @Override
66ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    protected int[] onCreateDrawableState(int extraSpace) {
67ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        if (mChecked) {
68ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            final int[] superStates = super.onCreateDrawableState(extraSpace + 1);
69ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            final int[] checked = new int[] { android.R.attr.state_checked };
70ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            return mergeDrawableStates(superStates, checked);
71ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        } else {
72ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam            return super.onCreateDrawableState(extraSpace);
73ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        }
74ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    }
75ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
76ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    @Override
77ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    public void setChecked(boolean checked) {
78ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        mChecked = checked;
79ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        refreshDrawableState();
80ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    }
81ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
82ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    @Override
83ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    public boolean isChecked() {
84ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        return mChecked;
85ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    }
86ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam
87ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    @Override
88ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    public void toggle() {
89ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam        setChecked(!isChecked());
90ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam    }
91ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam}
92