using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading.Tasks;
using ElmSharp;
using Tizen.Applications;
using Xamarin.Forms.Internals;
using ELayout = ElmSharp.Layout;
using DeviceOrientation = Xamarin.Forms.Internals.DeviceOrientation;
namespace Xamarin.Forms.Platform.Tizen
{
public class FormsApplication : CoreUIApplication
{
ITizenPlatform _platform;
Application _application;
bool _isInitialStart;
Window _window;
protected FormsApplication()
{
_isInitialStart = true;
}
///
/// Gets the main window or null if it's not set.
///
/// The main window or null.
public Window MainWindow
{
get
{
return _window;
}
protected set
{
_window = value;
InitializeWindow();
}
}
public ELayout BaseLayout
{
get; protected set;
}
protected override void OnPreCreate()
{
base.OnPreCreate();
Application.ClearCurrent();
MainWindow = new Window("FormsWindow");
}
protected override void OnTerminate()
{
base.OnTerminate();
if (_platform != null)
{
_platform.Dispose();
}
}
protected override void OnAppControlReceived(AppControlReceivedEventArgs e)
{
base.OnAppControlReceived(e);
if (!_isInitialStart && _application != null)
{
_application.SendResume();
}
_isInitialStart = false;
}
protected override void OnPause()
{
base.OnPause();
if (_application != null)
{
_application.SendSleep();
}
}
protected override void OnResume()
{
base.OnResume();
if (_application != null)
{
_application.SendResume();
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
public static Func RequestingUserConsentFunc { get; set; } = null;
public async void LoadApplication(Application application)
{
if (RequestingUserConsentFunc != null)
{
await RequestingUserConsentFunc();
}
if (null == MainWindow)
{
throw new InvalidOperationException("MainWindow is not prepared. This method should be called in OnCreated().");
}
if (null == application)
{
throw new ArgumentNullException(nameof(application));
}
_application = application;
Application.Current = application;
application.SendStart();
application.PropertyChanged += new PropertyChangedEventHandler(this.AppOnPropertyChanged);
SetPage(_application.MainPage);
}
void AppOnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if ("MainPage" == args.PropertyName)
{
SetPage(_application.MainPage);
}
}
void SetPage(Page page)
{
if (!Forms.IsInitialized)
{
throw new InvalidOperationException("Call Forms.Init (UIApplication) before this");
}
#pragma warning disable CS0618 // Type or member is obsolete
// The Platform property is no longer necessary, but we have to set it because some third-party
// library might still be retrieving it and using it
if (_application != null)
{
_application.Platform = _platform;
}
#pragma warning restore CS0618 // Type or member is obsolete
_platform.HasAlpha = MainWindow.Alpha;
_platform.SetPage(page);
}
void InitializeWindow()
{
Debug.Assert(MainWindow != null, "Window cannot be null");
MainWindow.Active();
MainWindow.Show();
var conformant = new Conformant(MainWindow);
conformant.Show();
var layout = new ELayout(conformant);
layout.SetTheme("layout", "application", "default");
layout.Show();
BaseLayout = layout;
conformant.SetContent(BaseLayout);
MainWindow.AvailableRotations = DisplayRotation.Degree_0 | DisplayRotation.Degree_90 | DisplayRotation.Degree_180 | DisplayRotation.Degree_270;
MainWindow.Deleted += (s, e) =>
{
Exit();
};
Device.Info.CurrentOrientation = MainWindow.GetDeviceOrientation();
MainWindow.RotationChanged += (sender, e) =>
{
Device.Info.CurrentOrientation = MainWindow.GetDeviceOrientation();
};
MainWindow.BackButtonPressed += (sender, e) =>
{
if (_platform != null)
{
if (!_platform.SendBackButtonPressed())
{
Exit();
}
}
};
_platform = Platform.CreatePlatform(BaseLayout);
BaseLayout.SetContent(_platform.GetRootNativeView());
_platform.RootNativeViewChanged += (s, e) => BaseLayout.SetContent(e.RootNativeView);
}
public void Run()
{
Run(System.Environment.GetCommandLineArgs());
}
///
/// Exits the application's main loop, which initiates the process of its termination
///
public override void Exit()
{
if (_platform == null)
{
Log.Warn("Exit was already called or FormsApplication is not initialized yet.");
return;
}
try
{
_platform.Dispose();
_platform = null;
}
catch (Exception e)
{
Log.Error("Exception thrown from Dispose: {0}", e.Message);
}
base.Exit();
}
}
static class WindowExtension
{
public static DeviceOrientation GetDeviceOrientation(this Window window)
{
DeviceOrientation orientation = DeviceOrientation.Other;
var isPortraitDevice = Forms.NaturalOrientation.IsPortrait();
switch (window.Rotation)
{
case 0:
case 180:
orientation = isPortraitDevice ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
break;
case 90:
case 270:
orientation = isPortraitDevice ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
break;
}
return orientation;
}
}
}