19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 197b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.IdRes; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 236d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Lemeimport android.util.Log; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 26c01a873c4f68518be4698077c7eb593a6a3b9f4cFelipe Lemeimport android.view.ViewStructure; 27640f30a7763b0a4b80c767acb84c740aac04768bFelipe Lemeimport android.view.autofill.AutofillManager; 28640f30a7763b0a4b80c767acb84c740aac04768bFelipe Lemeimport android.view.autofill.AutofillValue; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099441c5d7da45c10b729185852be97cbb0bdc8d5Aurimas Liutikasimport com.android.internal.R; 3199441c5d7da45c10b729185852be97cbb0bdc8d5Aurimas Liutikas 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This class is used to create a multiple-exclusion scope for a set of radio 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * buttons. Checking one radio button that belongs to a radio group unchecks 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any previously checked radio button within the same group.</p> 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Intially, all of the radio buttons are unchecked. While it is not possible 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to uncheck a particular radio button, the radio group can be cleared to 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remove the checked state.</p> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The selection is identified by the unique id of the radio button as defined 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the XML layout file.</p> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>XML Attributes</strong></p> 4699441c5d7da45c10b729185852be97cbb0bdc8d5Aurimas Liutikas * <p>See {@link android.R.styleable#RadioGroup RadioGroup Attributes}, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#LinearLayout LinearLayout Attributes}, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#ViewGroup ViewGroup Attributes}, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#View View Attributes}</p> 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Also see 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.LinearLayout.LayoutParams LinearLayout.LayoutParams} 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for layout attributes.</p> 5399441c5d7da45c10b729185852be97cbb0bdc8d5Aurimas Liutikas * 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see RadioButton 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RadioGroup extends LinearLayout { 589668903731c272e51ce610598c052ef411c9d89fPhilip P. Moltmann private static final String LOG_TAG = RadioGroup.class.getSimpleName(); 596d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // holds the checked id; the selection is empty by default 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCheckedId = -1; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tracks children radio buttons checked state 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CompoundButton.OnCheckedChangeListener mChildOnCheckedChangeListener; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when true, mOnCheckedChangeListener discards events 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mProtectFromCheckedChange = false; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnCheckedChangeListener mOnCheckedChangeListener; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PassThroughHierarchyChangeListener mPassThroughListener; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69c01a873c4f68518be4698077c7eb593a6a3b9f4cFelipe Leme // Indicates whether the child was set from resources or dynamically, so it can be used 70640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme // to sanitize autofill requests. 71c01a873c4f68518be4698077c7eb593a6a3b9f4cFelipe Leme private int mInitialCheckedId = View.NO_ID; 72c01a873c4f68518be4698077c7eb593a6a3b9f4cFelipe Leme 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RadioGroup(Context context) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setOrientation(VERTICAL); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RadioGroup(Context context, AttributeSet attrs) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 88d04a697ede5a372f96f87b80cf99a74dd12dbac4Felipe Leme // RadioGroup is important by default, unless app developer overrode attribute. 89d04a697ede5a372f96f87b80cf99a74dd12dbac4Felipe Leme if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) { 90d04a697ede5a372f96f87b80cf99a74dd12dbac4Felipe Leme setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES); 91d04a697ede5a372f96f87b80cf99a74dd12dbac4Felipe Leme } 92d04a697ede5a372f96f87b80cf99a74dd12dbac4Felipe Leme 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // retrieve selected radio button as requested by the user in the 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XML layout file 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray attributes = context.obtainStyledAttributes( 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrs, com.android.internal.R.styleable.RadioGroup, com.android.internal.R.attr.radioButtonStyle, 0); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int value = attributes.getResourceId(R.styleable.RadioGroup_checkedButton, View.NO_ID); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value != View.NO_ID) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckedId = value; 101c01a873c4f68518be4698077c7eb593a6a3b9f4cFelipe Leme mInitialCheckedId = value; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int index = attributes.getInt(com.android.internal.R.styleable.RadioGroup_orientation, VERTICAL); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setOrientation(index); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attributes.recycle(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void init() { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildOnCheckedChangeListener = new CheckedStateTracker(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPassThroughListener = new PassThroughHierarchyChangeListener(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setOnHierarchyChangeListener(mPassThroughListener); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the user listener is delegated to our pass-through listener 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPassThroughListener.mOnHierarchyChangeListener = listener; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onFinishInflate() { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onFinishInflate(); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // checks the appropriate radio button as requested in the XML file 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCheckedId != -1) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProtectFromCheckedChange = true; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedStateForView(mCheckedId, true); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProtectFromCheckedChange = false; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedId(mCheckedId); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addView(View child, int index, ViewGroup.LayoutParams params) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child instanceof RadioButton) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final RadioButton button = (RadioButton) child; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (button.isChecked()) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProtectFromCheckedChange = true; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCheckedId != -1) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedStateForView(mCheckedId, false); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProtectFromCheckedChange = false; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedId(button.getId()); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.addView(child, index, params); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the selection to the radio button whose identifier is passed in 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameter. Using -1 as the selection identifier clears the selection; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * such an operation is equivalent to invoking {@link #clearCheck()}.</p> 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id the unique id of the radio button to select in this group 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getCheckedRadioButtonId() 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #clearCheck() 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1687b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public void check(@IdRes int id) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't even bother 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != -1 && (id == mCheckedId)) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCheckedId != -1) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedStateForView(mCheckedId, false); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != -1) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedStateForView(id, true); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedId(id); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1857b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye private void setCheckedId(@IdRes int id) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckedId = id; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnCheckedChangeListener != null) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 190640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme final AutofillManager afm = mContext.getSystemService(AutofillManager.class); 1915882c4f5d2ff552a233ba88d2445f6810dd7599bFelipe Leme if (afm != null) { 1922f8fb1f62f2840701e3e16497eb8191f38b72e0bSvet Ganov afm.notifyValueChanged(this); 1935882c4f5d2ff552a233ba88d2445f6810dd7599bFelipe Leme } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setCheckedStateForView(int viewId, boolean checked) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View checkedView = findViewById(viewId); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (checkedView != null && checkedView instanceof RadioButton) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((RadioButton) checkedView).setChecked(checked); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the identifier of the selected radio button in this group. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Upon empty selection, the returned value is -1.</p> 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the unique id of the selected radio button in this group 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #check(int) 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #clearCheck() 211aac722a9c0d199c79ae8ce2dd3cce113f01c30b7Philip Milne * 212aac722a9c0d199c79ae8ce2dd3cce113f01c30b7Philip Milne * @attr ref android.R.styleable#RadioGroup_checkedButton 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2147b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye @IdRes 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getCheckedRadioButtonId() { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCheckedId; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clears the selection. When the selection is cleared, no radio button 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in this group is selected and {@link #getCheckedRadioButtonId()} returns 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null.</p> 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #check(int) 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getCheckedRadioButtonId() 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearCheck() { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project check(-1); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Register a callback to be invoked when the checked radio button 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changes in this group.</p> 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener the callback to call on checked state change 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnCheckedChangeListener = listener; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams generateLayoutParams(AttributeSet attrs) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RadioGroup.LayoutParams(getContext(), attrs); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p instanceof RadioGroup.LayoutParams; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LinearLayout.LayoutParams generateDefaultLayoutParams() { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2628a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 263a7bb6fbeab933326d58aa806d8194b7b13239d34Dianne Hackborn public CharSequence getAccessibilityClassName() { 264a7bb6fbeab933326d58aa806d8194b7b13239d34Dianne Hackborn return RadioGroup.class.getName(); 2658a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 2668a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This set of layout parameters defaults the width and the height of 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the children to {@link #WRAP_CONTENT} when they are not specified in the 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * XML file. Otherwise, this class ussed the value read from the XML file.</p> 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>See 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#LinearLayout_Layout LinearLayout Attributes} 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for a list of all child view attributes that this class supports.</p> 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class LayoutParams extends LinearLayout.LayoutParams { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(Context c, AttributeSet attrs) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(c, attrs); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int w, int h) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(w, h); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int w, int h, float initWeight) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(w, h, initWeight); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(ViewGroup.LayoutParams p) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(p); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(MarginLayoutParams source) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 312579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke 313579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke /** 314579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * <p>Fixes the child's width to 315579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} and the child's 316579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * height to {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} 317579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * when not specified in the XML file.</p> 318579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * 319579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * @param a the styled attributes set 320579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * @param widthAttr the width attribute to fetch 321579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke * @param heightAttr the height attribute to fetch 322579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke */ 323579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke @Override 324579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke protected void setBaseAttributes(TypedArray a, 325579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke int widthAttr, int heightAttr) { 326579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke 327579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke if (a.hasValue(widthAttr)) { 328579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke width = a.getLayoutDimension(widthAttr, "layout_width"); 329579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } else { 330579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke width = WRAP_CONTENT; 331579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } 33299441c5d7da45c10b729185852be97cbb0bdc8d5Aurimas Liutikas 333579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke if (a.hasValue(heightAttr)) { 334579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke height = a.getLayoutDimension(heightAttr, "layout_height"); 335579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } else { 336579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke height = WRAP_CONTENT; 337579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } 338579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Interface definition for a callback to be invoked when the checked 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio button changed in this group.</p> 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnCheckedChangeListener { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Called when the checked radio button has changed. When the 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection is cleared, checkedId is -1.</p> 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param group the group in which the checked radio button has changed 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param checkedId the unique identifier of the newly checked radio button 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3537b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public void onCheckedChanged(RadioGroup group, @IdRes int checkedId); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class CheckedStateTracker implements CompoundButton.OnCheckedChangeListener { 3576d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme @Override 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // prevents from infinite recursion 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProtectFromCheckedChange) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProtectFromCheckedChange = true; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCheckedId != -1) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedStateForView(mCheckedId, false); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProtectFromCheckedChange = false; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = buttonView.getId(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckedId(id); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A pass-through listener acts upon the events and dispatches them 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to another listener. This allows the table layout to set its own internal 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchy change listener without preventing the user to setup his.</p> 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class PassThroughHierarchyChangeListener implements 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.OnHierarchyChangeListener { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ViewGroup.OnHierarchyChangeListener mOnHierarchyChangeListener; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3876d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme @Override 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChildViewAdded(View parent, View child) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent == RadioGroup.this && child instanceof RadioButton) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = child.getId(); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // generates an id if it's missing 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == View.NO_ID) { 393a9108a217e039492855fbeacda2ab6c4f4a3f70aAdam Powell id = View.generateViewId(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setId(id); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((RadioButton) child).setOnCheckedChangeWidgetListener( 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildOnCheckedChangeListener); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnHierarchyChangeListener != null) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnHierarchyChangeListener.onChildViewAdded(parent, child); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4086d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme @Override 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChildViewRemoved(View parent, View child) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent == RadioGroup.this && child instanceof RadioButton) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((RadioButton) child).setOnCheckedChangeWidgetListener(null); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnHierarchyChangeListener != null) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnHierarchyChangeListener.onChildViewRemoved(parent, child); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4196d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme 4200200d9ea1509089c0c03b7071aa271e3a9b35c11Felipe Leme @Override 421640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme public void onProvideAutofillStructure(ViewStructure structure, int flags) { 422640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme super.onProvideAutofillStructure(structure, flags); 423c9a19b1b274af1fdd8b811c9ce2df994f7db47a4Felipe Leme structure.setDataIsSensitive(mCheckedId != mInitialCheckedId); 424c01a873c4f68518be4698077c7eb593a6a3b9f4cFelipe Leme } 425c01a873c4f68518be4698077c7eb593a6a3b9f4cFelipe Leme 426c01a873c4f68518be4698077c7eb593a6a3b9f4cFelipe Leme @Override 427955e252a95785192902da7c9f5610f8e40f97803Felipe Leme public void autofill(AutofillValue value) { 428955e252a95785192902da7c9f5610f8e40f97803Felipe Leme if (!isEnabled()) return; 429bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme 430955e252a95785192902da7c9f5610f8e40f97803Felipe Leme if (!value.isList()) { 4319668903731c272e51ce610598c052ef411c9d89fPhilip P. Moltmann Log.w(LOG_TAG, value + " could not be autofilled into " + this); 432955e252a95785192902da7c9f5610f8e40f97803Felipe Leme return; 4339668903731c272e51ce610598c052ef411c9d89fPhilip P. Moltmann } 4349668903731c272e51ce610598c052ef411c9d89fPhilip P. Moltmann 435955e252a95785192902da7c9f5610f8e40f97803Felipe Leme final int index = value.getListValue(); 4366d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme final View child = getChildAt(index); 4376d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme if (child == null) { 4386d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme Log.w(VIEW_LOG_TAG, "RadioGroup.autoFill(): no child with index " + index); 439955e252a95785192902da7c9f5610f8e40f97803Felipe Leme return; 4406d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme } 441955e252a95785192902da7c9f5610f8e40f97803Felipe Leme 4426d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme check(child.getId()); 4436d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme } 4446d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme 4456d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme @Override 4468931e303700a5adb6e013c2b5a6cec621eede968Felipe Leme public @AutofillType int getAutofillType() { 4478931e303700a5adb6e013c2b5a6cec621eede968Felipe Leme return isEnabled() ? AUTOFILL_TYPE_LIST : AUTOFILL_TYPE_NONE; 4486d553874bed06280766ae24ea605f9bbde3f5a4aFelipe Leme } 449bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme 450bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme @Override 451640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme public AutofillValue getAutofillValue() { 452d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme if (!isEnabled()) return null; 453d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme 454d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme final int count = getChildCount(); 455d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme for (int i = 0; i < count; i++) { 456d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme final View child = getChildAt(i); 457d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme if (child.getId() == mCheckedId) { 458640f30a7763b0a4b80c767acb84c740aac04768bFelipe Leme return AutofillValue.forList(i); 459d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme } 460d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme } 461d09ccb8db6c541f2d349b923bf9b38f1081aaa8dFelipe Leme return null; 462bab851c7c9dfe6f3d063a1009c4d57cfa2ff005cFelipe Leme } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 464