[NUI] Fix svace issues
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Application / NUIApplication.cs
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 using System;
19 using System.ComponentModel;
20 using System.Diagnostics.CodeAnalysis;
21 using System.Threading;
22 using System.Reflection;
23 using Tizen.Applications;
24 using Tizen.Applications.CoreBackend;
25 using Tizen.NUI.Xaml;
26
27 namespace Tizen.NUI
28 {
29
30     /// <summary>
31     /// Represents an application that have a UI screen. The NUIApplication class has a default stage.
32     /// </summary>
33     /// <since_tizen> 3 </since_tizen>
34     public class NUIApplication : CoreApplication
35     {
36         /// <summary>
37         /// The instance of ResourceManager.
38         /// </summary>
39         private static System.Resources.ResourceManager resourceManager = null;
40         private static string currentLoadedXaml = null;
41
42         /// <summary>
43         /// The border window
44         /// </summary>
45         private bool borderEnabled = false;
46         private IBorderInterface borderInterface = null;
47
48         /// <summary>
49         /// Xaml loaded delegate.
50         /// </summary>
51         [EditorBrowsable(EditorBrowsableState.Never)]
52         public delegate void XamlLoadedHandler(string xamlName);
53
54         static NUIApplication()
55         {
56             Registry.Instance.SavedApplicationThread = Thread.CurrentThread;
57         }
58
59         /// <summary>
60         /// The default constructor.
61         /// </summary>
62         /// <since_tizen> 3 </since_tizen>
63         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
64         public NUIApplication() : base(new NUICoreBackend())
65         {
66         }
67
68         /// <summary>
69         /// The constructor with window size and position.
70         /// </summary>
71         /// <param name="windowSize">The window size.</param>
72         /// <param name="windowPosition">The window position.</param>
73         /// <since_tizen> 5 </since_tizen>
74         /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
75         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
76         [EditorBrowsable(EditorBrowsableState.Never)]
77         public NUIApplication(Size2D windowSize, Position2D windowPosition) : base(new NUICoreBackend("", NUIApplication.WindowMode.Opaque, windowSize, windowPosition))
78         {
79         }
80
81         /// <summary>
82         /// The constructor with a stylesheet.
83         /// </summary>
84         /// <param name="styleSheet">The styleSheet url.</param>
85         /// <since_tizen> 3 </since_tizen>
86         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
87         public NUIApplication(string styleSheet) : base(new NUICoreBackend(styleSheet))
88         {
89         }
90
91         /// <summary>
92         /// The constructor with a stylesheet, window size, and position.
93         /// </summary>
94         /// <param name="styleSheet">The styleSheet URL.</param>
95         /// <param name="windowSize">The window size.</param>
96         /// <param name="windowPosition">The window position.</param>
97         /// <since_tizen> 5 </since_tizen>
98         /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
99         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
100         [EditorBrowsable(EditorBrowsableState.Never)]
101         public NUIApplication(string styleSheet, Size2D windowSize, Position2D windowPosition) : base(new NUICoreBackend(styleSheet, WindowMode.Opaque, windowSize, windowPosition))
102         {
103         }
104
105         /// <summary>
106         /// The constructor with a stylesheet and window mode.
107         /// </summary>
108         /// <param name="styleSheet">The styleSheet url.</param>
109         /// <param name="windowMode">The windowMode.</param>
110         /// <since_tizen> 3 </since_tizen>
111         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
112         public NUIApplication(string styleSheet, WindowMode windowMode) : base(new NUICoreBackend(styleSheet, windowMode))
113         {
114         }
115
116         /// <summary>
117         /// The constructor with a stylesheet, window mode, window size, and position.
118         /// </summary>
119         /// <param name="styleSheet">The styleSheet URL.</param>
120         /// <param name="windowMode">The windowMode.</param>
121         /// <param name="windowSize">The window size.</param>
122         /// <param name="windowPosition">The window position.</param>
123         /// <since_tizen> 5 </since_tizen>
124         /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API.
125         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
126         [EditorBrowsable(EditorBrowsableState.Never)]
127         public NUIApplication(string styleSheet, WindowMode windowMode, Size2D windowSize, Position2D windowPosition) : base(new NUICoreBackend(styleSheet, windowMode, windowSize, windowPosition))
128         {
129         }
130
131         /// <summary>
132         /// Internal inhouse constructor with Graphics Backend Type
133         /// </summary>
134         /// <param name="backend"></param>
135         /// <param name="windowMode"></param>
136         /// <param name="windowSize"></param>
137         /// <param name="windowPosition"></param>
138         /// <param name="styleSheet"></param>
139         /// InhouseAPI, this could be opened in NextTizen
140         [Obsolete("Do not use! This will be deprecated!")]
141         [EditorBrowsable(EditorBrowsableState.Never)]
142         public NUIApplication(Graphics.BackendType backend, WindowMode windowMode = WindowMode.Opaque, Size2D windowSize = null, Position2D windowPosition = null, string styleSheet = "") : base(new NUICoreBackend(styleSheet, windowMode, windowSize, windowPosition))
143         {
144             //windowMode and styleSheet will be added later. currently it's not working as expected.
145             Graphics.Backend = backend;
146             Tizen.Log.Error("NUI", "Plaese DO NOT set graphical backend type with this constructor! This will give no effect!");
147         }
148
149         /// <summary>
150         /// The constructor with theme option.
151         /// </summary>
152         /// <param name="option">The theme option.</param>
153         [EditorBrowsable(EditorBrowsableState.Never)]
154         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
155         public NUIApplication(ThemeOptions option) : base(new NUICoreBackend())
156         {
157             ApplyThemeOption(option);
158         }
159
160         /// <summary>
161         /// The constructor with window size and position and theme option.
162         /// </summary>
163         /// <param name="windowSize">The window size.</param>
164         /// <param name="windowPosition">The window position.</param>
165         /// <param name="option">The theme option.</param>
166         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
167         [EditorBrowsable(EditorBrowsableState.Never)]
168         public NUIApplication(Size2D windowSize, Position2D windowPosition, ThemeOptions option) : base(new NUICoreBackend("", NUIApplication.WindowMode.Opaque, windowSize, windowPosition))
169         {
170             ApplyThemeOption(option);
171         }
172
173         /// <summary>
174         /// The constructor with a stylesheet, window mode and default window type.
175         /// It is the only way to create an IME window.
176         /// </summary>
177         /// <param name="styleSheet">The styleSheet URL.</param>
178         /// <param name="windowMode">The windowMode.</param>
179         /// <param name="type">The default window type.</param>
180         /// <since_tizen> 9 </since_tizen>
181         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
182         public NUIApplication(string styleSheet, WindowMode windowMode, WindowType type) : base(new NUICoreBackend(styleSheet, windowMode, type))
183         {
184             ExternalThemeManager.Initialize();
185         }
186
187         /// <summary>
188         /// The constructor with a stylesheet, size, position, boderInterface and window mode
189         /// </summary>
190         /// <param name="styleSheet">The styleSheet URL.</param>
191         /// <param name="windowSize">The window size.</param>
192         /// <param name="windowPosition">The window position.</param>
193         /// <param name="borderInterface"><see cref="Tizen.NUI.IBorderInterface"/>If borderInterface is null, defaultBorder is enabled.</param>
194         /// <param name="windowMode">The windowMode.</param>
195         [EditorBrowsable(EditorBrowsableState.Never)]
196         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
197         public NUIApplication(string styleSheet, Size2D windowSize, Position2D windowPosition, IBorderInterface borderInterface, WindowMode windowMode = WindowMode.Opaque) : base(new NUICoreBackend(styleSheet, windowMode, windowSize, windowPosition))
198         {
199             EnableBorder(borderInterface);
200         }
201
202         /// <summary>
203         /// The constructor with theme option and borderInterface.
204         /// </summary>
205         /// <param name="option">The theme option.</param>
206         /// <param name="borderInterface"><see cref="Tizen.NUI.IBorderInterface"/>If borderInterface is null, defaultBorder is enabled.</param>
207         [EditorBrowsable(EditorBrowsableState.Never)]
208         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
209         public NUIApplication(ThemeOptions option, IBorderInterface borderInterface) : base(new NUICoreBackend())
210         {
211             EnableBorder(borderInterface);
212             ApplyThemeOption(option);
213         }
214
215         /// <summary>
216         /// The constructor with window size, position, theme option and borderInterface.
217         /// </summary>
218         /// <param name="windowSize">The window size.</param>
219         /// <param name="windowPosition">The window position.</param>
220         /// <param name="option">The theme option.</param>
221         /// <param name="borderInterface"><see cref="Tizen.NUI.IBorderInterface"/>If borderInterface is null, defaultBorder is enabled.</param>
222         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
223         [EditorBrowsable(EditorBrowsableState.Never)]
224         public NUIApplication(Size2D windowSize, Position2D windowPosition, ThemeOptions option, IBorderInterface borderInterface) : base(new NUICoreBackend("", NUIApplication.WindowMode.Opaque, windowSize, windowPosition))
225         {
226             EnableBorder(borderInterface);
227             ApplyThemeOption(option);
228         }
229
230         /// <summary>
231         /// The constructor with a stylesheet, window mode, coretask
232         /// </summary>
233         /// <note>
234         /// There is the UI thread feature.
235         /// UI thread is an additional thread that an Application object creates. The thread is for UI events.
236         /// To enable the UI Thread, you have to pass CoreTask object using this contructor.
237         /// When the UI thread feature is enabled, The methods of CoreTask are emitted on the main thread,
238         /// and the NUIApplication's events are emitted on the UI thread.
239         /// If you want to handle windows or actors in cases like when the memory level of the device is low, you have to use the NUIApplication events, not the CoreTask methods.
240         /// The CoreTask is not for handling GUI.
241         /// Callbacks of the all events in NUIApplication except the CoreTask are emitted on the UI thread.
242         /// </note>
243         /// <param name="styleSheet">The styleSheet URL.</param>
244         /// <param name="windowMode">The windowMode.</param>
245         /// <param name="task">True If app creates a UI Thread</param>
246         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
247         [EditorBrowsable(EditorBrowsableState.Never)]
248         public NUIApplication(string styleSheet, WindowMode windowMode, CoreTask task) : base(new NUICoreBackend(styleSheet, windowMode), task)
249         {
250         }
251
252         /// <summary>
253         /// The constructor with a stylesheet, window mode, window size, position, coretask
254         /// </summary>
255         /// <param name="styleSheet">The styleSheet URL.</param>
256         /// <param name="windowMode">The windowMode.</param>
257         /// <param name="windowSize">The window size.</param>
258         /// <param name="windowPosition">The window position.</param>
259         /// <param name="task">True If app creates a UI Thread</param>
260         [SuppressMessage("Microsoft.Design", "CA2000: Dispose objects before losing scope", Justification = "NUICoreBackend is disposed in the base class when the application is terminated")]
261         [EditorBrowsable(EditorBrowsableState.Never)]
262         public NUIApplication(string styleSheet, WindowMode windowMode, Size2D windowSize, Position2D windowPosition, CoreTask task) : base(new NUICoreBackend(styleSheet, windowMode, windowSize, windowPosition), task)
263         {
264         }
265
266         /// <summary>
267         /// Occurs whenever the application is resumed.
268         /// </summary>
269         /// <since_tizen> 4 </since_tizen>
270         public event EventHandler Resumed;
271
272         /// <summary>
273         /// Occurs whenever the application is paused.
274         /// </summary>
275         /// <since_tizen> 4 </since_tizen>
276         public event EventHandler Paused;
277
278         /// <summary>
279         /// Xaml loaded event.
280         /// </summary>
281         [EditorBrowsable(EditorBrowsableState.Never)]
282         public static event XamlLoadedHandler XamlLoaded;
283
284         /// <summary>
285         /// Enumeration for deciding whether a NUI application window is opaque or transparent.
286         /// </summary>
287         /// <since_tizen> 3 </since_tizen>
288         public enum WindowMode
289         {
290             /// <summary>
291             /// Opaque
292             /// </summary>
293             /// <since_tizen> 3 </since_tizen>
294             Opaque = 0,
295             /// <summary>
296             /// Transparent
297             /// </summary>
298             /// <since_tizen> 3 </since_tizen>
299             Transparent = 1
300         }
301
302         /// <summary>
303         /// Enumeration for theme options of the NUIApplication.
304         /// </summary>
305         [Flags]
306         [EditorBrowsable(EditorBrowsableState.Never)]
307         public enum ThemeOptions : int
308         {
309             /// <summary>
310             /// No option specified.
311             /// </summary>
312             [EditorBrowsable(EditorBrowsableState.Never)]
313             None = 0,
314
315             /// <summary>
316             /// Enable platform theme.
317             /// When this option is on, all views in the NUIApplication is affected by platform theme (e.g. light/dark).
318             /// </summary>
319             [EditorBrowsable(EditorBrowsableState.Never)]
320             PlatformThemeEnabled = 1 << 0,
321
322             /// <summary>
323             /// Sets the default value of View.ThemeChangeSensitive.
324             /// when this option is on, all views are made sensitive on theme changing by default.
325             /// </summary>
326             [EditorBrowsable(EditorBrowsableState.Never)]
327             ThemeChangeSensitive = 1 << 1,
328         };
329
330         /// <summary>
331         /// Current loaded xaml's full name.
332         /// </summary>
333         [EditorBrowsable(EditorBrowsableState.Never)]
334         public static string CurrentLoadedXaml
335         {
336             get
337             {
338                 return currentLoadedXaml;
339             }
340             set
341             {
342                 if (currentLoadedXaml != value)
343                 {
344                     currentLoadedXaml = value;
345                     XamlLoaded?.Invoke(value);
346                 }
347             }
348         }
349
350         /// <summary>
351         /// ResourceManager to handle multilingual.
352         /// </summary>
353         /// <since_tizen> 4 </since_tizen>
354         public static System.Resources.ResourceManager MultilingualResourceManager
355         {
356             get
357             {
358                 return resourceManager;
359             }
360             set
361             {
362                 resourceManager = value;
363             }
364         }
365
366         /// <summary>
367         /// Gets the window instance.
368         /// </summary>
369         /// <since_tizen> 3 </since_tizen>
370         [Obsolete("Do not use! This will be deprecated!")]
371         [EditorBrowsable(EditorBrowsableState.Never)]
372         public Window Window
373         {
374             get
375             {
376                 return GetDefaultWindow();
377             }
378         }
379
380         /// <summary>
381         /// Gets the Application Id.
382         /// </summary>
383         /// <since_tizen> 6 </since_tizen>
384         [EditorBrowsable(EditorBrowsableState.Never)]
385         public string AppId
386         {
387             get
388             {
389                 return Tizen.Applications.Application.Current.ApplicationInfo.ApplicationId;
390             }
391         }
392
393         /// <summary>
394         /// Gets the default window.
395         /// </summary>
396         /// <returns>The default Window.</returns>
397         /// <since_tizen> 6 </since_tizen>
398         // This will be public opened after ACR done. (Before ACR, need to be hidden as Inhouse API)
399         [EditorBrowsable(EditorBrowsableState.Never)]
400         public static Window GetDefaultWindow()
401         {
402             return Window.Instance;
403         }
404
405         internal Application ApplicationHandle
406         {
407             get
408             {
409                 return ((NUICoreBackend)this.Backend).ApplicationHandle;
410             }
411         }
412
413         /// <summary>
414         /// Register the assembly to XAML.
415         /// </summary>
416         /// <since_tizen> 5 </since_tizen>
417         public static void RegisterAssembly(Assembly assembly)
418         {
419             XamlParser.s_assemblies.Add(assembly);
420         }
421
422         /// <summary>
423         /// Runs the NUIApplication.
424         /// </summary>
425         /// <param name="args">Arguments from commandline.</param>
426         /// <since_tizen> 4 </since_tizen>
427         public override void Run(string[] args)
428         {
429             Backend.AddEventHandler(EventType.PreCreated, OnPreCreate);
430             Backend.AddEventHandler(EventType.Resumed, OnResume);
431             Backend.AddEventHandler(EventType.Paused, OnPause);
432             base.Run(args);
433         }
434
435         /// <summary>
436         /// Exits the NUIApplication.
437         /// </summary>
438         /// <since_tizen> 4 </since_tizen>
439         public override void Exit()
440         {
441             base.Exit();
442         }
443
444         /// <summary>
445         /// Ensures that the function passed in is called from the main loop when it is idle.
446         /// </summary>
447         /// <param name="func">The function to call</param>
448         /// <returns>true if added successfully, false otherwise</returns>
449         /// <since_tizen> 4 </since_tizen>
450         public bool AddIdle(System.Delegate func)
451         {
452             return ((NUICoreBackend)this.Backend).AddIdle(func);
453         }
454
455         /// <summary>
456         /// Sets the number of frames per render.
457         /// </summary>
458         /// <param name="numberOfVSyncsPerRender">The number of vsyncs between successive renders.</param>
459         /// <remarks>
460         /// Suggest this is a power of two:
461         /// 1 - render each vsync frame.
462         /// 2 - render every other vsync frame.
463         /// 4 - render every fourth vsync frame.
464         /// 8 - render every eighth vsync frame. <br />
465         /// For example, if an application runs on 60 FPS and SetRenderRefreshRate(2) is called, the frames per second will be changed to 30.
466         ///</remarks>
467         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
468         [EditorBrowsable(EditorBrowsableState.Never)]
469         public static void SetRenderRefreshRate(uint numberOfVSyncsPerRender)
470         {
471             Adaptor.Instance.SetRenderRefreshRate(numberOfVSyncsPerRender);
472         }
473
474         /// <summary>
475         /// Gets the screen size
476         /// </summary>
477         /// <returns>Screen size</returns>
478         [EditorBrowsable(EditorBrowsableState.Never)]
479         static public Size GetScreenSize()
480         {
481             var ret = new Size(Interop.Application.GetScreenSize(), true);
482             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
483             return ret;
484         }
485
486         /// <summary>
487         /// Overrides this method if you want to handle behavior.
488         /// </summary>
489         /// <since_tizen> 3 </since_tizen>
490         protected override void OnLocaleChanged(LocaleChangedEventArgs e)
491         {
492             base.OnLocaleChanged(e);
493         }
494
495         /// <summary>
496         /// Overrides this method if you want to handle behavior.
497         /// </summary>
498         /// <since_tizen> 3 </since_tizen>
499         protected override void OnLowBattery(LowBatteryEventArgs e)
500         {
501             base.OnLowBattery(e);
502         }
503
504         /// <summary>
505         /// Overrides this method if you want to handle behavior.
506         /// </summary>
507         /// <since_tizen> 3 </since_tizen>
508         protected override void OnLowMemory(LowMemoryEventArgs e)
509         {
510             base.OnLowMemory(e);
511         }
512
513         /// <summary>
514         /// Overrides this method if you want to handle behavior.
515         /// </summary>
516         /// <since_tizen> 3 </since_tizen>
517         protected override void OnRegionFormatChanged(RegionFormatChangedEventArgs e)
518         {
519             base.OnRegionFormatChanged(e);
520         }
521
522         /// <summary>
523         /// This method is to handle behavior when the device orientation is changed.
524         ///
525         /// When device is rotated to ccw or cw, this event occurs.
526         /// In addition, this event is different to window orientation changed event.
527         /// The window orientation event is for per a window and occurs when some flags should be set before.
528         /// </summary>
529         /// <param name="e">The device orientation changed event argument</param>
530         [EditorBrowsable(EditorBrowsableState.Never)]
531         protected override void OnDeviceOrientationChanged(DeviceOrientationEventArgs e)
532         {
533             base.OnDeviceOrientationChanged(e);
534         }
535
536         /// <summary>
537         /// Overrides this method if you want to handle behavior.
538         /// </summary>
539         /// <since_tizen> 3 </since_tizen>
540         protected override void OnTerminate()
541         {
542             base.OnTerminate();
543         }
544
545         /// <summary>
546         /// Overrides this method if you want to handle behavior.
547         /// </summary>
548         /// <since_tizen> 3 </since_tizen>
549         protected virtual void OnPause()
550         {
551             Paused?.Invoke(this, EventArgs.Empty);
552         }
553
554         /// <summary>
555         /// Overrides this method if you want to handle behavior.
556         /// </summary>
557         /// <since_tizen> 3 </since_tizen>
558         protected virtual void OnResume()
559         {
560             Resumed?.Invoke(this, EventArgs.Empty);
561         }
562
563         /// <summary>
564         /// Overrides this method if you want to handle behavior.
565         /// </summary>
566         /// <since_tizen> 3 </since_tizen>
567         protected virtual void OnPreCreate()
568         {
569             Tizen.Tracer.Begin("[NUI] OnPreCreate()");
570
571             if (borderEnabled && GetDefaultWindow() != null)
572             {
573                 GetDefaultWindow().EnableBorder(borderInterface, new Window.BorderCloseDelegate(Exit));
574             }
575
576             Tizen.Tracer.End();
577         }
578
579         /// <summary>
580         /// Overrides this method if you want to handle behavior.
581         /// </summary>
582         /// <since_tizen> 3 </since_tizen>
583         protected override void OnAppControlReceived(AppControlReceivedEventArgs e)
584         {
585             if (e != null)
586             {
587                 Log.Info("NUI", "OnAppControlReceived() is called! ApplicationId=" + e.ReceivedAppControl.ApplicationId);
588                 Log.Info("NUI", "CallerApplicationId=" + e.ReceivedAppControl.CallerApplicationId + "   IsReplyRequest=" + e.ReceivedAppControl.IsReplyRequest);
589             }
590             base.OnAppControlReceived(e);
591         }
592
593         /// <summary>
594         /// Overrides this method if you want to handle behavior.
595         /// </summary>
596         /// <since_tizen> 3 </since_tizen>
597         protected override void OnCreate()
598         {
599             Tizen.Tracer.Begin("[NUI] OnCreate()");
600
601             base.OnCreate();
602
603             Tizen.Tracer.End();
604         }
605
606         /// <summary>
607         /// This is used to improve application launch performance.
608         /// </summary>
609         [EditorBrowsable(EditorBrowsableState.Never)]
610         static public void Preload()
611         {
612             Interop.Application.PreInitialize();
613             ThemeManager.Preload();
614             IsPreload = true;
615         }
616
617         /// <summary>
618         /// Check if it is loaded as dotnet-loader-nui.
619         /// </summary>
620         static internal bool IsPreload { get; set; }
621
622         private void ApplyThemeOption(ThemeOptions option)
623         {
624             if ((option & ThemeOptions.PlatformThemeEnabled) != 0)
625             {
626                 ThemeManager.PlatformThemeEnabled = true;
627             }
628
629             if ((option & ThemeOptions.ThemeChangeSensitive) != 0)
630             {
631                 ThemeManager.ApplicationThemeChangeSensitive = true;
632             }
633         }
634
635         private void EnableBorder(IBorderInterface borderInterface)
636         {
637             borderEnabled = true;
638             this.borderInterface = borderInterface;
639         }
640     }
641
642     /// <summary>
643     /// Graphics Backend Type.
644     /// </summary>
645     [SuppressMessage("Microsoft.Design", "CA1052:StaticHolderTypesShouldBeStaticOrNotInheritable")]
646     [EditorBrowsable(EditorBrowsableState.Never)]
647     [Obsolete("Do not use! This will be deprecated!")]
648     public class Graphics
649     {
650         /// <summary>
651         /// Graphics Backend Type.
652         /// </summary>
653         public enum BackendType
654         {
655             /// <summary>
656             /// The GLES backend.
657             /// </summary>
658             Gles,
659             /// <summary>
660             /// The Vulkan backend.
661             /// </summary>
662             Vulkan
663         }
664
665         /// <summary>
666         /// The backend used by the NUIApplication.
667         /// </summary>
668         [EditorBrowsable(EditorBrowsableState.Never)]
669         internal static BackendType Backend = BackendType.Gles;
670
671         internal const string GlesCSharpBinder = NDalicPINVOKE.Lib;
672         internal const string VulkanCSharpBinder = "libdali-csharp-binder-vk.so";
673     }
674 }