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