diff options
3 files changed, 66 insertions, 50 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index f0150d46c4d3..8a543cec5300 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -1841,12 +1841,22 @@ public class AudioService extends IAudioService.Stub { } public void setRingerModeExternal(int ringerMode, String caller) { - setRingerMode(ringerMode, caller, true /*external*/); + final long identity = Binder.clearCallingIdentity(); + try { + setRingerMode(ringerMode, caller, true /*external*/); + } finally { + Binder.restoreCallingIdentity(identity); + } } public void setRingerModeInternal(int ringerMode, String caller) { enforceSelfOrSystemUI("setRingerModeInternal"); - setRingerMode(ringerMode, caller, false /*external*/); + final long identity = Binder.clearCallingIdentity(); + try { + setRingerMode(ringerMode, caller, false /*external*/); + } finally { + Binder.restoreCallingIdentity(identity); + } } private void setRingerMode(int ringerMode, String caller, boolean external) { @@ -1860,26 +1870,28 @@ public class AudioService extends IAudioService.Stub { if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) { ringerMode = AudioManager.RINGER_MODE_SILENT; } - final int ringerModeInternal = getRingerModeInternal(); - final int ringerModeExternal = getRingerModeExternal(); - if (external) { - setRingerModeExt(ringerMode); - if (mRingerModeDelegate != null) { - ringerMode = mRingerModeDelegate.onSetRingerModeExternal(ringerModeExternal, - ringerMode, caller, ringerModeInternal); - } - if (ringerMode != ringerModeInternal) { - setRingerModeInt(ringerMode, true /*persist*/); - } - } else /*internal*/ { - if (ringerMode != ringerModeInternal) { - setRingerModeInt(ringerMode, true /*persist*/); - } - if (mRingerModeDelegate != null) { - ringerMode = mRingerModeDelegate.onSetRingerModeInternal(ringerModeInternal, - ringerMode, caller, ringerModeExternal); + synchronized (mSettingsLock) { + final int ringerModeInternal = getRingerModeInternal(); + final int ringerModeExternal = getRingerModeExternal(); + if (external) { + setRingerModeExt(ringerMode); + if (mRingerModeDelegate != null) { + ringerMode = mRingerModeDelegate.onSetRingerModeExternal(ringerModeExternal, + ringerMode, caller, ringerModeInternal); + } + if (ringerMode != ringerModeInternal) { + setRingerModeInt(ringerMode, true /*persist*/); + } + } else /*internal*/ { + if (ringerMode != ringerModeInternal) { + setRingerModeInt(ringerMode, true /*persist*/); + } + if (mRingerModeDelegate != null) { + ringerMode = mRingerModeDelegate.onSetRingerModeInternal(ringerModeInternal, + ringerMode, caller, ringerModeExternal); + } + setRingerModeExt(ringerMode); } - setRingerModeExt(ringerMode); } } @@ -1968,10 +1980,10 @@ public class AudioService extends IAudioService.Stub { switch (getVibrateSetting(vibrateType)) { case AudioManager.VIBRATE_SETTING_ON: - return getRingerModeInternal() != AudioManager.RINGER_MODE_SILENT; + return getRingerModeExternal() != AudioManager.RINGER_MODE_SILENT; case AudioManager.VIBRATE_SETTING_ONLY_SILENT: - return getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE; + return getRingerModeExternal() == AudioManager.RINGER_MODE_VIBRATE; case AudioManager.VIBRATE_SETTING_OFF: // return false, even for incoming calls diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 650f0e27dc11..825627f6a793 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -927,7 +927,7 @@ public class NotificationManagerService extends SystemService { Settings.Global.DEVICE_PROVISIONED, 0)) { mDisableNotificationEffects = true; } - mZenModeHelper.updateZenMode(); + mZenModeHelper.readZenModeFromSetting(); mUserProfiles.updateCache(getContext()); listenForCallState(); diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index 0f9a59b0c668..841fc21f5ad0 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -221,21 +221,26 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { } public void setZenMode(int zenMode, String reason) { + setZenMode(zenMode, reason, true); + } + + private void setZenMode(int zenMode, String reason, boolean setRingerMode) { ZenLog.traceSetZenMode(zenMode, reason); - Global.putInt(mContext.getContentResolver(), Global.ZEN_MODE, zenMode); + if (mZenMode == zenMode) return; + ZenLog.traceUpdateZenMode(mZenMode, zenMode); + mZenMode = zenMode; + Global.putInt(mContext.getContentResolver(), Global.ZEN_MODE, mZenMode); + if (setRingerMode) { + applyZenToRingerMode(); + } + applyRestrictions(); + mHandler.postDispatchOnZenModeChanged(); } - public void updateZenMode() { - final int oldMode = mZenMode; + public void readZenModeFromSetting() { final int newMode = Global.getInt(mContext.getContentResolver(), Global.ZEN_MODE, Global.ZEN_MODE_OFF); - if (oldMode != newMode) { - ZenLog.traceUpdateZenMode(oldMode, newMode); - } - mZenMode = newMode; - applyRestrictions(); - onZenUpdated(oldMode, newMode); - dispatchOnZenModeChanged(); + setZenMode(newMode, "setting"); } private void applyRestrictions() { @@ -297,18 +302,16 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { dispatchOnConfigChanged(); final String val = Integer.toString(mConfig.hashCode()); Global.putString(mContext.getContentResolver(), Global.ZEN_MODE_CONFIG_ETAG, val); - updateZenMode(); + applyRestrictions(); return true; } - private void onZenUpdated(int oldZen, int newZen) { + private void applyZenToRingerMode() { if (mAudioManager == null) return; - if (oldZen == newZen) return; - // force the ringer mode into compliance final int ringerModeInternal = mAudioManager.getRingerModeInternal(); int newRingerModeInternal = ringerModeInternal; - switch (newZen) { + switch (mZenMode) { case Global.ZEN_MODE_NO_INTERRUPTIONS: if (ringerModeInternal != AudioManager.RINGER_MODE_SILENT) { mPreviousRingerMode = ringerModeInternal; @@ -337,7 +340,7 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { int ringerModeExternalOut = ringerModeNew; int newZen = -1; - switch(ringerModeNew) { + switch (ringerModeNew) { case AudioManager.RINGER_MODE_SILENT: if (isChange) { if (mZenMode != Global.ZEN_MODE_NO_INTERRUPTIONS) { @@ -356,7 +359,7 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { break; } if (newZen != -1) { - mHandler.postSetZenMode(newZen, "ringerModeInternal"); + setZenMode(newZen, "ringerModeInternal", false /*setRingerMode*/); } if (isChange || newZen != -1 || ringerModeExternal != ringerModeExternalOut) { @@ -374,7 +377,7 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { final boolean isVibrate = ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE; int newZen = -1; - switch(ringerModeNew) { + switch (ringerModeNew) { case AudioManager.RINGER_MODE_SILENT: if (isChange) { if (mZenMode == Global.ZEN_MODE_OFF) { @@ -394,7 +397,7 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { break; } if (newZen != -1) { - mHandler.postSetZenMode(newZen, "ringerModeExternal"); + setZenMode(newZen, "ringerModeExternal", false /*setRingerMode*/); } ZenLog.traceSetRingerModeExternal(ringerModeOld, ringerModeNew, caller, ringerModeInternal, @@ -516,27 +519,28 @@ public class ZenModeHelper implements AudioManagerInternal.RingerModeDelegate { public void update(Uri uri) { if (ZEN_MODE.equals(uri)) { - updateZenMode(); + readZenModeFromSetting(); } } } private class H extends Handler { - private static final int MSG_SET_ZEN = 1; + private static final int MSG_DISPATCH = 1; private H(Looper looper) { super(looper); } - private void postSetZenMode(int zen, String reason) { - obtainMessage(MSG_SET_ZEN, zen, 0, reason).sendToTarget(); + private void postDispatchOnZenModeChanged() { + removeMessages(MSG_DISPATCH); + sendEmptyMessage(MSG_DISPATCH); } @Override public void handleMessage(Message msg) { - switch(msg.what) { - case MSG_SET_ZEN: - setZenMode(msg.arg1, (String) msg.obj); + switch (msg.what) { + case MSG_DISPATCH: + dispatchOnZenModeChanged(); break; } } |