/*
 * Copyright (C) 2023 Mohamad Al-Jaf
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
import "windows.devices.enumeration.idl";
/* import "windows.phone.idl"; */
import "windows.ui.idl";
import "windows.ui.core.idl";
/* import "windows.ui.popups.idl"; */
import "windows.ui.windowmanagement.idl";

namespace Windows.UI.ViewManagement
{
    apicontract ViewManagementViewScalingContract;

    typedef enum ApplicationViewBoundsMode ApplicationViewBoundsMode;
    typedef enum ApplicationViewMode ApplicationViewMode;
    typedef enum ApplicationViewOrientation ApplicationViewOrientation;
    typedef enum ApplicationViewState ApplicationViewState;
    typedef enum ApplicationViewSwitchingOptions ApplicationViewSwitchingOptions;
    typedef enum ApplicationViewWindowingMode ApplicationViewWindowingMode;
    typedef enum FullScreenSystemOverlayMode FullScreenSystemOverlayMode;
    typedef enum HandPreference HandPreference;
    typedef enum UIColorType UIColorType;
    typedef enum UIElementType UIElementType;
    typedef enum UserInteractionMode UserInteractionMode;
    typedef enum ViewSizePreference ViewSizePreference;

    interface IAccessibilitySettings;
    interface IApplicationView;
    interface IApplicationView2;
    interface IApplicationView3;
    interface IApplicationView4;
    interface IApplicationView7;
    interface IApplicationView9;
    interface IApplicationViewConsolidatedEventArgs;
    interface IApplicationViewConsolidatedEventArgs2;
    interface IApplicationViewFullscreenStatics;
    interface IApplicationViewInteropStatics;
    interface IApplicationViewScaling;
    interface IApplicationViewScalingStatics;
    interface IApplicationViewStatics;
    interface IApplicationViewStatics2;
    interface IApplicationViewStatics3;
    interface IApplicationViewStatics4;
    interface IApplicationViewSwitcherStatics;
    interface IApplicationViewSwitcherStatics2;
    interface IApplicationViewSwitcherStatics3;
    interface IApplicationViewTitleBar;
    interface IApplicationViewTransferContext;
    interface IApplicationViewTransferContextStatics;
    interface IApplicationViewWithContext;

    interface IUISettings;
    interface IUISettings2;
    interface IUISettings3;
    interface IUISettings4;
    interface IUISettings5;
    interface IUISettings6;
    interface IUISettingsAnimationsEnabledChangedEventArgs;
    interface IUISettingsAutoHideScrollBarsChangedEventArgs;
    interface IUISettingsMessageDurationChangedEventArgs;

    interface IUIViewSettings;
    interface IUIViewSettingsStatics;
    interface IViewModePreferences;
    interface IViewModePreferencesStatics;

    interface IInputPane;
    interface IInputPane2;
    interface IInputPaneControl;
    interface IInputPaneVisibilityEventArgs;
    interface IInputPaneStatics;
    interface IInputPaneStatics2;

    runtimeclass AccessibilitySettings;
    runtimeclass ApplicationView;
    runtimeclass ApplicationViewConsolidatedEventArgs;
    runtimeclass ApplicationViewScaling;
    runtimeclass ApplicationViewSwitcher;
    runtimeclass ApplicationViewTitleBar;
    runtimeclass ApplicationViewTransferContext;
    runtimeclass UISettings;
    runtimeclass UISettingsAnimationsEnabledChangedEventArgs;
    runtimeclass UISettingsAutoHideScrollBarsChangedEventArgs;
    runtimeclass UISettingsMessageDurationChangedEventArgs;
    runtimeclass UIViewSettings;
    runtimeclass InputPane;
    runtimeclass InputPaneVisibilityEventArgs;
    runtimeclass ViewModePreferences;

    declare {
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.AccessibilitySettings *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsMessageDurationChangedEventArgs *>;
        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.InputPane*, Windows.UI.ViewManagement.InputPaneVisibilityEventArgs*>;
        interface Windows.Foundation.IReference<Windows.UI.ViewManagement.UIElementType>;
    }

