Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,12 @@ public enum MediaControlResult

internal static class EnumExtensions
{
private static readonly MediaControlNativeDisplayMode[] s_allDisplayModes
= Enum.GetValues<MediaControlNativeDisplayMode>();

private static readonly MediaControlNativeDisplayRotation[] s_allDisplayRotations
= Enum.GetValues<MediaControlNativeDisplayRotation>();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Using Enum.GetValues<T>() on MediaControlNativeDisplayMode and MediaControlNativeDisplayRotation introduces a correctness bug because these are [Flags] enums that define an All member (which is a bitwise combination of other members).

The Bug

  1. Enum.GetValues<T>() returns all defined constants, including All.
  2. In ToPublicList(), the loop checks modes.HasFlag(mode). If modes has all flags set, modes.HasFlag(All) evaluates to true.
  3. ToPublic() is then called with All. Since All is not handled in the switch statement of ToPublic(), it falls back to the default value (MediaControlDisplayMode.LetterBox or Rotation.Rotate0), resulting in duplicate entries in the returned list (e.g., LetterBox or Rotate0 added twice).

Solution

Explicitly define the arrays of individual flags. This completely resolves the duplicate element bug and also improves performance by avoiding reflection (Enum.GetValues) at startup.

        private static readonly MediaControlNativeDisplayMode[] s_allDisplayModes = new[]
        {
            MediaControlNativeDisplayMode.LetterBox,
            MediaControlNativeDisplayMode.OriginSize,
            MediaControlNativeDisplayMode.FullScreen,
            MediaControlNativeDisplayMode.CroppedFull
        };

        private static readonly MediaControlNativeDisplayRotation[] s_allDisplayRotations = new[]
        {
            MediaControlNativeDisplayRotation.Rotate0,
            MediaControlNativeDisplayRotation.Rotate90,
            MediaControlNativeDisplayRotation.Rotate180,
            MediaControlNativeDisplayRotation.Rotate270
        };


internal static MediaControlPlaybackState ToPublic(this MediaControllerNativePlaybackState nativeState)
{
switch (nativeState)
Expand Down Expand Up @@ -528,7 +534,7 @@ internal static IList<MediaControlDisplayMode> ToPublicList(this MediaControlNat
{
var supportedModes = new List<MediaControlDisplayMode>();

foreach (MediaControlNativeDisplayMode mode in Enum.GetValues(typeof(MediaControlNativeDisplayMode)))
foreach (MediaControlNativeDisplayMode mode in s_allDisplayModes)
{
if (modes.HasFlag(mode))
{
Expand Down Expand Up @@ -592,7 +598,7 @@ internal static IList<Rotation> ToPublicList(this MediaControlNativeDisplayRotat
{
var supportedRotations = new List<Rotation>();

foreach (MediaControlNativeDisplayRotation mode in Enum.GetValues(typeof(MediaControlNativeDisplayRotation)))
foreach (MediaControlNativeDisplayRotation mode in s_allDisplayRotations)
{
if (modes.HasFlag(mode))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ private PlaybackCapabilityUpdatedEventArgs CreatePlaybackCapabilityUpdatedEventA
var capabilities = new Dictionary<MediaControlPlaybackCommand, MediaControlCapabilitySupport>();
try
{
foreach (MediaControllerNativePlaybackAction action in Enum.GetValues(typeof(MediaControllerNativePlaybackAction)))
foreach (MediaControllerNativePlaybackAction action in s_allPlaybackActions)
{
Native.GetPlaybackCapability(playbackCapaHandle, action, out MediaControlCapabilitySupport support);
capabilities.Add(action.ToPublic(), support);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ namespace Tizen.Multimedia.Remoting
/// <since_tizen> 4 </since_tizen>
public partial class MediaController
{
private static readonly MediaControllerNativePlaybackAction[] s_allPlaybackActions
= Enum.GetValues<MediaControllerNativePlaybackAction>();

internal MediaController(MediaControllerManager manager, string serverAppId)
{
Debug.Assert(manager != null);
Expand Down Expand Up @@ -539,7 +542,7 @@ public Dictionary<MediaControlPlaybackCommand, MediaControlCapabilitySupport> Ge
Native.GetPlaybackCapabilityHandle(Manager.Handle, ServerAppId, out playbackCapaHandle).
ThrowIfError("Failed to get playback capability handle.");

foreach (MediaControllerNativePlaybackAction action in Enum.GetValues(typeof(MediaControllerNativePlaybackAction)))
foreach (MediaControllerNativePlaybackAction action in s_allPlaybackActions)
{
Native.GetPlaybackCapability(playbackCapaHandle, action, out MediaControlCapabilitySupport support);
playbackCapabilities.Add(action.ToPublic(), support);
Expand Down
Loading