SwitchPreference.java revision 671d9d6db5c64e6c8392e56fb84a181ca0550469
16904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/* 26904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* Copyright (C) 2015 The Android Open Source Project 36904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* 46904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* Licensed under the Apache License, Version 2.0 (the "License"); 56904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* you may not use this file except in compliance with the License. 66904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* You may obtain a copy of the License at 76904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* 86904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* http://www.apache.org/licenses/LICENSE-2.0 96904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* 106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* Unless required by applicable law or agreed to in writing, software 116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* distributed under the License is distributed on an "AS IS" BASIS, 126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* See the License for the specific language governing permissions and 146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler* limitations under the License 156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler*/ 166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpackage android.support.v14.preference; 186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.Context; 206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.content.res.TypedArray; 2184765eaea7da18d0576db557959129e9d0db8e8cTony Mantlerimport android.support.v4.content.res.TypedArrayUtils; 226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.support.v7.preference.PreferenceViewHolder; 236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.support.v7.preference.TwoStatePreference; 246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.util.AttributeSet; 256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.view.View; 266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.widget.Checkable; 276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.widget.CompoundButton; 286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerimport android.widget.Switch; 296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler/** 316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * A {@link android.support.v7.preference.Preference} that provides a two-state toggleable option. 326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * <p> 336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This preference will store a boolean into the SharedPreferences. 346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#SwitchPreference_summaryOff 366904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#SwitchPreference_summaryOn 376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#SwitchPreference_switchTextOff 386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#SwitchPreference_switchTextOn 396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @attr ref android.R.styleable#SwitchPreference_disableDependentsState 406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantlerpublic class SwitchPreference extends TwoStatePreference { 426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private final Listener mListener = new Listener(); 436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // Switch text for on and off states 456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private CharSequence mSwitchOn; 466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private CharSequence mSwitchOff; 476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler private class Listener implements CompoundButton.OnCheckedChangeListener { 496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler @Override 506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (!callChangeListener(isChecked)) { 526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // Listener didn't like it, change it back. 536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler // CompoundButton will make sure we don't recurse. 546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler buttonView.setChecked(!isChecked); 556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return; 566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler SwitchPreference.this.setChecked(isChecked); 596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Construct a new SwitchPreference with the given style options. 646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param context The Context that will style this preference 666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param attrs Style attributes that differ from the default 676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param defStyleAttr An attribute in the current theme that contains a 686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * reference to a style resource that supplies default values for 696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * the view. Can be 0 to not look for defaults. 706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param defStyleRes A resource identifier of a style resource that 716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * supplies default values for the view, used only if 726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * defStyleAttr is 0 or can not be found in the theme. Can be 0 736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * to not look for defaults. 746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, 766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler int defStyleRes) { 776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler super(context, attrs, defStyleAttr, defStyleRes); 786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler TypedArray a = context.obtainStyledAttributes(attrs, 806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler R.styleable.SwitchPreference, defStyleAttr, defStyleRes); 8184765eaea7da18d0576db557959129e9d0db8e8cTony Mantler 8284765eaea7da18d0576db557959129e9d0db8e8cTony Mantler setSummaryOn(TypedArrayUtils.getString(a, R.styleable.SwitchPreference_summaryOn, 8384765eaea7da18d0576db557959129e9d0db8e8cTony Mantler R.styleable.SwitchPreference_android_summaryOn)); 8484765eaea7da18d0576db557959129e9d0db8e8cTony Mantler 8584765eaea7da18d0576db557959129e9d0db8e8cTony Mantler setSummaryOff(TypedArrayUtils.getString(a, R.styleable.SwitchPreference_summaryOff, 8684765eaea7da18d0576db557959129e9d0db8e8cTony Mantler R.styleable.SwitchPreference_android_summaryOff)); 8784765eaea7da18d0576db557959129e9d0db8e8cTony Mantler 8884765eaea7da18d0576db557959129e9d0db8e8cTony Mantler setSwitchTextOn(TypedArrayUtils.getString(a, 8984765eaea7da18d0576db557959129e9d0db8e8cTony Mantler R.styleable.SwitchPreference_switchTextOn, 9084765eaea7da18d0576db557959129e9d0db8e8cTony Mantler R.styleable.SwitchPreference_android_switchTextOn)); 9184765eaea7da18d0576db557959129e9d0db8e8cTony Mantler 9284765eaea7da18d0576db557959129e9d0db8e8cTony Mantler setSwitchTextOff(TypedArrayUtils.getString(a, 9384765eaea7da18d0576db557959129e9d0db8e8cTony Mantler R.styleable.SwitchPreference_switchTextOff, 9484765eaea7da18d0576db557959129e9d0db8e8cTony Mantler R.styleable.SwitchPreference_android_switchTextOff)); 9584765eaea7da18d0576db557959129e9d0db8e8cTony Mantler 9684765eaea7da18d0576db557959129e9d0db8e8cTony Mantler setDisableDependentsState(TypedArrayUtils.getBoolean(a, 9784765eaea7da18d0576db557959129e9d0db8e8cTony Mantler R.styleable.SwitchPreference_disableDependentsState, 9884765eaea7da18d0576db557959129e9d0db8e8cTony Mantler R.styleable.SwitchPreference_android_disableDependentsState, false)); 9984765eaea7da18d0576db557959129e9d0db8e8cTony Mantler 1006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler a.recycle(); 1016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Construct a new SwitchPreference with the given style options. 1056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param context The Context that will style this preference 1076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param attrs Style attributes that differ from the default 1086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param defStyleAttr An attribute in the current theme that contains a 1096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * reference to a style resource that supplies default values for 1106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * the view. Can be 0 to not look for defaults. 1116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) { 1136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler this(context, attrs, defStyleAttr, 0); 1146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1156904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1166904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1176904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Construct a new SwitchPreference with the given style options. 1186904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1196904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param context The Context that will style this preference 1206904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param attrs Style attributes that differ from the default 1216904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1226904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public SwitchPreference(Context context, AttributeSet attrs) { 1236904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler this(context, attrs, R.attr.switchPreferenceStyle); 1246904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1256904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1266904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1276904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Construct a new SwitchPreference with default style options. 1286904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1296904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param context The Context that will style this preference 1306904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1316904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public SwitchPreference(Context context) { 1326904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler this(context, null); 1336904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1346904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1356904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler @Override 136671d9d6db5c64e6c8392e56fb84a181ca0550469Tony Mantler public void onBindViewHolder(PreferenceViewHolder holder) { 1376904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler super.onBindViewHolder(holder); 1386904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1396904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler View checkableView = holder.findViewById(R.id.switchWidget); 1406904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (checkableView != null && checkableView instanceof Checkable) { 1416904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (checkableView instanceof Switch) { 1426904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final Switch switchView = (Switch) checkableView; 1436904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler switchView.setOnCheckedChangeListener(null); 1446904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1456904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1466904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler ((Checkable) checkableView).setChecked(mChecked); 1476904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1486904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler if (checkableView instanceof Switch) { 1496904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler final Switch switchView = (Switch) checkableView; 1506904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler switchView.setTextOn(mSwitchOn); 1516904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler switchView.setTextOff(mSwitchOff); 1526904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler switchView.setOnCheckedChangeListener(mListener); 1536904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1546904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1556904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1566904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler syncSummaryView(holder); 1576904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1586904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1596904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1606904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Set the text displayed on the switch widget in the on state. 1616904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This should be a very short string; one word if possible. 1626904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1636904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param onText Text to display in the on state 1646904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1656904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void setSwitchTextOn(CharSequence onText) { 1666904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mSwitchOn = onText; 1676904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler notifyChanged(); 1686904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1696904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1706904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1716904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Set the text displayed on the switch widget in the off state. 1726904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This should be a very short string; one word if possible. 1736904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1746904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param offText Text to display in the off state 1756904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1766904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void setSwitchTextOff(CharSequence offText) { 1776904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler mSwitchOff = offText; 1786904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler notifyChanged(); 1796904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1806904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1816904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1826904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Set the text displayed on the switch widget in the on state. 1836904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This should be a very short string; one word if possible. 1846904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1856904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param resId The text as a string resource ID 1866904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1876904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void setSwitchTextOn(int resId) { 1886904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler setSwitchTextOn(getContext().getString(resId)); 1896904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 1906904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 1916904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 1926904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * Set the text displayed on the switch widget in the off state. 1936904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * This should be a very short string; one word if possible. 1946904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * 1956904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @param resId The text as a string resource ID 1966904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 1976904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public void setSwitchTextOff(int resId) { 1986904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler setSwitchTextOff(getContext().getString(resId)); 1996904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2006904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2016904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 2026904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return The text that will be displayed on the switch widget in the on state 2036904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 2046904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public CharSequence getSwitchTextOn() { 2056904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return mSwitchOn; 2066904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2076904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler 2086904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler /** 2096904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler * @return The text that will be displayed on the switch widget in the off state 2106904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler */ 2116904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler public CharSequence getSwitchTextOff() { 2126904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler return mSwitchOff; 2136904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler } 2146904f67c96a28a0e5966b4fb6d37a0ad5f136858Tony Mantler} 215