    [
        contractversion(1.0)
    ]
    apicontract ViewManagementViewScalingContract
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ApplicationViewBoundsMode
    {
        UseVisible    = 0,
        UseCoreWindow = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0)
    ]
    enum ApplicationViewMode
    {
        Default        = 0,
        CompactOverlay = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ApplicationViewOrientation
    {
        Landscape = 0,
        Portrait  = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ApplicationViewState
    {
        FullScreenLandscape = 0,
        Filled              = 1,
        Snapped             = 2,
        FullScreenPortrait  = 3,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        flags
    ]
    enum ApplicationViewSwitchingOptions
    {
        Default          = 0x0,
        SkipAnimation    = 0x1,
        ConsolidateViews = 0x2,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ApplicationViewWindowingMode
    {
        Auto                    = 0,
        PreferredLaunchViewSize = 1,
        FullScreen              = 2,
        [
            contract(Windows.Foundation.UniversalApiContract, 7.0)
        ]
        CompactOverlay          = 3,
        [
            contract(Windows.Foundation.UniversalApiContract, 7.0)
        ]
        Maximized               = 4,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum FullScreenSystemOverlayMode
    {
        Standard = 0,
        Minimal  = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum HandPreference
    {
        LeftHanded  = 0,
        RightHanded = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum UIColorType
    {
        Background   = 0,
        Foreground   = 1,
        AccentDark3  = 2,
        AccentDark2  = 3,
        AccentDark1  = 4,
        Accent       = 5,
        AccentLight1 = 6,
        AccentLight2 = 7,
        AccentLight3 = 8,
        Complement   = 9,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum UIElementType
    {
        ActiveCaption        = 0,
        Background           = 1,
        ButtonFace           = 2,
        ButtonText           = 3,
        CaptionText          = 4,
        GrayText             = 5,
        Highlight            = 6,
        HighlightText        = 7,
        Hotlight             = 8,
        InactiveCaption      = 9,
        InactiveCaptionText  = 10,
        Window               = 11,
        WindowText           = 12,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        AccentColor          = 1000,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        TextHigh             = 1001,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        TextMedium           = 1002,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        TextLow              = 1003,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        TextContrastWithHigh = 1004,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextHigh          = 1005,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextMediumHigh    = 1006,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextMedium        = 1007,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextMediumLow     = 1008,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        NonTextLow           = 1009,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        PageBackground       = 1010,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        PopupBackground      = 1011,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        OverlayOutsidePopup  = 1012,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum UserInteractionMode
    {
        Mouse = 0,
        Touch = 1,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum ViewSizePreference
    {
        Default    = 0,
        UseLess    = 1,
        UseHalf    = 2,
        UseMore    = 3,
        UseMinimum = 4,
        UseNone    = 5,
        [
            contract(Windows.Foundation.UniversalApiContract, 4.0)
        ]
        Custom     = 6,
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.AccessibilitySettings),
        uuid(fe0e8147-c4c0-4562-b962-1327b52ad5b9)
    ]
    interface IAccessibilitySettings : IInspectable
    {
        [propget] HRESULT HighContrast([out, retval] boolean *value);
        [propget] HRESULT HighContrastScheme([out, retval] HSTRING *value);
        [eventadd] HRESULT HighContrastChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.AccessibilitySettings *, IInspectable *> *handler, [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT HighContrastChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(d222d519-4361-451e-96c4-60f4f9742db0)
    ]
    interface IApplicationView : IInspectable
    {
        [propget] HRESULT Orientation([out, retval] Windows.UI.ViewManagement.ApplicationViewOrientation *value);
        [propget] HRESULT AdjacentToLeftDisplayEdge([out, retval] boolean *value);
        [propget] HRESULT AdjacentToRightDisplayEdge([out, retval] boolean *value);
        [propget] HRESULT IsFullScreen([out, retval] boolean *value);
        [propget] HRESULT IsOnLockScreen([out, retval] boolean *value);
        [propget] HRESULT IsScreenCaptureEnabled([out, retval] boolean *value);
        [propput] HRESULT IsScreenCaptureEnabled([in] boolean value);
        [propput] HRESULT Title([in] HSTRING value);
        [propget] HRESULT Title([out, retval] HSTRING *value);
        [propget] HRESULT Id([out, retval] INT32 *value);
        [eventadd] HRESULT Consolidated([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Consolidated([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(e876b196-a545-40dc-b594-450cba68cc00)
    ]
    interface IApplicationView2 : IInspectable
    {
        [propget] HRESULT SuppressSystemOverlays([out, retval] boolean *value);
        [propput] HRESULT SuppressSystemOverlays([in] boolean value);
        [propget] HRESULT VisibleBounds([out, retval] Windows.Foundation.Rect *value);
        [eventadd] HRESULT VisibleBoundsChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT VisibleBoundsChanged([in] EventRegistrationToken token);
        HRESULT SetDesiredBoundsMode([in] Windows.UI.ViewManagement.ApplicationViewBoundsMode mode, [out, retval] boolean *success);
        [propget] HRESULT DesiredBoundsMode([out, retval] Windows.UI.ViewManagement.ApplicationViewBoundsMode *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(903c9ce5-793a-4fdf-a2b2-af1ac21e3108)
    ]
    interface IApplicationView3 : IInspectable
    {
        [propget] HRESULT TitleBar([out, retval] Windows.UI.ViewManagement.ApplicationViewTitleBar **value);
        [propget] HRESULT FullScreenSystemOverlayMode([out, retval] Windows.UI.ViewManagement.FullScreenSystemOverlayMode *value);
        [propput] HRESULT FullScreenSystemOverlayMode([in] Windows.UI.ViewManagement.FullScreenSystemOverlayMode value);
        [propget] HRESULT IsFullScreenMode([out, retval] boolean *value);
        HRESULT TryEnterFullScreenMode([out, retval] boolean *success);
        HRESULT ExitFullScreenMode();
        HRESULT ShowStandardSystemOverlays();
        HRESULT TryResizeView([in] Windows.Foundation.Size value, [out, retval] boolean *success);
        HRESULT SetPreferredMinSize([in] Windows.Foundation.Size size);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(15e5cbec-9e0f-46b5-bc3f-9bf653e74b5e)
    ]
    interface IApplicationView4 : IInspectable
    {
        [propget] HRESULT ViewMode([out, retval] Windows.UI.ViewManagement.ApplicationViewMode *value);
        HRESULT IsViewModeSupported([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] boolean *is_mode_supported);
        [overload("TryEnterViewModeAsync")] HRESULT TryEnterViewModeAsync([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("TryEnterViewModeAsync")] HRESULT TryEnterViewModeWithPreferencesAsync([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [in] Windows.UI.ViewManagement.ViewModePreferences *preferences, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        HRESULT TryConsolidateAsync([out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(a0369647-5faf-5aa6-9c38-befbb12a071e)
    ]
    interface IApplicationView7 : IInspectable
    {
        [propget] HRESULT PersistedStateId([out, retval] HSTRING *value);
        [propput] HRESULT PersistedStateId([in] HSTRING value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(9c6516f9-021a-5f01-93e5-9bdad2647574)
    ]
    interface IApplicationView9 : IInspectable
    {
        [propget] HRESULT WindowingEnvironment([out, retval] Windows.UI.WindowManagement.WindowingEnvironment **value);
        HRESULT GetDisplayRegions([out, retval] Windows.Foundation.Collections.IVectorView<Windows.UI.WindowManagement.DisplayRegion *> **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs),
        uuid(514449ec-7ea2-4de7-a6a6-7dfbaaebb6fb)
    ]
    interface IApplicationViewConsolidatedEventArgs : IInspectable
    {
        [propget] HRESULT IsUserInitiated([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs),
        uuid(1c199ecc-6dc1-40f4-afee-07d9ea296430)
    ]
    interface IApplicationViewConsolidatedEventArgs2 : IInspectable
    {
        [propget] HRESULT IsAppInitiated([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(bc792ebd-64fe-4b65-a0c0-901ce2b68636)
    ]
    interface IApplicationViewFullscreenStatics : IInspectable
    {
        HRESULT TryUnsnapToFullscreen([out, retval] boolean *success);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(c446fb5d-4793-4896-a8e2-be57a8bb0f50)
    ]
    interface IApplicationViewInteropStatics : IInspectable
    {
        HRESULT GetApplicationViewIdForWindow([in] Windows.UI.Core.ICoreWindow *window, [out, retval] INT32 *id);
    }

    [
        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewScaling),
        uuid(1d0ddc23-23f3-4b2d-84fe-74bf37b48b66)
    ]
    interface IApplicationViewScaling : IInspectable
    {
    }

    [
        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewScaling),
        uuid(b08fecf0-b946-45c8-a5e3-71f5aa78f861)
    ]
    interface IApplicationViewScalingStatics : IInspectable
    {
        [propget] HRESULT DisableLayoutScaling([out, retval] boolean *value);
        HRESULT TrySetDisableLayoutScaling([in] boolean disabled, [out, retval] boolean *success);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(010a6306-c433-44e5-a9f2-bd84d4030a95)
    ]
    interface IApplicationViewStatics : IInspectable
    {
        [propget] HRESULT Value([out, retval] Windows.UI.ViewManagement.ApplicationViewState *value);
        HRESULT TryUnsnap([out, retval] boolean *success);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(af338ae5-cf64-423c-85e5-f3e72448fb23)
    ]
    interface IApplicationViewStatics2 : IInspectable
    {
        HRESULT GetForCurrentView([out, retval] Windows.UI.ViewManagement.ApplicationView **current);
        [propget] HRESULT TerminateAppOnFinalViewClose([out, retval] boolean *value);
        [propput] HRESULT TerminateAppOnFinalViewClose([in] boolean value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(a28d7594-8c41-4e13-9719-5164796fe4c7)
    ]
    interface IApplicationViewStatics3 : IInspectable
    {
        [propget] HRESULT PreferredLaunchWindowingMode([out, retval] Windows.UI.ViewManagement.ApplicationViewWindowingMode *value);
        [propput] HRESULT PreferredLaunchWindowingMode([in] Windows.UI.ViewManagement.ApplicationViewWindowingMode value);
        [propget] HRESULT PreferredLaunchViewSize([out, retval] Windows.Foundation.Size *value);
        [propput] HRESULT PreferredLaunchViewSize([in] Windows.Foundation.Size value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(08fd8d33-2611-5336-a315-d98e6366c9db)
    ]
    interface IApplicationViewStatics4 : IInspectable
    {
        HRESULT ClearAllPersistedState();
        HRESULT ClearPersistedState([in] HSTRING key);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
        uuid(975f2f1e-e656-4c5e-a0a1-717c6ffa7d64)
    ]
    interface IApplicationViewSwitcherStatics : IInspectable
    {
        HRESULT DisableShowingMainViewOnActivation();
        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneAsync([in] INT32 view_id, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneWithSizePreferenceAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ViewSizePreference preference, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ViewSizePreference size_preference, [in] INT32 anchor_view_id, [in] Windows.UI.ViewManagement.ViewSizePreference anchor_size_preference, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("SwitchAsync")] HRESULT SwitchAsync([in] INT32 view_id, [out, retval] Windows.Foundation.IAsyncAction **operation);
        [overload("SwitchAsync")] HRESULT SwitchFromViewAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [out, retval] Windows.Foundation.IAsyncAction **operation);
        [overload("SwitchAsync")] HRESULT SwitchFromViewWithOptionsAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [in] Windows.UI.ViewManagement.ApplicationViewSwitchingOptions options, [out, retval] Windows.Foundation.IAsyncAction **operation);
        HRESULT PrepareForCustomAnimatedSwitchAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [in] Windows.UI.ViewManagement.ApplicationViewSwitchingOptions options, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
        uuid(60e995cd-4fc2-48c4-b8e3-395f2b9f0fc1)
    ]
    interface IApplicationViewSwitcherStatics2 : IInspectable
    {
        HRESULT DisableSystemViewActivationPolicy();
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
        uuid(92059420-80a7-486d-b21f-c7a4a242a383)
    ]
    interface IApplicationViewSwitcherStatics3 : IInspectable
    {
        [overload("TryShowAsViewModeAsync")] HRESULT TryShowAsViewModeAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
        [overload("TryShowAsViewModeAsync")] HRESULT TryShowAsViewModeWithPreferencesAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ApplicationViewMode mode, [in] Windows.UI.ViewManagement.ViewModePreferences *preferences, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTitleBar),
        uuid(00924ac0-932b-4a6b-9c4b-dc38c82478ce)
    ]
    interface IApplicationViewTitleBar : IInspectable
    {
        [propput] HRESULT ForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT BackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT BackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonHoverForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonHoverForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonHoverBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonHoverBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonPressedForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonPressedForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonPressedBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonPressedBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT InactiveForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT InactiveForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT InactiveBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT InactiveBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonInactiveForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonInactiveForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
        [propput] HRESULT ButtonInactiveBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
        [propget] HRESULT ButtonInactiveBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 2.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTransferContext),
        uuid(8574bc63-3c17-408e-9408-8a1a9ea81bfa)
    ]
    interface IApplicationViewTransferContext : IInspectable
    {
        [propget] HRESULT ViewId([out, retval] INT32 *value);
        [propput] HRESULT ViewId([in] INT32 value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 2.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTransferContext),
        uuid(15a89d92-dd79-4b0b-bc47-d5f195f14661)
    ]
    interface IApplicationViewTransferContextStatics : IInspectable
    {
        [propget] HRESULT DataPackageFormatId([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
        uuid(bd55d512-9dc1-44fc-8501-666625df60dc)
    ]
    interface IApplicationViewWithContext : IInspectable
    {
        [propget] HRESULT UIContext([out, retval] Windows.UI.UIContext **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(85361600-1c63-4627-bcb1-3a89e0bc9c55)
    ]
    interface IUISettings : IInspectable
    {
        [propget] HRESULT HandPreference([out, retval] Windows.UI.ViewManagement.HandPreference *value);
        [propget] HRESULT CursorSize([out, retval] Windows.Foundation.Size *value);
        [propget] HRESULT ScrollBarSize([out, retval] Windows.Foundation.Size *value);
        [propget] HRESULT ScrollBarArrowSize([out, retval] Windows.Foundation.Size *value);
        [propget] HRESULT ScrollBarThumbBoxSize([out, retval] Windows.Foundation.Size *value);
        [propget] HRESULT MessageDuration([out, retval] UINT32 *value);
        [propget] HRESULT AnimationsEnabled([out, retval] boolean *value);
        [propget] HRESULT CaretBrowsingEnabled([out, retval] boolean *value);
        [propget] HRESULT CaretBlinkRate([out, retval] UINT32 *value);
        [propget] HRESULT CaretWidth([out, retval] UINT32 *value);
        [propget] HRESULT DoubleClickTime([out, retval] UINT32 *value);
        [propget] HRESULT MouseHoverTime([out, retval] UINT32 *value);
        HRESULT UIElementColor([in] Windows.UI.ViewManagement.UIElementType element, [out, retval] Windows.UI.Color *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(bad82401-2721-44f9-bb91-2bb228be442f)
    ]
    interface IUISettings2 : IInspectable
    {
        [propget] HRESULT TextScaleFactor([out, retval] DOUBLE *value);
        [eventadd] HRESULT TextScaleFactorChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *> *handler,
                                                  [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT TextScaleFactorChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(03021be4-5254-4781-8194-5168f7d06d7b)
    ]
    interface IUISettings3 : IInspectable
    {
        HRESULT GetColorValue([in] Windows.UI.ViewManagement.UIColorType color, [out, retval] Windows.UI.Color *value);
        [eventadd] HRESULT ColorValuesChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *> *handler,
                                              [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT ColorValuesChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(52bb3002-919b-4d6b-9b78-8dd66ff4b93b)
    ]
    interface IUISettings4 : IInspectable
    {
        [propget] HRESULT AdvancedEffectsEnabled([out, retval] boolean *value);
        [eventadd] HRESULT AdvancedEffectsEnabledChanged(
            [in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *> *handler,
            [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT AdvancedEffectsEnabledChanged([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(5349d588-0cb5-5f05-bd34-706b3231f0bd)
    ]
    interface IUISettings5 : IInspectable
    {
        [propget] HRESULT AutoHideScrollBars([out, retval] boolean *value);
        [eventadd] HRESULT AutoHideScrollBarsChanged(
            [in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs *> *handler,
            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT AutoHideScrollBarsChanged([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.UISettings),
        uuid(aef19bd7-fe31-5a04-ada4-469aaec6dfa9)
    ]
    interface IUISettings6 : IInspectable
    {
        [eventadd] HRESULT AnimationsEnabledChanged(
            [in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs *> *handler,
            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT AnimationsEnabledChanged([in] EventRegistrationToken token);
        [eventadd] HRESULT MessageDurationChanged(
            [in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsMessageDurationChangedEventArgs *> *handler,
            [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT MessageDurationChanged([in] EventRegistrationToken token);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs),
        uuid(0c7b4b3d-2ea1-533e-894d-415bc5243c29)
    ]
    interface IUISettingsAnimationsEnabledChangedEventArgs : IInspectable
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs),
        uuid(87afd4b2-9146-5f02-8f6b-06d454174c0f)
    ]
    interface IUISettingsAutoHideScrollBarsChangedEventArgs : IInspectable
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        exclusiveto(Windows.UI.ViewManagement.UISettingsMessageDurationChangedEventArgs),
        uuid(338aad52-4a5d-5b59-8002-d930f608fd6e)
    ]
    interface IUISettingsMessageDurationChangedEventArgs : IInspectable
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UIViewSettings),
        uuid(c63657f6-8850-470d-88f8-455e16ea2c26)
    ]
    interface IUIViewSettings : IInspectable
    {
        [propget] HRESULT UserInteractionMode([out, retval] Windows.UI.ViewManagement.UserInteractionMode *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.UIViewSettings),
        uuid(595c97a5-f8f6-41cf-b0fb-aacdb81fd5f6)
    ]
    interface IUIViewSettingsStatics : IInspectable
    {
        HRESULT GetForCurrentView([out, retval] Windows.UI.ViewManagement.UIViewSettings **current);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(640ada70-06f3-4c87-a678-9829c9127c28)
    ]
    interface IInputPane : IInspectable
    {
        [eventadd] HRESULT Showing([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.InputPane*, Windows.UI.ViewManagement.InputPaneVisibilityEventArgs*> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Showing([in] EventRegistrationToken token);
        [eventadd] HRESULT Hiding([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.InputPane*, Windows.UI.ViewManagement.InputPaneVisibilityEventArgs*> *handler, [out, retval] EventRegistrationToken *token);
        [eventremove] HRESULT Hiding([in] EventRegistrationToken token);
        [propget] HRESULT OccludedRect([out, retval] Windows.Foundation.Rect *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(8a6b3f26-7090-4793-944c-c3f2cde26276)
    ]
    interface IInputPane2 : IInspectable
    {
        HRESULT TryShow([out, retval] boolean *result);
        HRESULT TryHide([out, retval] boolean *result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(088bb24f-962f-489d-aa6e-c6be1a0a6e52)
    ]
    interface IInputPaneControl : IInspectable
    {
        [propget] HRESULT Visible([out, retval] boolean *value);
        [propput] HRESULT Visible([in] boolean value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPaneVisibilityEventArgs),
        uuid(d243e016-d907-4fcc-bb8d-f77baa5028f1)
    ]
    interface IInputPaneVisibilityEventArgs : IInspectable
    {
        [propget] HRESULT OccludedRect([out, retval] Windows.Foundation.Rect *value);
        [propput] HRESULT EnsuredFocusedElementInView([in] boolean value);
        [propget] HRESULT EnsuredFocusedElementInView([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(95f4af3a-ef47-424a-9741-fd2815eba2bd)
    ]
    interface IInputPaneStatics : IInspectable
    {
        HRESULT GetForCurrentView([out, retval] Windows.UI.ViewManagement.InputPane **input_pane);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        exclusiveto(Windows.UI.ViewManagement.InputPane),
        uuid(1b63529b-d9ec-4531-8445-71bab9fb828e)
    ]
    interface IInputPaneStatics2 : IInspectable
    {
        HRESULT GetForUIContext([in] Windows.UI.UIContext *context, [out, retval] Windows.UI.ViewManagement.InputPane **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ViewModePreferences),
        uuid(878fcd3a-0b99-42c9-84d0-d3f1d403554b)
    ]
    interface IViewModePreferences : IInspectable
    {
        [propget] HRESULT ViewSizePreference([out, retval] Windows.UI.ViewManagement.ViewSizePreference *value);
        [propput] HRESULT ViewSizePreference([in] Windows.UI.ViewManagement.ViewSizePreference value);
        [propget] HRESULT CustomSize([out, retval] Windows.Foundation.Size *value);
        [propput] HRESULT CustomSize([in] Windows.Foundation.Size value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.UI.ViewManagement.ViewModePreferences),
        uuid(69b60a65-5de5-40d8-8306-3833df7a2274)
    ]
    interface IViewModePreferencesStatics : IInspectable
    {
        HRESULT CreateDefault([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.UI.ViewManagement.ViewModePreferences **result);
    }

    [
        activatable(Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass AccessibilitySettings
    {
        [default] interface Windows.UI.ViewManagement.IAccessibilitySettings;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.UI.ViewManagement.IApplicationViewFullscreenStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewInteropStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewStatics2, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewStatics3, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewStatics4, Windows.Foundation.UniversalApiContract, 8.0),
        threading(both)
    ]
    runtimeclass ApplicationView
    {
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] [default] interface Windows.UI.ViewManagement.IApplicationView;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IApplicationView2;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IApplicationView3;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.UI.ViewManagement.IApplicationView4;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationView7;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationView9;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationViewWithContext;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass ApplicationViewConsolidatedEventArgs
    {
        [default] interface Windows.UI.ViewManagement.IApplicationViewConsolidatedEventArgs;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.UI.ViewManagement.IApplicationViewConsolidatedEventArgs2;
    }

    [
        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewScalingStatics, Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0)
    ]
    runtimeclass ApplicationViewScaling
    {
        [default] interface Windows.UI.ViewManagement.IApplicationViewScaling;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics2, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics3, Windows.Foundation.UniversalApiContract, 4.0),
        threading(both)
    ]
    runtimeclass ApplicationViewSwitcher
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass ApplicationViewTitleBar
    {
        [contract(Windows.Foundation.UniversalApiContract, 1.0), default] interface Windows.UI.ViewManagement.IApplicationViewTitleBar;
    }

    [
        activatable(Windows.Foundation.UniversalApiContract, 2.0),
        contract(Windows.Foundation.UniversalApiContract, 2.0),
        static(Windows.UI.ViewManagement.IApplicationViewTransferContextStatics, Windows.Foundation.UniversalApiContract, 2.0)
    ]
    runtimeclass ApplicationViewTransferContext
    {
        [contract(Windows.Foundation.UniversalApiContract, 2.0), default] interface Windows.UI.ViewManagement.IApplicationViewTransferContext;
    }

    [
        activatable(Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UISettings
    {
        [default] interface Windows.UI.ViewManagement.IUISettings;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IUISettings2;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IUISettings3;
        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.UI.ViewManagement.IUISettings4;
        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IUISettings5;
        [contract(Windows.Foundation.UniversalApiContract, 10.0)] interface Windows.UI.ViewManagement.IUISettings6;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UISettingsAnimationsEnabledChangedEventArgs
    {
        [default] interface Windows.UI.ViewManagement.IUISettingsAnimationsEnabledChangedEventArgs;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 8.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UISettingsAutoHideScrollBarsChangedEventArgs
    {
        [default] interface Windows.UI.ViewManagement.IUISettingsAutoHideScrollBarsChangedEventArgs;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 10.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UISettingsMessageDurationChangedEventArgs
    {
        [default] interface Windows.UI.ViewManagement.IUISettingsMessageDurationChangedEventArgs;
    }

    [
        static(Windows.UI.ViewManagement.IUIViewSettingsStatics, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass UIViewSettings
    {
        [default] interface Windows.UI.ViewManagement.IUIViewSettings;
    }

    [
        static(Windows.UI.ViewManagement.IInputPaneStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.UI.ViewManagement.IInputPaneStatics2, Windows.Foundation.UniversalApiContract, 8.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(standard)
    ]
    runtimeclass InputPane
    {
        [default] interface Windows.UI.ViewManagement.IInputPane;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IInputPane2;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IInputPaneControl;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(standard)
    ]
    runtimeclass InputPaneVisibilityEventArgs
    {
        [default] interface Windows.UI.ViewManagement.IInputPaneVisibilityEventArgs;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        static(Windows.UI.ViewManagement.IViewModePreferencesStatics, Windows.Foundation.UniversalApiContract, 4.0)
    ]
    runtimeclass ViewModePreferences
    {
        [contract(Windows.Foundation.UniversalApiContract, 4.0), default] interface Windows.UI.ViewManagement.IViewModePreferences;
    }
}
