/*
* 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 com.bwx.bequick.Constants;
import com.bwx.bequick.MainSettingsActivity;
import com.bwx.bequick.R;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnCancelListener;
import android.media.AudioManager;
import android.provider.Settings;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class VolumeDialog implements OnCancelListener, OnClickListener, OnSeekBarChangeListener, OnCheckedChangeListener {
// from android.provider.Settings
public static final String NOTIFICATIONS_USE_RING_VOLUME = "notifications_use_ring_volume";
class Holder {
int index;
int max;
TextView text;
SeekBar seek;
}
private static final int[] STREAM_TYPES = {
AudioManager.STREAM_RING,
AudioManager.STREAM_NOTIFICATION,
AudioManager.STREAM_MUSIC,
AudioManager.STREAM_ALARM,
AudioManager.STREAM_VOICE_CALL,
AudioManager.STREAM_SYSTEM
};
private static final int[] TEXT_IDS = {
R.id.text1, R.id.text2, R.id.text3, R.id.text4, R.id.text5, R.id.text6
};
private static final int[] SLIDER_IDS = {
R.id.slider1, R.id.slider2, R.id.slider3, R.id.slider4, R.id.slider5, R.id.slider6
};
private AudioManager mManager;
private Activity mActivity;
private Dialog mDialog;
private Holder mRingerHolder;
private Holder mNotificationHolder;
private boolean mInitialChecked;
private boolean mChecked;
public VolumeDialog(MainSettingsActivity activity) {
mActivity = activity;
}
public void show() {
Dialog dialog = mDialog;
AudioManager manager = mManager;
if (dialog == null) {
mManager = manager = (AudioManager) mActivity.getSystemService(Activity.AUDIO_SERVICE);
dialog = new Dialog(mActivity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.settings_volume_streams);
dialog.setOnCancelListener(this);
dialog.findViewById(R.id.button1).setOnClickListener(this);
dialog.findViewById(R.id.button2).setOnClickListener(this);
CheckBox checkbox = (CheckBox) dialog.findViewById(R.id.checkbox1);
checkbox.setOnCheckedChangeListener(this);
mDialog = dialog;
}
boolean useRingerVolume = useRingerVolume();
Holder holder; int max, value; TextView text; SeekBar seek;
int size = STREAM_TYPES.length;
for (int i=0; i<size; i++) {
if (useRingerVolume && i == 1) {
value = manager.getStreamVolume(STREAM_TYPES[i-1]); // use ringer volume
} else {
value = manager.getStreamVolume(STREAM_TYPES[i]);
}
max = manager.getStreamMaxVolume(STREAM_TYPES[i]);
text = (TextView) dialog.findViewById(TEXT_IDS[i]);;
seek = (SeekBar) dialog.findViewById(SLIDER_IDS[i]);
holder = new Holder();
holder.index = i;
holder.text = text;
holder.max = max;
holder.seek = seek;
seek.setTag(holder);
seek.setMax(holder.max);
seek.setProgress(value);
seek.setOnSeekBarChangeListener(this);
text.setText(value + "/" + max);
if (i == 0) {
mRingerHolder = holder;
} else if (i == 1) {
mNotificationHolder = holder;
}
}
CheckBox checkbox = (CheckBox) dialog.findViewById(R.id.checkbox1);
checkbox.setChecked(useRingerVolume);
mInitialChecked = mChecked = checkbox.isChecked();
dialog.show();
}
public void onCancel(DialogInterface dialog) {
hide();
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1: {
AudioManager manager = mManager; Dialog dialog = mDialog;
int size = STREAM_TYPES.length; SeekBar seek;
for (int i=size; i-->0;) {
//if (i == 1 && mChecked) continue; // ignore notification volume - we use ringer volume instead
seek = (SeekBar) dialog.findViewById(SLIDER_IDS[i]);
manager.setStreamVolume(STREAM_TYPES[i], seek.getProgress(), 0);
}
Activity activity = mActivity;
// check if we have to switch silent / not silen mode
int ringerVolume = manager.getStreamVolume(AudioManager.STREAM_RING);
int notifVolume = manager.getStreamVolume(AudioManager.STREAM_NOTIFICATION);
int ringerMode = manager.getRingerMode();
if (ringerVolume > 0 && ringerMode == AudioManager.RINGER_MODE_SILENT) {
Toast.makeText(activity, activity.getString(R.string.msg_not_silent_warning, ringerVolume), Toast.LENGTH_LONG).show();
} else if (ringerVolume == 0 && ringerMode == AudioManager.RINGER_MODE_NORMAL) {
Toast.makeText(activity, R.string.msg_zero_ringer_warning, Toast.LENGTH_LONG).show();
} else if (notifVolume == 0 && ringerMode == AudioManager.RINGER_MODE_NORMAL) {
Toast.makeText(activity, R.string.msg_zero_notification_warning, Toast.LENGTH_LONG).show();
}
// send internal volume changed notification
activity.sendBroadcast(new Intent(Constants.ACTION_VOLUME_UPDATED));
hide();
break;
}
case R.id.button2: {
// revert initial checked state
if (mChecked != mInitialChecked) setUseRingerVolume(mInitialChecked);
hide();
break;
}
}
}
public void hide() {
if (mDialog != null) mDialog.hide();
}
public void dismiss() {
if (mDialog != null) mDialog.dismiss();
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
Holder holder = (Holder) seekBar.getTag();
String text = progress + "/" + holder.max;
holder.text.setText(text);
if (mChecked && holder == mRingerHolder) {
mNotificationHolder.seek.setProgress(mRingerHolder.seek.getProgress());
mNotificationHolder.text.setText(mRingerHolder.text.getText());
}
}
}
public void onStartTrackingTouch(SeekBar seekBar) {
// do nothing
}
public void onStopTrackingTouch(SeekBar seekBar) {
// do nothing
}
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mChecked = isChecked;
// update flag immediately
setUseRingerVolume(mChecked);
SeekBar seek = mNotificationHolder.seek;
if (isChecked) {
seek.setEnabled(false);
seek.setProgress(mRingerHolder.seek.getProgress());
mNotificationHolder.text.setText(mRingerHolder.text.getText());
} else {
seek.setEnabled(true);
}
}
private boolean useRingerVolume() {
return Settings.System.getInt(mActivity.getContentResolver(), NOTIFICATIONS_USE_RING_VOLUME, 1) == 1;
}
private void setUseRingerVolume(boolean checked) {
Settings.System.putInt(mActivity.getContentResolver(), NOTIFICATIONS_USE_RING_VOLUME, checked ? 1 : 0);
}
}