AlarmVolumePreference.java revision e84dc3edceb9cc5e272816ed53cc31ad59eb16dc
1/* 2 * Copyright (C) 2015 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 17package com.android.deskclock.settings; 18 19import android.content.Context; 20import android.database.ContentObserver; 21import android.media.AudioManager; 22import android.provider.Settings; 23import android.support.v7.preference.Preference; 24import android.support.v7.preference.PreferenceViewHolder; 25import android.util.AttributeSet; 26import android.view.View; 27import android.widget.ImageView; 28import android.widget.SeekBar; 29 30import com.android.deskclock.R; 31import com.android.deskclock.RingtonePreviewKlaxon; 32import com.android.deskclock.data.DataModel; 33 34public class AlarmVolumePreference extends Preference { 35 36 private static final long ALARM_PREVIEW_DURATION_MS = 2000; 37 38 private SeekBar mSeekbar; 39 private ImageView mAlarmIcon; 40 private boolean mPreviewPlaying; 41 42 public AlarmVolumePreference(Context context, AttributeSet attrs) { 43 super(context, attrs); 44 } 45 46 @Override 47 public void onBindViewHolder(PreferenceViewHolder holder) { 48 super.onBindViewHolder(holder); 49 50 // Disable click feedback for this preference. 51 holder.itemView.setClickable(false); 52 53 final Context context = getContext(); 54 final AudioManager audioManager = 55 (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 56 mSeekbar = (SeekBar) holder.findViewById(R.id.alarm_volume_slider); 57 mSeekbar.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM)); 58 mSeekbar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_ALARM)); 59 mAlarmIcon = (ImageView) holder.findViewById(R.id.alarm_icon); 60 updateIcon(); 61 62 final ContentObserver volumeObserver = new ContentObserver(mSeekbar.getHandler()) { 63 @Override 64 public void onChange(boolean selfChange) { 65 // Volume was changed elsewhere, update our slider. 66 mSeekbar.setProgress(audioManager.getStreamVolume( 67 AudioManager.STREAM_ALARM)); 68 } 69 }; 70 71 mSeekbar.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 72 @Override 73 public void onViewAttachedToWindow(View v) { 74 context.getContentResolver().registerContentObserver(Settings.System.CONTENT_URI, 75 true, volumeObserver); 76 } 77 78 @Override 79 public void onViewDetachedFromWindow(View v) { 80 context.getContentResolver().unregisterContentObserver(volumeObserver); 81 } 82 }); 83 84 85 mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 86 @Override 87 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 88 if (fromUser) { 89 audioManager.setStreamVolume( 90 AudioManager.STREAM_ALARM, seekBar.getProgress(), 0); 91 } 92 updateIcon(); 93 } 94 95 @Override 96 public void onStartTrackingTouch(SeekBar seekBar) { 97 } 98 99 @Override 100 public void onStopTrackingTouch(SeekBar seekBar) { 101 if (!mPreviewPlaying) { 102 RingtonePreviewKlaxon.start( 103 context, DataModel.getDataModel().getDefaultAlarmRingtoneUri()); 104 mPreviewPlaying = true; 105 106 seekBar.postDelayed(new Runnable() { 107 @Override 108 public void run() { 109 RingtonePreviewKlaxon.stop(context); 110 mPreviewPlaying = false; 111 } 112 }, ALARM_PREVIEW_DURATION_MS); 113 } 114 } 115 }); 116 } 117 118 private void updateIcon() { 119 mAlarmIcon.setImageResource(mSeekbar.getProgress() == 0 ? 120 R.drawable.ic_alarm_off_24dp : R.drawable.ic_alarm_small_24dp); 121 } 122} 123