1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.widget;
18 
19 import android.content.Context;
20 import android.content.res.TypedArray;
21 import android.graphics.drawable.Drawable;
22 import android.util.AttributeSet;
23 import android.view.View;
24 import android.widget.SeekBar;
25 import android.widget.TextView;
26 
27 import androidx.annotation.Nullable;
28 import androidx.core.content.res.TypedArrayUtils;
29 import androidx.preference.PreferenceViewHolder;
30 
31 import com.android.settings.R;
32 
33 /** A slider preference with left and right labels **/
34 public class LabeledSeekBarPreference extends SeekBarPreference {
35 
36     private final int mTextStartId;
37     private final int mTextEndId;
38     private final int mTickMarkId;
39     private OnPreferenceChangeListener mStopListener;
40     @Nullable
41     private CharSequence mSummary;
42 
LabeledSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)43     public LabeledSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
44             int defStyleRes) {
45 
46         super(context, attrs, defStyleAttr, defStyleRes);
47         setLayoutResource(R.layout.preference_labeled_slider);
48 
49         final TypedArray styledAttrs = context.obtainStyledAttributes(attrs,
50                 R.styleable.LabeledSeekBarPreference);
51         mTextStartId = styledAttrs.getResourceId(
52                 R.styleable.LabeledSeekBarPreference_textStart,
53                 R.string.summary_placeholder);
54         mTextEndId = styledAttrs.getResourceId(
55                 R.styleable.LabeledSeekBarPreference_textEnd,
56                 R.string.summary_placeholder);
57         mTickMarkId = styledAttrs.getResourceId(
58                 R.styleable.LabeledSeekBarPreference_tickMark, /* defValue= */ 0);
59         mSummary = styledAttrs.getText(R.styleable.Preference_android_summary);
60         styledAttrs.recycle();
61     }
62 
LabeledSeekBarPreference(Context context, AttributeSet attrs)63     public LabeledSeekBarPreference(Context context, AttributeSet attrs) {
64         this(context, attrs, TypedArrayUtils.getAttr(context,
65                 androidx.preference.R.attr.seekBarPreferenceStyle,
66                 com.android.internal.R.attr.seekBarPreferenceStyle), 0);
67     }
68 
69     @Override
onBindViewHolder(PreferenceViewHolder holder)70     public void onBindViewHolder(PreferenceViewHolder holder) {
71         super.onBindViewHolder(holder);
72 
73         final TextView startText = (TextView) holder.findViewById(android.R.id.text1);
74         final TextView endText = (TextView) holder.findViewById(android.R.id.text2);
75         startText.setText(mTextStartId);
76         endText.setText(mTextEndId);
77 
78         if (mTickMarkId != 0) {
79             final Drawable tickMark = getContext().getDrawable(mTickMarkId);
80             final SeekBar seekBar = (SeekBar) holder.findViewById(
81                     com.android.internal.R.id.seekbar);
82             seekBar.setTickMark(tickMark);
83         }
84 
85         final TextView summary = (TextView) holder.findViewById(android.R.id.summary);
86         if (mSummary != null) {
87             summary.setText(mSummary);
88             summary.setVisibility(View.VISIBLE);
89         } else {
90             summary.setText(null);
91             summary.setVisibility(View.GONE);
92         }
93     }
94 
setOnPreferenceChangeStopListener(OnPreferenceChangeListener listener)95     public void setOnPreferenceChangeStopListener(OnPreferenceChangeListener listener) {
96         mStopListener = listener;
97     }
98 
99     @Override
onStopTrackingTouch(SeekBar seekBar)100     public void onStopTrackingTouch(SeekBar seekBar) {
101         super.onStopTrackingTouch(seekBar);
102 
103         if (mStopListener != null) {
104             mStopListener.onPreferenceChange(this, seekBar.getProgress());
105         }
106     }
107 
108     @Override
setSummary(CharSequence summary)109     public void setSummary(CharSequence summary) {
110         super.setSummary(summary);
111         mSummary = summary;
112         notifyChanged();
113     }
114 
115     @Override
setSummary(int summaryResId)116     public void setSummary(int summaryResId) {
117         super.setSummary(summaryResId);
118         mSummary = getContext().getText(summaryResId);
119         notifyChanged();
120     }
121 
122     @Override
getSummary()123     public CharSequence getSummary() {
124         return mSummary;
125     }
126 }
127 
128