/* * Copyright (C) 2010 beworx.com * * 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 com.bwx.bequick.handlers; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import com.bwx.bequick.Constants; import com.bwx.bequick.MainSettingsActivity; import com.bwx.bequick.R; import com.bwx.bequick.fwk.RangeSetting; import com.bwx.bequick.fwk.Setting; import com.bwx.bequick.fwk.SettingHandler; public class MasterVolumeSettingHandler extends SettingHandler { //private static final String TAG = "MasterVolumeSettingHandler"; private AudioManager mManager; // cache private BroadcastReceiver mVolumeReceiver; private IntentFilter mFilter; class VolumeChangedReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { updateSettingState(); } } public MasterVolumeSettingHandler(Setting setting) { super(setting); } @Override public void activate(MainSettingsActivity activity) throws Exception { mActivity = activity; AudioManager manager = mManager; if (manager == null) { manager = (AudioManager) mActivity.getSystemService(Activity.AUDIO_SERVICE); mManager = manager; } updateSettingState(); // register volume receiver BroadcastReceiver receiver = mVolumeReceiver; IntentFilter filter = mFilter; if (receiver == null) { mVolumeReceiver = receiver = new VolumeChangedReceiver(); mFilter = filter = new IntentFilter(Constants.ACTION_VOLUME_UPDATED); } activity.registerReceiver(receiver, filter); } private void updateSettingState() { AudioManager manager = mManager; // get current volumes int v1 = manager.getStreamVolume(AudioManager.STREAM_MUSIC); int v2 = manager.getStreamVolume(AudioManager.STREAM_RING); int v3 = manager.getStreamVolume(AudioManager.STREAM_NOTIFICATION); int v4 = manager.getStreamVolume(AudioManager.STREAM_ALARM); // get max value for state int maxv1 = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int maxv2 = manager.getStreamMaxVolume(AudioManager.STREAM_RING); // get relative values in % int relv2 = Math.round(100f / maxv2 * v2); int relv1 = Math.round(100f / maxv1 * v1); int relv = Math.max(relv2 , relv1); // max between ring & music in % System.out.println("Music: " + relv1 + ", ringer: " + relv2 + ", max: " + relv); RangeSetting setting = (RangeSetting) mSetting; setting.value = round(15f / 100 * relv); // value 1 .. 15 setting.descr = mActivity.getString(R.string.txt_master_volume_desc, v2, v3, v1, v4); setting.updateView(); } @Override public void deactivate() { mActivity.unregisterReceiver(mVolumeReceiver); } @Override public void onSelected(int buttonIndex) { // do nothing } @Override public void onSwitched(boolean isSwitched) { // do nothing } @Override public void onValueChanged(int value) { RangeSetting setting = (RangeSetting) mSetting; setting.value = value; int v = (int) (100f / 15 * value); // value in % System.out.println("New value: " + setting.value + ", value%=" + v); AudioManager manager = mManager; // get max value for state int maxv1 = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int maxv2 = manager.getStreamMaxVolume(AudioManager.STREAM_RING); int maxv3 = manager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION); int maxv4 = manager.getStreamMaxVolume(AudioManager.STREAM_ALARM); // get current volumes int v1, v2, v3, v4; manager.setStreamVolume(AudioManager.STREAM_MUSIC, v1 = round(maxv1 * v / 100f), AudioManager.FLAG_PLAY_SOUND); manager.setStreamVolume(AudioManager.STREAM_RING, v2 = round(maxv2 * v / 100f), 0); manager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, v3 = round(maxv3 * v / 100f), 0); manager.setStreamVolume(AudioManager.STREAM_ALARM, v4 = round(maxv4 * v / 100f), 0); if (manager.getRingerMode() == AudioManager.RINGER_MODE_SILENT & v2 > 0) { manager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); } else if (manager.getRingerMode() != AudioManager.RINGER_MODE_SILENT && v2 == 0) { manager.setRingerMode(AudioManager.RINGER_MODE_SILENT); } setting.descr = mActivity.getString(R.string.txt_master_volume_desc, v2, v3, v1, v4); setting.updateView(); } public static int round(float value) { if (value > 0.2f && value < 0.5f) { return 1; } else { return Math.round(value); } } }