11e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato/*
21e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Copyright (C) 2010 The Android Open Source Project
31e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
41e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * you may not use this file except in compliance with the License.
61e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * You may obtain a copy of the License at
71e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
81e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
101e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Unless required by applicable law or agreed to in writing, software
111e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * See the License for the specific language governing permissions and
141e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * limitations under the License.
151e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato */
161e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
171e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratopackage com.android.systemui.statusbar.policy;
181e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
191e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.content.ContentResolver;
201e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.content.Context;
211e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.os.RemoteException;
221e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.os.ServiceManager;
23bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurentimport android.os.Vibrator;
241e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.media.AudioManager;
251e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.provider.Settings;
261e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.util.Slog;
271e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.view.IWindowManager;
281e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.widget.CompoundButton;
291e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
301e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratopublic class VolumeController implements ToggleSlider.Listener {
311e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private static final String TAG = "StatusBar.VolumeController";
321e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private static final int STREAM = AudioManager.STREAM_NOTIFICATION;
331e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
341e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private Context mContext;
351e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private ToggleSlider mControl;
361e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private AudioManager mAudioManager;
371e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
381e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private boolean mMute;
391e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private int mVolume;
40bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent    // Is there a vibrator
41bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent    private final boolean mHasVibrator;
421e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
431e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public VolumeController(Context context, ToggleSlider control) {
441e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mContext = context;
451e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mControl = control;
46bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent
47bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent        Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
48bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent        mHasVibrator = vibrator == null ? false : vibrator.hasVibrator();
49bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent
501e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
511e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
521e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mMute = mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
531e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mVolume = mAudioManager.getStreamVolume(STREAM);
5448f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock
5548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        control.setOnChangedListener(this);
5648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    }
5748f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock
5848f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    @Override
5948f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    public void onInit(ToggleSlider control) {
601e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        control.setMax(mAudioManager.getStreamMaxVolume(STREAM));
611e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        control.setValue(mVolume);
621e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        control.setChecked(mMute);
631e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
641e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
651e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public void onChanged(ToggleSlider view, boolean tracking, boolean mute, int level) {
661e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        if (!tracking) {
671e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            if (mute) {
681e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato                mAudioManager.setRingerMode(
69bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent                        mHasVibrator ? AudioManager.RINGER_MODE_VIBRATE
701e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato                                     : AudioManager.RINGER_MODE_SILENT);
711e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            } else {
721e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato                mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
731e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato                mAudioManager.setStreamVolume(STREAM, level, AudioManager.FLAG_PLAY_SOUND);
741e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            }
751e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        }
761e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
771e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato}
78