diff --git a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java index c6604544e6c70..9da90cf7a4cc9 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecConfig.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecConfig.java @@ -37,6 +37,7 @@ import android.provider.Settings.Global; import android.util.ArrayMap; import android.util.Slog; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.server.hdmi.cec.config.CecSettings; import com.android.server.hdmi.cec.config.Setting; @@ -95,6 +96,9 @@ public class HdmiCecConfig { @Nullable private final CecSettings mSystemConfig; @Nullable private final CecSettings mVendorOverride; + private final Object mLock = new Object(); + + @GuardedBy("mLock") private final ArrayMap> mSettingChangeListeners = new ArrayMap<>(); @@ -389,12 +393,14 @@ public class HdmiCecConfig { } private void notifySettingChanged(@NonNull Setting setting) { - Set listeners = mSettingChangeListeners.get(setting); - if (listeners == null) { - return; // No listeners registered, do nothing. - } - for (SettingChangeListener listener: listeners) { - listener.onChange(setting.getName()); + synchronized (mLock) { + Set listeners = mSettingChangeListeners.get(setting); + if (listeners == null) { + return; // No listeners registered, do nothing. + } + for (SettingChangeListener listener: listeners) { + listener.onChange(setting.getName()); + } } } @@ -440,10 +446,12 @@ public class HdmiCecConfig { throw new IllegalArgumentException("Change listeners for setting '" + name + "' not supported."); } - if (!mSettingChangeListeners.containsKey(setting)) { - mSettingChangeListeners.put(setting, new HashSet<>()); + synchronized (mLock) { + if (!mSettingChangeListeners.containsKey(setting)) { + mSettingChangeListeners.put(setting, new HashSet<>()); + } + mSettingChangeListeners.get(setting).add(listener); } - mSettingChangeListeners.get(setting).add(listener); } /** @@ -455,11 +463,13 @@ public class HdmiCecConfig { if (setting == null) { throw new IllegalArgumentException("Setting '" + name + "' does not exist."); } - if (mSettingChangeListeners.containsKey(setting)) { - Set listeners = mSettingChangeListeners.get(setting); - listeners.remove(listener); - if (listeners.isEmpty()) { - mSettingChangeListeners.remove(setting); + synchronized (mLock) { + if (mSettingChangeListeners.containsKey(setting)) { + Set listeners = mSettingChangeListeners.get(setting); + listeners.remove(listener); + if (listeners.isEmpty()) { + mSettingChangeListeners.remove(setting); + } } } }