content: /*
   * Copyright (C) 2010 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package android.preference;
  
  import android.annotation.StringRes;
  import android.annotation.UnsupportedAppUsage;
  import android.content.Context;
  import android.content.res.TypedArray;
  import android.util.AttributeSet;
  import android.view.View;
  import android.widget.Checkable;
  import android.widget.CompoundButton;
  import android.widget.Switch;
  
  /**
   * A {@link Preference} that provides a two-state toggleable option.
   * <p>
   * This preference will store a boolean into the SharedPreferences.
   *
   * @attr ref android.R.styleable#SwitchPreference_summaryOff
   * @attr ref android.R.styleable#SwitchPreference_summaryOn
   * @attr ref android.R.styleable#SwitchPreference_switchTextOff
   * @attr ref android.R.styleable#SwitchPreference_switchTextOn
   * @attr ref android.R.styleable#SwitchPreference_disableDependentsState
   *
   * @deprecated Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
   *      <a href="{@docRoot}reference/androidx/preference/package-summary.html">
   *      Preference Library</a> for consistent behavior across all devices. For more information on
   *      using the AndroidX Preference Library see
   *      <a href="{@docRoot}guide/topics/ui/settings.html">Settings</a>.
   */
  @Deprecated
  public class SwitchPreference extends TwoStatePreference {
      @UnsupportedAppUsage
      private final Listener mListener = new Listener();
  
      // Switch text for on and off states
      private CharSequence mSwitchOn;
      private CharSequence mSwitchOff;
  
      private class Listener implements CompoundButton.OnCheckedChangeListener {
          @Override
          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
              if (!callChangeListener(isChecked)) {
                  // Listener didn't like it, change it back.
                  // CompoundButton will make sure we don't recurse.
                  buttonView.setChecked(!isChecked);
                  return;
              }
  
              SwitchPreference.this.setChecked(isChecked);
          }
      }
  
      /**
       * Construct a new SwitchPreference with the given style options.
       *
       * @param context The Context that will style this preference
       * @param attrs Style attributes that differ from the default
       * @param defStyleAttr An attribute in the current theme that contains a
       *        reference to a style resource that supplies default values for
       *        the view. Can be 0 to not look for defaults.
       * @param defStyleRes A resource identifier of a style resource that
       *        supplies default values for the view, used only if
       *        defStyleAttr is 0 or can not be found in the theme. Can be 0
       *        to not look for defaults.
       */
      public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
          super(context, attrs, defStyleAttr, defStyleRes);
  
          TypedArray a = context.obtainStyledAttributes(attrs,
                  com.android.internal.R.styleable.SwitchPreference, defStyleAttr, defStyleRes);
          setSummaryOn(a.getString(com.android.internal.R.styleable.SwitchPreference_summaryOn));
          setSummaryOff(a.getString(com.android.internal.R.styleable.SwitchPreference_summaryOff));
          setSwitchTextOn(a.getString(
                  com.android.internal.R.styleable.SwitchPreference_switchTextOn));
          setSwitchTextOff(a.getString(
                  com.android.internal.R.styleable.SwitchPreference_switchTextOff));
          setDisableDependentsState(a.getBoolean(
                  com.android.internal.R.styleable.SwitchPreference_disableDependentsState, false));
          a.recycle();
      }
  
      /**
       * Construct a new SwitchPreference with the given style options.
       *
       * @param context The Context that will style this preference
       * @param attrs Style attributes that differ from the default
       * @param defStyleAttr An attribute in the current theme that contains a
       *        reference to a style resource that supplies default values for
       *        the view. Can be 0 to not look for defaults.
       */
      public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
          this(context, attrs, defStyleAttr, 0);
      }
  
      /**
       * Construct a new SwitchPreference with the given style options.
       *
       * @param context The Context that will style this preference
       * @param attrs Style attributes that differ from the default
       */
      public SwitchPreference(Context context, AttributeSet attrs) {
          this(context, attrs, com.android.internal.R.attr.switchPreferenceStyle);
      }
  
      /**
       * Construct a new SwitchPreference with default style options.
       *
       * @param context The Context that will style this preference
       */
      public SwitchPreference(Context context) {
          this(context, null);
      }
  
      @Override
      protected void onBindView(View view) {
          super.onBindView(view);
  
          View checkableView = view.findViewById(com.android.internal.R.id.switch_widget);
          if (checkableView != null && checkableView instanceof Checkable) {
              if (checkableView instanceof Switch) {
                  final Switch switchView = (Switch) checkableView;
                  switchView.setOnCheckedChangeListener(null);
              }
  
              ((Checkable) checkableView).setChecked(mChecked);
  
              if (checkableView instanceof Switch) {
                  final Switch switchView = (Switch) checkableView;
                  switchView.setTextOn(mSwitchOn);
                  switchView.setTextOff(mSwitchOff);
                  switchView.setOnCheckedChangeListener(mListener);
              }
          }
  
          syncSummaryView(view);
      }
  
      /**
       * Set the text displayed on the switch widget in the on state.
       * This should be a very short string; one word if possible.
       *
       * @param onText Text to display in the on state
       */
      public void setSwitchTextOn(CharSequence onText) {
          mSwitchOn = onText;
          notifyChanged();
      }
  
      /**
       * Set the text displayed on the switch widget in the off state.
       * This should be a very short string; one word if possible.
       *
       * @param offText Text to display in the off state
       */
      public void setSwitchTextOff(CharSequence offText) {
          mSwitchOff = offText;
          notifyChanged();
      }
  
      /**
       * Set the text displayed on the switch widget in the on state.
       * This should be a very short string; one word if possible.
       *
       * @param resId The text as a string resource ID
       */
      public void setSwitchTextOn(@StringRes int resId) {
          setSwitchTextOn(getContext().getString(resId));
      }
  
      /**
       * Set the text displayed on the switch widget in the off state.
       * This should be a very short string; one word if possible.
       *
       * @param resId The text as a string resource ID
       */
      public void setSwitchTextOff(@StringRes int resId) {
          setSwitchTextOff(getContext().getString(resId));
      }
  
      /**
       * @return The text that will be displayed on the switch widget in the on state
       */
      public CharSequence getSwitchTextOn() {
          return mSwitchOn;
      }
  
      /**
       * @return The text that will be displayed on the switch widget in the off state
       */
      public CharSequence getSwitchTextOff() {
          return mSwitchOff;
      }
  }
  