summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdnan Begovic <adnan@cyngn.com>2013-11-04 00:58:57 +0000
committerGerrit Code Review <gerrit@cyanogenmod.org>2015-12-18 13:03:59 -0800
commit46a77b33666c9407845440516685eb4cbef41ff2 (patch)
tree2c503f0f7a08dc82954c6e2564762c546e3971f3
parent9ca8d4c76a2f80d5a87225d09d0155a43d2263dc (diff)
downloadframeworks_base-46a77b33666c9407845440516685eb4cbef41ff2.zip
frameworks_base-46a77b33666c9407845440516685eb4cbef41ff2.tar.gz
frameworks_base-46a77b33666c9407845440516685eb4cbef41ff2.tar.bz2
Port over linked volumes from 12.1
Implement linked volumes and add upgrade path. Change-Id: Ibbeff656fcaaa4a2ff79de530b48b216df271b21 frameworks: read VOLUME_LINK_NOTIFICATION from proper table Change-Id: I15e9caa18f307a51a732c7a59013bbbb234a7477 Signed-off-by: Roman Birg <roman@cyngn.com> (cherry picked from commit 1b7cfa1716017e0d03c9693428c21d8e11c5dc0a) fix Notification volume slider linking Change-Id: I0f74485f5c8c2aa7698cf9ba1c60c2c8c967798d Signed-off-by: Roman Birg <roman@cyngn.com> Improve SeekBarVolumizer behavior with unlinked streams - Fix notification stream enabling at 0 volume - Fix the notification slider being set when moving ringer stream Change-Id: If3705cc833c07f726f8ad7b1ec79a42e86e8ff22 Signed-off-by: Roman Birg <roman@cyngn.com> base: Fix notification sounds for wifi only devices The linking of voice & notification doesn't take into account the fact that a device may not actually have voice capabilities. Whenever checking whether or not to link notification and ring volumes, also verify that the device really is voice capable. Change-Id: Iae49302d3b5934d36b182e289e4975f5dd85b834 frameworks: fix setting up linked notification stream on boot updateStreamVolumeAlias() was previously responsible for checking the linked notification variable and mapping the notification stream, but the setting to read whether the notifications were linked was read in after that method had run which was responsible for linking them. Extract the logic and re-run it again after reading the persisted settings. Change-Id: Ia62bf3ca072def54ec6ebf4f9e865d9c913e3bc4 Signed-off-by: Roman Birg <roman@cyngn.com> fixup volume stream linking - Make the SeekBarVolumizer move notification and ringer streams when linked and moving ringer. - Fix initial state causing volume stream seek bar to be set to 0 initially - Clean up AudioService initialization code Change-Id: Ia11a7a392e5eb3ef862147843e365d5f20eaf90a Signed-off-by: Roman Birg <roman@cyngn.com>
-rw-r--r--core/java/android/preference/SeekBarVolumizer.java19
-rw-r--r--core/java/android/provider/Settings.java6
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java2
-rwxr-xr-xpackages/SystemUI/res/drawable-hdpi/ic_ringer_audible.pngbin0 -> 783 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-mdpi/ic_ringer_audible.pngbin0 -> 523 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-xhdpi/ic_ringer_audible.pngbin0 -> 1021 bytes
-rwxr-xr-xpackages/SystemUI/res/drawable-xxhdpi/ic_ringer_audible.pngbin0 -> 1495 bytes
-rw-r--r--packages/SystemUI/res/drawable/ic_notification_audible.xml (renamed from packages/SystemUI/res/drawable/ic_volume_ringer.xml)0
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java84
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java20
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java29
11 files changed, 126 insertions, 34 deletions
diff --git a/core/java/android/preference/SeekBarVolumizer.java b/core/java/android/preference/SeekBarVolumizer.java
index 2445bc2..1754e6e 100644
--- a/core/java/android/preference/SeekBarVolumizer.java
+++ b/core/java/android/preference/SeekBarVolumizer.java
@@ -59,6 +59,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
private final NotificationManager mNotificationManager;
private final int mStreamType;
private final int mMaxStreamVolume;
+ private final boolean mVoiceCapable;
private boolean mAffectedByRingerMode;
private boolean mNotificationOrRing;
private final Receiver mReceiver = new Receiver();
@@ -110,12 +111,19 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
}
}
mDefaultUri = defaultUri;
+ mVoiceCapable = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_voice_capable);
}
private static boolean isNotificationOrRing(int stream) {
return stream == AudioManager.STREAM_RING || stream == AudioManager.STREAM_NOTIFICATION;
}
+ private boolean isNotificationStreamLinked() {
+ return mVoiceCapable && Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.VOLUME_LINK_NOTIFICATION, 1) == 1;
+ }
+
public void setSeekBar(SeekBar seekBar) {
if (mSeekBar != null) {
mSeekBar.setOnSeekBarChangeListener(null);
@@ -139,13 +147,19 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
mSeekBar.setProgress(mLastAudibleStreamVolume);
} else if (mNotificationOrRing && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
mSeekBar.setProgress(0);
+ mSeekBar.setEnabled(enableSeekBar());
} else if (mMuted) {
mSeekBar.setProgress(0);
} else {
+ mSeekBar.setEnabled(enableSeekBar());
mSeekBar.setProgress(mLastProgress > -1 ? mLastProgress : mOriginalStreamVolume);
}
}
+ private boolean enableSeekBar() {
+ return !(mStreamType == AudioManager.STREAM_NOTIFICATION && isNotificationStreamLinked());
+ }
+
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
@@ -250,7 +264,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
- if (fromTouch) {
+ if (fromTouch && enableSeekBar()) {
postSetVolume(progress);
}
if (mCallback != null) {
@@ -415,7 +429,8 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
}
private void updateVolumeSlider(int streamType, int streamValue) {
- final boolean streamMatch = mNotificationOrRing ? isNotificationOrRing(streamType)
+ final boolean streamMatch = mNotificationOrRing && isNotificationStreamLinked()
+ ? isNotificationOrRing(streamType)
: (streamType == mStreamType);
if (mSeekBar != null && streamMatch && streamValue != -1) {
final boolean muted = mAudioManager.isStreamMute(mStreamType)
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e107fd1..6e11c42 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1500,6 +1500,7 @@ public final class Settings {
MOVED_TO_SECURE.add(System.KEYBOARD_BRIGHTNESS);
MOVED_TO_SECURE.add(System.BUTTON_BRIGHTNESS);
MOVED_TO_SECURE.add(System.BUTTON_BACKLIGHT_TIMEOUT);
+ MOVED_TO_SECURE.add(Secure.VOLUME_LINK_NOTIFICATION);
}
private static final HashSet<String> MOVED_TO_GLOBAL;
@@ -6032,6 +6033,11 @@ public final class Settings {
public static final String CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED =
"camera_double_tap_power_gesture_disabled";
+ /**
+ * Boolean value whether to link ringtone and notification volume
+ * @hide
+ */
+ public static final String VOLUME_LINK_NOTIFICATION = "volume_link_notification";
/**
* This are the settings to be backed up.
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index b3ec295..02e4e88 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -1932,7 +1932,7 @@ class DatabaseHelper extends SQLiteOpenHelper {
if (upgradeVersion < 116) {
moveSettingsToNewTable(db, TABLE_SYSTEM, TABLE_SECURE,
- new String[]{CMSettings.Secure.VOLUME_LINK_NOTIFICATION}, true);
+ new String[]{Settings.Secure.VOLUME_LINK_NOTIFICATION}, true);
if (mUserHandle == UserHandle.USER_OWNER) {
db.beginTransaction();
SQLiteStatement stmt = null;
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_ringer_audible.png b/packages/SystemUI/res/drawable-hdpi/ic_ringer_audible.png
new file mode 100755
index 0000000..03a8f69
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/ic_ringer_audible.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_ringer_audible.png b/packages/SystemUI/res/drawable-mdpi/ic_ringer_audible.png
new file mode 100755
index 0000000..36ba5ba
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/ic_ringer_audible.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_ringer_audible.png b/packages/SystemUI/res/drawable-xhdpi/ic_ringer_audible.png
new file mode 100755
index 0000000..a9fb16e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_ringer_audible.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_ringer_audible.png b/packages/SystemUI/res/drawable-xxhdpi/ic_ringer_audible.png
new file mode 100755
index 0000000..c7a870e
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xxhdpi/ic_ringer_audible.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/ic_volume_ringer.xml b/packages/SystemUI/res/drawable/ic_notification_audible.xml
index c566d5a..c566d5a 100644
--- a/packages/SystemUI/res/drawable/ic_volume_ringer.xml
+++ b/packages/SystemUI/res/drawable/ic_notification_audible.xml
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
index e9f1095..003662b 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
@@ -42,6 +42,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
+import android.provider.Settings;
import android.provider.Settings.Global;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -130,7 +131,7 @@ public class VolumeDialog {
private long mCollapseTime;
public VolumeDialog(Context context, int windowType, VolumeDialogController controller,
- ZenModeController zenModeController, Callback callback) {
+ ZenModeController zenModeController, Callback callback) {
mContext = context;
mController = controller;
mCallback = callback;
@@ -177,22 +178,22 @@ public class VolumeDialog {
mDialogContentView.setLayoutTransition(mLayoutTransition);
mMotion = new VolumeDialogMotion(mDialog, mDialogView, mDialogContentView, mExpandButton,
new VolumeDialogMotion.Callback() {
- @Override
- public void onAnimatingChanged(boolean animating) {
- if (animating) return;
- if (mPendingStateChanged) {
- mHandler.sendEmptyMessage(H.STATE_CHANGED);
- mPendingStateChanged = false;
- }
- if (mPendingRecheckAll) {
- mHandler.sendEmptyMessage(H.RECHECK_ALL);
- mPendingRecheckAll = false;
- }
- }
- });
+ @Override
+ public void onAnimatingChanged(boolean animating) {
+ if (animating) return;
+ if (mPendingStateChanged) {
+ mHandler.sendEmptyMessage(H.STATE_CHANGED);
+ mPendingStateChanged = false;
+ }
+ if (mPendingRecheckAll) {
+ mHandler.sendEmptyMessage(H.RECHECK_ALL);
+ mPendingRecheckAll = false;
+ }
+ }
+ });
addRow(AudioManager.STREAM_RING,
- R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true);
+ R.drawable.ic_ringer_audible, R.drawable.ic_volume_ringer_mute, true);
addRow(AudioManager.STREAM_MUSIC,
R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true);
addRow(AudioManager.STREAM_ALARM,
@@ -272,7 +273,7 @@ public class VolumeDialog {
row.settingsButton.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
final boolean moved = oldLeft != left || oldTop != top;
if (D.BUG) Log.d(TAG, "onLayoutChange moved=" + moved
+ " old=" + new Rect(oldLeft, oldTop, oldRight, oldBottom).toShortString()
@@ -597,13 +598,17 @@ public class VolumeDialog {
final VolumeRow row = mRows.get(i);
if (row.ss == null || !row.ss.dynamic) continue;
if (!mDynamic.get(row.stream)) {
- mRows.remove(i);
- mDialogContentView.removeView(row.view);
- mDialogContentView.removeView(row.space);
+ removeRow(row);
}
}
}
+ private void removeRow(VolumeRow volumeRow) {
+ mRows.remove(volumeRow);
+ mDialogContentView.removeView(volumeRow.view);
+ mDialogContentView.removeView(volumeRow.space);
+ }
+
private void onStateChangedH(State state) {
final boolean animating = mMotion.isAnimating();
if (D.BUG) Log.d(TAG, "onStateChangedH animating=" + animating);
@@ -624,6 +629,8 @@ public class VolumeDialog {
}
}
+ updateNotificationRowH();
+
if (mActiveStream != state.activeStream) {
mActiveStream = state.activeStream;
updateRowsH();
@@ -635,6 +642,19 @@ public class VolumeDialog {
updateFooterH();
}
+ private void updateNotificationRowH() {
+ VolumeRow notificationRow = findRow(AudioManager.STREAM_NOTIFICATION);
+ if (notificationRow != null) {
+ if (mState.linkedNotification) {
+ removeRow(notificationRow);
+ }
+ } else if (!mState.linkedNotification) {
+ // TODO get icon for mute state
+ addRow(AudioManager.STREAM_NOTIFICATION,
+ R.drawable.ic_notification_audible, R.drawable.ic_notification_audible, true);
+ }
+ }
+
private void updateFooterH() {
if (D.BUG) Log.d(TAG, "updateFooterH");
final boolean wasVisible = mZenFooter.getVisibility() == View.VISIBLE;
@@ -663,8 +683,9 @@ public class VolumeDialog {
final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM;
final boolean isAlarmStream = row.stream == AudioManager.STREAM_ALARM;
final boolean isMusicStream = row.stream == AudioManager.STREAM_MUSIC;
- final boolean isRingVibrate = isRingStream
- && mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE;
+ final boolean isNotificationStream = row.stream == AudioManager.STREAM_NOTIFICATION;
+ final boolean isVibrate = mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE;
+ final boolean isRingVibrate = isRingStream && isVibrate;
final boolean isRingSilent = isRingStream
&& mState.ringerModeInternal == AudioManager.RINGER_MODE_SILENT;
final boolean isZenAlarms = mState.zenMode == Global.ZEN_MODE_ALARMS;
@@ -672,8 +693,9 @@ public class VolumeDialog {
final boolean isZenPriority = mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
final boolean isRingZenNone = (isRingStream || isSystemStream) && isZenNone;
final boolean isRingLimited = isRingStream && isZenPriority;
- final boolean zenMuted = isZenAlarms ? (isRingStream || isSystemStream)
- : isZenNone ? (isRingStream || isSystemStream || isAlarmStream || isMusicStream)
+ final boolean zenMuted = isZenAlarms ? (isRingStream || isSystemStream || isNotificationStream)
+ : isZenNone ? (isRingStream || isSystemStream || isAlarmStream || isMusicStream || isNotificationStream)
+ : isVibrate ? (isNotificationStream)
: false;
// update slider max
@@ -708,12 +730,12 @@ public class VolumeDialog {
row.icon.setAlpha(iconEnabled ? 1 : 0.5f);
final int iconRes =
isRingVibrate ? R.drawable.ic_volume_ringer_vibrate
- : isRingSilent || zenMuted ? row.cachedIconRes
- : ss.routedToBluetooth ?
+ : isRingSilent || zenMuted ? row.cachedIconRes
+ : ss.routedToBluetooth ?
(ss.muted ? R.drawable.ic_volume_media_bt_mute
: R.drawable.ic_volume_media_bt)
- : mAutomute && ss.level == 0 ? row.iconMuteRes
- : (ss.muted ? row.iconMuteRes : row.iconRes);
+ : mAutomute && ss.level == 0 ? row.iconMuteRes
+ : (ss.muted ? row.iconMuteRes : row.iconRes);
if (iconRes != row.cachedIconRes) {
if (row.cachedIconRes != 0 && isRingVibrate) {
mController.vibrate();
@@ -723,11 +745,11 @@ public class VolumeDialog {
}
row.iconState =
iconRes == R.drawable.ic_volume_ringer_vibrate ? Events.ICON_STATE_VIBRATE
- : (iconRes == R.drawable.ic_volume_media_bt_mute || iconRes == row.iconMuteRes)
+ : (iconRes == R.drawable.ic_volume_media_bt_mute || iconRes == row.iconMuteRes)
? Events.ICON_STATE_MUTE
- : (iconRes == R.drawable.ic_volume_media_bt || iconRes == row.iconRes)
+ : (iconRes == R.drawable.ic_volume_media_bt || iconRes == row.iconRes)
? Events.ICON_STATE_UNMUTE
- : Events.ICON_STATE_UNKNOWN;
+ : Events.ICON_STATE_UNKNOWN;
row.icon.setContentDescription(ss.name);
// update slider
@@ -1081,7 +1103,7 @@ public class VolumeDialog {
@Override
public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
- AccessibilityEvent event) {
+ AccessibilityEvent event) {
rescheduleTimeoutH();
return super.onRequestSendAccessibilityEvent(host, child, event);
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
index 32d6805..024fb8c 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
@@ -400,6 +400,16 @@ public class VolumeDialogController {
return stream == AudioManager.STREAM_RING || stream == AudioManager.STREAM_NOTIFICATION;
}
+ private boolean updateLinkNotificationConfigW() {
+ boolean linkNotificationWithVolume = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.VOLUME_LINK_NOTIFICATION, 1) == 1;
+ if (mState.linkedNotification == linkNotificationWithVolume) {
+ return false;
+ }
+ mState.linkedNotification = linkNotificationWithVolume;
+ return true;
+ }
+
private boolean updateZenModeConfigW() {
final ZenModeConfig zenModeConfig = getZenModeConfig();
if (Objects.equals(mState.zenModeConfig, zenModeConfig)) return false;
@@ -714,6 +724,8 @@ public class VolumeDialogController {
Settings.Global.getUriFor(Settings.Global.ZEN_MODE);
private final Uri ZEN_MODE_CONFIG_URI =
Settings.Global.getUriFor(Settings.Global.ZEN_MODE_CONFIG_ETAG);
+ private final Uri VOLUME_LINK_NOTIFICATION_URI =
+ Settings.Secure.getUriFor(Settings.Secure.VOLUME_LINK_NOTIFICATION);
public SettingObserver(Handler handler) {
super(handler);
@@ -723,6 +735,8 @@ public class VolumeDialogController {
mContext.getContentResolver().registerContentObserver(SERVICE_URI, false, this);
mContext.getContentResolver().registerContentObserver(ZEN_MODE_URI, false, this);
mContext.getContentResolver().registerContentObserver(ZEN_MODE_CONFIG_URI, false, this);
+ mContext.getContentResolver().registerContentObserver(VOLUME_LINK_NOTIFICATION_URI,
+ false, this);
onChange(true, SERVICE_URI);
}
@@ -750,6 +764,9 @@ public class VolumeDialogController {
if (ZEN_MODE_CONFIG_URI.equals(uri)) {
changed = updateZenModeConfigW();
}
+ if (VOLUME_LINK_NOTIFICATION_URI.equals(uri)) {
+ changed = updateLinkNotificationConfigW();
+ }
if (changed) {
mCallbacks.onStateChanged(mState);
}
@@ -947,6 +964,7 @@ public class VolumeDialogController {
public String effectsSuppressorName;
public ZenModeConfig zenModeConfig;
public int activeStream = NO_ACTIVE_STREAM;
+ public boolean linkedNotification;
public State copy() {
final State rt = new State();
@@ -960,6 +978,7 @@ public class VolumeDialogController {
rt.effectsSuppressorName = effectsSuppressorName;
if (zenModeConfig != null) rt.zenModeConfig = zenModeConfig.copy();
rt.activeStream = activeStream;
+ rt.linkedNotification = linkedNotification;
return rt;
}
@@ -989,6 +1008,7 @@ public class VolumeDialogController {
sep(sb, indent); sb.append("effectsSuppressorName:").append(effectsSuppressorName);
sep(sb, indent); sb.append("zenModeConfig:").append(zenModeConfig);
sep(sb, indent); sb.append("activeStream:").append(activeStream);
+ sep(sb, indent); sb.append("linkedNotification:").append(linkedNotification);
if (indent > 0) sep(sb, indent);
return sb.append('}').toString();
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index c7e08bb..b922218 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -583,6 +583,8 @@ public class AudioService extends IAudioService.Stub {
// If absolute volume is supported in AVRCP device
private boolean mAvrcpAbsVolSupported = false;
+ private boolean mLinkNotificationWithVolume;
+ private final boolean mVoiceCapable;
private static Long mLastDeviceConnectMsgTime = new Long(0);
private AudioManagerInternal.RingerModeDelegate mRingerModeDelegate;
@@ -640,6 +642,9 @@ public class AudioService extends IAudioService.Stub {
mForcedUseForComm = AudioSystem.FORCE_NONE;
+ mVoiceCapable = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_voice_capable);
+
createAudioSystemThread();
AudioSystem.setErrorCallback(mAudioSystemCallback);
@@ -671,6 +676,10 @@ public class AudioService extends IAudioService.Stub {
mForceAnalogCarDock = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_forceAnalogCarDock);
+ // read this in before readPersistedSettings() because updateStreamVolumeAlias needs it
+ mLinkNotificationWithVolume = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.VOLUME_LINK_NOTIFICATION, 1) == 1;
+
// must be called before readPersistedSettings() which needs a valid mStreamVolumeAlias[]
// array initialized by updateStreamVolumeAlias()
updateStreamVolumeAlias(false /*updateVolumes*/, TAG);
@@ -1080,6 +1089,13 @@ public class AudioService extends IAudioService.Stub {
}
mStreamVolumeAlias[AudioSystem.STREAM_DTMF] = dtmfStreamAlias;
+
+ if (mLinkNotificationWithVolume && mVoiceCapable) {
+ mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_RING;
+ } else {
+ mStreamVolumeAlias[AudioSystem.STREAM_NOTIFICATION] = AudioSystem.STREAM_NOTIFICATION;
+ }
+
if (updateVolumes) {
mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias],
caller);
@@ -1152,6 +1168,9 @@ public class AudioService extends IAudioService.Stub {
readDockAudioSettings(cr);
}
+ mLinkNotificationWithVolume = Settings.Secure.getInt(cr,
+ Settings.Secure.VOLUME_LINK_NOTIFICATION, 1) == 1;
+
mMuteAffectedStreams = System.getIntForUser(cr,
System.MUTE_STREAMS_AFFECTED, AudioSystem.DEFAULT_MUTE_STREAMS_AFFECTED,
UserHandle.USER_CURRENT);
@@ -4705,6 +4724,8 @@ public class AudioService extends IAudioService.Stub {
Settings.System.MODE_RINGER_STREAMS_AFFECTED), false, this);
mContentResolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.DOCK_AUDIO_MEDIA_ENABLED), false, this);
+ mContentResolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.VOLUME_LINK_NOTIFICATION), false, this);
}
@Override
@@ -4723,6 +4744,14 @@ public class AudioService extends IAudioService.Stub {
setRingerModeInt(getRingerModeInternal(), false);
}
readDockAudioSettings(mContentResolver);
+
+ boolean linkNotificationWithVolume = Settings.Secure.getInt(mContentResolver,
+ Settings.Secure.VOLUME_LINK_NOTIFICATION, 1) == 1;
+ if (linkNotificationWithVolume != mLinkNotificationWithVolume) {
+ mLinkNotificationWithVolume = linkNotificationWithVolume;
+ createStreamStates();
+ updateStreamVolumeAlias(true, TAG);
+ }
}
}
}