2 * Copyright (C) 2014 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.settings.notification;
19 import android.content.ContentResolver;
20 import android.content.Context;
21 import android.media.AudioManager;
22 import android.net.Uri;
23 import android.preference.PreferenceManager;
24 import android.preference.SeekBarPreference;
25 import android.preference.SeekBarVolumizer;
26 import android.util.AttributeSet;
27 import android.util.Log;
28 import android.view.View;
29 import android.widget.ImageView;
30 import android.widget.SeekBar;
32 import com.android.settings.R;
34 /** A slider preference that directly controls an audio stream volume (no dialog) **/
35 public class VolumeSeekBarPreference extends SeekBarPreference
36 implements PreferenceManager.OnActivityStopListener {
37 private static final String TAG = "VolumeSeekBarPreference";
40 private SeekBar mSeekBar;
41 private SeekBarVolumizer mVolumizer;
42 private Callback mCallback;
43 private ImageView mIconView;
45 public VolumeSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
47 super(context, attrs, defStyleAttr, defStyleRes);
50 public VolumeSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
51 this(context, attrs, defStyleAttr, 0);
54 public VolumeSeekBarPreference(Context context, AttributeSet attrs) {
55 this(context, attrs, 0);
58 public VolumeSeekBarPreference(Context context) {
62 public void setStream(int stream) {
66 public void setCallback(Callback callback) {
71 public void onActivityStop() {
72 if (mVolumizer != null) {
78 protected void onBindView(View view) {
79 super.onBindView(view);
81 Log.w(TAG, "No stream found, not binding volumizer");
84 getPreferenceManager().registerOnActivityStopListener(this);
85 final SeekBar seekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar);
86 if (seekBar == mSeekBar) return;
88 final SeekBarVolumizer.Callback sbvc = new SeekBarVolumizer.Callback() {
90 public void onSampleStarting(SeekBarVolumizer sbv) {
91 if (mCallback != null) {
92 mCallback.onSampleStarting(sbv);
96 final Uri sampleUri = mStream == AudioManager.STREAM_MUSIC ? getMediaVolumeUri() : null;
97 if (mVolumizer == null) {
98 mVolumizer = new SeekBarVolumizer(getContext(), mStream, sampleUri, sbvc) {
99 // we need to piggyback on SBV's SeekBar listener to update our icon
101 public void onProgressChanged(SeekBar seekBar, int progress,
103 super.onProgressChanged(seekBar, progress, fromTouch);
104 mCallback.onStreamValueChanged(mStream, progress);
109 mVolumizer.setSeekBar(mSeekBar);
110 mIconView = (ImageView) view.findViewById(com.android.internal.R.id.icon);
111 mCallback.onStreamValueChanged(mStream, mSeekBar.getProgress());
114 // during initialization, this preference is the SeekBar listener
116 public void onProgressChanged(SeekBar seekBar, int progress,
118 super.onProgressChanged(seekBar, progress, fromTouch);
119 mCallback.onStreamValueChanged(mStream, progress);
122 public void showIcon(int resId) {
123 // Instead of using setIcon, which will trigger listeners, this just decorates the
124 // preference temporarily with a new icon.
125 if (mIconView != null) {
126 mIconView.setImageResource(resId);
130 private Uri getMediaVolumeUri() {
131 return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
132 + getContext().getPackageName()
133 + "/" + R.raw.media_volume);
136 public interface Callback {
137 void onSampleStarting(SeekBarVolumizer sbv);
138 void onStreamValueChanged(int stream, int progress);