16e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam/* 26e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * Copyright (C) 2015 The Android Open Source Project 36e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * 46e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * Licensed under the Apache License, Version 2.0 (the "License"); 56e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * you may not use this file except in compliance with the License. 66e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * You may obtain a copy of the License at 76e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * 86e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * http://www.apache.org/licenses/LICENSE-2.0 96e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * 106e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * Unless required by applicable law or agreed to in writing, software 116e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * distributed under the License is distributed on an "AS IS" BASIS, 126e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * See the License for the specific language governing permissions and 146e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * limitations under the License. 156e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam */ 166e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 176e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lampackage com.android.setupwizardlib.items; 186e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 196e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lamimport android.content.Context; 206e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lamimport android.content.res.TypedArray; 216e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lamimport android.support.v7.widget.SwitchCompat; 226e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lamimport android.util.AttributeSet; 236e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lamimport android.view.View; 246e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lamimport android.widget.CompoundButton; 256e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 266e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lamimport com.android.setupwizardlib.R; 276e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 286e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam/** 29ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * An item that is displayed with a switch, with methods to manipulate and listen to the checked 30ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * state of the switch. Note that by default, only click on the switch will change the on-off state. 31ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * To change the switch state when tapping on the text, use the click handlers of list view or 32ee2a6a670db446954ee9d532a4a9c565164539ecMaurice Lam * RecyclerItemAdapter with {@link #toggle(View)}. 336e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam */ 346e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lampublic class SwitchItem extends Item implements CompoundButton.OnCheckedChangeListener { 356e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 3683862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam /** 3783862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * Listener for check state changes of this switch item. 3883862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam */ 396e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public interface OnCheckedChangeListener { 4083862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam 4183862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam /** 4283862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * Callback when checked state of a {@link SwitchItem} is changed. 4383862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * 4483862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * @see #setOnCheckedChangeListener(OnCheckedChangeListener) 4583862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam */ 466e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam void onCheckedChange(SwitchItem item, boolean isChecked); 476e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 486e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 496e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam private boolean mChecked = false; 506e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam private OnCheckedChangeListener mListener; 516e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 5283862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam /** 5383862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * Creates a default switch item. 5483862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam */ 556e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public SwitchItem() { 566e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam super(); 576e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 586e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 5983862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam /** 6083862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * Creates a switch item. This constructor is used for inflation from XML. 6183862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * 6283862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * @param context The context which this item is inflated in. 6383862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * @param attrs The XML attributes defined on the item. 6483862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam */ 656e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public SwitchItem(Context context, AttributeSet attrs) { 666e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam super(context, attrs); 676e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SuwSwitchItem); 686e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam mChecked = a.getBoolean(R.styleable.SuwSwitchItem_android_checked, false); 696e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam a.recycle(); 706e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 716e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 7283862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam /** 7383862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * Sets whether this item should be checked. 7483862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam */ 756e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public void setChecked(boolean checked) { 766e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam if (mChecked != checked) { 776e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam mChecked = checked; 78ab45bdf67a01ba13efb45334cc43f9632de6f034Maurice Lam notifyItemChanged(); 796e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam if (mListener != null) { 806e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam mListener.onCheckedChange(this, checked); 816e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 826e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 836e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 846e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 8583862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam /** 8683862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * @return True if this switch item is currently checked. 8783862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam */ 886e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public boolean isChecked() { 896e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam return mChecked; 906e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 916e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 92de9f081976b6121f93b6debca4554226c125e12fMaurice Lam @Override 936e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam protected int getDefaultLayoutResource() { 946e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam return R.layout.suw_items_switch; 956e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 966e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 976e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam /** 986e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * Toggle the checked state of the switch, without invalidating the entire item. 996e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * 1006e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam * @param view The root view of this item, typically from the argument of onItemClick. 1016e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam */ 1026e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public void toggle(View view) { 1036e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam mChecked = !mChecked; 1046e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam final SwitchCompat switchView = (SwitchCompat) view.findViewById(R.id.suw_items_switch); 1056e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam switchView.setChecked(mChecked); 1066e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 1076e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 1086e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam @Override 1096e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public void onBindView(View view) { 1106e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam super.onBindView(view); 1116e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam final SwitchCompat switchView = (SwitchCompat) view.findViewById(R.id.suw_items_switch); 112b3d973f58b14b66c20d1032518dfd1969b2932feMaurice Lam switchView.setOnCheckedChangeListener(null); 1136e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam switchView.setChecked(mChecked); 1146e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam switchView.setOnCheckedChangeListener(this); 1156e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam switchView.setEnabled(isEnabled()); 1166e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 1176e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 11883862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam /** 11983862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * Sets a listener to listen for changes in checked state. This listener is invoked in both 12083862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam * user toggling the switch and calls to {@link #setChecked(boolean)}. 12183862bb59558fc044de9aa0d6e9407be53af8b81Maurice Lam */ 1226e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { 1236e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam mListener = listener; 1246e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 1256e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam 1266e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam @Override 1276e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 128ae4fda79c9e71d166e879d184568060b051f7c2fMaurice Lam mChecked = isChecked; 1296e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam if (mListener != null) { 1306e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam mListener.onCheckedChange(this, isChecked); 1316e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 1326e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam } 1336e55f30c31f1ac3b35d60f306cf6cef084b1a845Maurice Lam} 134