mFlags = flags;
mDevice = device;
}
+
+ @Override
+ public String toString() {
+ return new StringBuilder().append("{streamType=").append(mStreamType).append(",index=")
+ .append(mIndex).append(",flags=").append(mFlags).append(",device=")
+ .append(mDevice).append('}').toString();
+ }
};
private void onSetStreamVolume(int streamType, int index, int flags, int device) {
if ((mMcc != mcc) || ((mMcc == 0) && force)) {
mSafeMediaVolumeIndex = mContext.getResources().getInteger(
com.android.internal.R.integer.config_safe_media_volume_index) * 10;
- boolean safeMediaVolumeEnabled = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_safe_media_volume_enabled);
+ boolean safeMediaVolumeEnabled =
+ SystemProperties.getBoolean("audio.safemedia.force", false)
+ || mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_safe_media_volume_enabled);
// The persisted state is either "disabled" or "active": this is the state applied
// next time we boot and cannot be "inactive"
// SAFE_MEDIA_VOLUME_DISABLED according to country option. If not SAFE_MEDIA_VOLUME_DISABLED, it
// can be set to SAFE_MEDIA_VOLUME_INACTIVE by calling AudioService.disableSafeMediaVolume()
// (when user opts out).
- private final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0;
- private final int SAFE_MEDIA_VOLUME_DISABLED = 1;
- private final int SAFE_MEDIA_VOLUME_INACTIVE = 2;
- private final int SAFE_MEDIA_VOLUME_ACTIVE = 3;
+ private static final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0;
+ private static final int SAFE_MEDIA_VOLUME_DISABLED = 1;
+ private static final int SAFE_MEDIA_VOLUME_INACTIVE = 2; // confirmed
+ private static final int SAFE_MEDIA_VOLUME_ACTIVE = 3; // unconfirmed
private Integer mSafeMediaVolumeState;
private int mMcc = 0;
pw.println("\nAudio routes:");
pw.print(" mMainType=0x"); pw.println(Integer.toHexString(mCurAudioRoutes.mMainType));
pw.print(" mBluetoothName="); pw.println(mCurAudioRoutes.mBluetoothName);
+
+ pw.println("\nOther state:");
pw.print(" mVolumeController="); pw.println(mVolumeController);
+ pw.print(" mSafeMediaVolumeState=");
+ pw.println(safeMediaVolumeStateToString(mSafeMediaVolumeState));
+ pw.print(" mSafeMediaVolumeIndex="); pw.println(mSafeMediaVolumeIndex);
+ pw.print(" mPendingVolumeCommand="); pw.println(mPendingVolumeCommand);
+ pw.print(" mMusicActiveMs="); pw.println(mMusicActiveMs);
+ }
+
+ private static String safeMediaVolumeStateToString(Integer state) {
+ switch(state) {
+ case SAFE_MEDIA_VOLUME_NOT_CONFIGURED: return "SAFE_MEDIA_VOLUME_NOT_CONFIGURED";
+ case SAFE_MEDIA_VOLUME_DISABLED: return "SAFE_MEDIA_VOLUME_DISABLED";
+ case SAFE_MEDIA_VOLUME_INACTIVE: return "SAFE_MEDIA_VOLUME_INACTIVE";
+ case SAFE_MEDIA_VOLUME_ACTIVE: return "SAFE_MEDIA_VOLUME_ACTIVE";
+ }
+ return null;
}
// Inform AudioFlinger of our device's low RAM attribute
import android.widget.SeekBar.OnSeekBarChangeListener;
import com.android.internal.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.ZenModeController;
import java.io.FileDescriptor;
private static final int TIMEOUT_DELAY = 3000;
private static final int TIMEOUT_DELAY_SHORT = 1500;
private static final int TIMEOUT_DELAY_COLLAPSED = 4500;
+ private static final int TIMEOUT_DELAY_SAFETY_WARNING = 5000;
private static final int TIMEOUT_DELAY_EXPANDED = 10000;
private static final int MSG_VOLUME_CHANGED = 0;
private ToneGenerator mToneGenerators[];
private Vibrator mVibrator;
- private static AlertDialog sConfirmSafeVolumeDialog;
- private static Object sConfirmSafeVolumeLock = new Object();
+ private static AlertDialog sSafetyWarning;
+ private static Object sSafetyWarningLock = new Object();
- private static class WarningDialogReceiver extends BroadcastReceiver
- implements DialogInterface.OnDismissListener {
+ private static class SafetyWarning extends SystemUIDialog
+ implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener {
private final Context mContext;
- private final Dialog mDialog;
private final VolumePanel mVolumePanel;
+ private final AudioManager mAudioManager;
- WarningDialogReceiver(Context context, Dialog dialog, VolumePanel volumePanel) {
+ SafetyWarning(Context context, VolumePanel volumePanel, AudioManager audioManager) {
+ super(context);
mContext = context;
- mDialog = dialog;
mVolumePanel = volumePanel;
+ mAudioManager = audioManager;
+
+ setMessage(mContext.getString(com.android.internal.R.string.safe_media_volume_warning));
+ setButton(DialogInterface.BUTTON_POSITIVE,
+ mContext.getString(com.android.internal.R.string.yes), this);
+ setButton(DialogInterface.BUTTON_NEGATIVE,
+ mContext.getString(com.android.internal.R.string.no), (OnClickListener) null);
+ setOnDismissListener(this);
+
IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
- context.registerReceiver(this, filter);
+ context.registerReceiver(mReceiver, filter);
}
@Override
- public void onReceive(Context context, Intent intent) {
- mDialog.cancel();
- cleanUp();
+ public void onClick(DialogInterface dialog, int which) {
+ mAudioManager.disableSafeMediaVolume();
}
@Override
public void onDismiss(DialogInterface unused) {
- mContext.unregisterReceiver(this);
+ mContext.unregisterReceiver(mReceiver);
cleanUp();
}
private void cleanUp() {
- synchronized (sConfirmSafeVolumeLock) {
- sConfirmSafeVolumeDialog = null;
+ synchronized (sSafetyWarningLock) {
+ sSafetyWarning = null;
}
mVolumePanel.forceTimeout(0);
mVolumePanel.updateStates();
}
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
+ if (LOGD) Log.d(TAG, "Received ACTION_CLOSE_SYSTEM_DIALOGS");
+ cancel();
+ cleanUp();
+ }
+ }
+ };
}
public VolumePanel(Context context, ZenModeController zenController) {
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isShowing() && event.getAction() == MotionEvent.ACTION_OUTSIDE &&
- sConfirmSafeVolumeDialog == null) {
+ sSafetyWarning == null) {
forceTimeout(0);
return true;
}
pw.print(" isShowing()="); pw.println(isShowing());
pw.print(" mCallback="); pw.println(mCallback);
pw.print(" sConfirmSafeVolumeDialog=");
- pw.println(sConfirmSafeVolumeDialog != null ? "<not null>" : null);
+ pw.println(sSafetyWarning != null ? "<not null>" : null);
pw.print(" mActiveStreamType="); pw.println(mActiveStreamType);
pw.print(" mStreamControls=");
if (mStreamControls == null) {
sc.seekbarView.setEnabled(!fixedVolume);
} else if (fixedVolume ||
(sc.streamType != mAudioManager.getMasterStreamType() && muted) ||
- (sConfirmSafeVolumeDialog != null)) {
+ (sSafetyWarning != null)) {
sc.seekbarView.setEnabled(false);
} else if (isRinger && mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
sc.seekbarView.setEnabled(false);
}
private void updateTimeoutDelay() {
- mTimeoutDelay = mActiveStreamType == AudioManager.STREAM_MUSIC ? TIMEOUT_DELAY_SHORT
+ mTimeoutDelay = sSafetyWarning != null ? TIMEOUT_DELAY_SAFETY_WARNING
+ : mActiveStreamType == AudioManager.STREAM_MUSIC ? TIMEOUT_DELAY_SHORT
: mZenPanelExpanded ? TIMEOUT_DELAY_EXPANDED
: isZenPanelVisible() ? TIMEOUT_DELAY_COLLAPSED
: TIMEOUT_DELAY;
}
protected void onDisplaySafeVolumeWarning(int flags) {
- if ((flags & AudioManager.FLAG_SHOW_UI) != 0 || isShowing()) {
- synchronized (sConfirmSafeVolumeLock) {
- if (sConfirmSafeVolumeDialog != null) {
+ if ((flags & (AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_SHOW_UI_WARNINGS)) != 0
+ || isShowing()) {
+ synchronized (sSafetyWarningLock) {
+ if (sSafetyWarning != null) {
return;
}
- sConfirmSafeVolumeDialog = new AlertDialog.Builder(mContext)
- .setMessage(com.android.internal.R.string.safe_media_volume_warning)
- .setPositiveButton(com.android.internal.R.string.yes,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- mAudioManager.disableSafeMediaVolume();
- }
- })
- .setNegativeButton(com.android.internal.R.string.no, null)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .create();
- final WarningDialogReceiver warning = new WarningDialogReceiver(mContext,
- sConfirmSafeVolumeDialog, this);
-
- sConfirmSafeVolumeDialog.setOnDismissListener(warning);
- sConfirmSafeVolumeDialog.getWindow().setType(
- WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
- sConfirmSafeVolumeDialog.show();
+ sSafetyWarning = new SafetyWarning(mContext, this, mAudioManager);
+ sSafetyWarning.show();
}
updateStates();
}
mCallback.onVisible(false);
}
}
- synchronized (sConfirmSafeVolumeLock) {
- if (sConfirmSafeVolumeDialog != null) {
- sConfirmSafeVolumeDialog.dismiss();
+ synchronized (sSafetyWarningLock) {
+ if (sSafetyWarning != null) {
+ if (LOGD) Log.d(mTag, "SafetyWarning timeout");
+ sSafetyWarning.dismiss();
}
}
break;