X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FTizen.Applications.Common%2FTizen.Applications%2FCoreApplication.cs;h=f82edd1de4ee278851b81483e3da73db67312786;hb=9492ca5682eba69031060ad94d20ae3567a3550b;hp=5bf6e396d30df8f1a7add929ebb97aae3e24d394;hpb=4dc9f4e0a8e68182227a7946fd5d97e2f6188e65;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git
diff --git a/src/Tizen.Applications.Common/Tizen.Applications/CoreApplication.cs b/src/Tizen.Applications.Common/Tizen.Applications/CoreApplication.cs
old mode 100755
new mode 100644
index 5bf6e39..f82edd1
--- a/src/Tizen.Applications.Common/Tizen.Applications/CoreApplication.cs
+++ b/src/Tizen.Applications.Common/Tizen.Applications/CoreApplication.cs
@@ -15,23 +15,30 @@
*/
using System;
-
+using System.Globalization;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Timers;
using Tizen.Applications.CoreBackend;
namespace Tizen.Applications
{
///
- /// Class that represents an application controlled lifecycles by the backend system.
+ /// This class represents an application controlled lifecycles by the backend system.
///
+ /// 3
public class CoreApplication : Application
{
private readonly ICoreBackend _backend;
private bool _disposedValue = false;
+ private static Timer sTimer;
+
///
/// Initializes the CoreApplication class.
///
/// The backend instance implementing ICoreBacked interface.
+ /// 3
public CoreApplication(ICoreBackend backend)
{
_backend = backend;
@@ -40,52 +47,62 @@ namespace Tizen.Applications
///
/// Occurs when the application is launched.
///
+ /// 3
public event EventHandler Created;
///
/// Occurs when the application is about to shutdown.
///
+ /// 3
public event EventHandler Terminated;
///
/// Occurs whenever the application receives the appcontrol message.
///
+ /// 3
public event EventHandler AppControlReceived;
///
/// Occurs when the system memory is low.
///
+ /// 3
public event EventHandler LowMemory;
///
/// Occurs when the system battery is low.
///
+ /// 3
public event EventHandler LowBattery;
///
/// Occurs when the system language is chagned.
///
+ /// 3
public event EventHandler LocaleChanged;
///
/// Occurs when the region format is changed.
///
+ /// 3
public event EventHandler RegionFormatChanged;
///
/// Occurs when the device orientation is changed.
///
+ /// 3
public event EventHandler DeviceOrientationChanged;
///
/// The backend instance.
///
+ /// 3
protected ICoreBackend Backend { get { return _backend; } }
///
/// Runs the application's main loop.
///
/// Arguments from commandline.
+ /// 3
public override void Run(string[] args)
{
base.Run(args);
@@ -99,24 +116,20 @@ namespace Tizen.Applications
_backend.AddEventHandler(EventType.RegionFormatChanged, OnRegionFormatChanged);
_backend.AddEventHandler(EventType.DeviceOrientationChanged, OnDeviceOrientationChanged);
- string[] argsClone = null;
-
- if (args == null)
- {
- argsClone = new string[1];
- }
- else
+ string[] argsClone = new string[args.Length + 1];
+ if (args.Length > 1)
{
- argsClone = new string[args.Length + 1];
args.CopyTo(argsClone, 1);
}
argsClone[0] = string.Empty;
+
_backend.Run(argsClone);
}
///
/// Exits the main loop of the application.
///
+ /// 3
public override void Exit()
{
_backend.Exit();
@@ -126,8 +139,13 @@ namespace Tizen.Applications
/// Overrides this method if want to handle behavior when the application is launched.
/// If base.OnCreated() is not called, the event 'Created' will not be emitted.
///
+ /// 3
protected virtual void OnCreate()
{
+ string locale = ULocale.GetDefaultLocale();
+ ChangeCurrentUICultureInfo(locale);
+ ChangeCurrentCultureInfo(locale);
+
Created?.Invoke(this, EventArgs.Empty);
}
@@ -135,6 +153,7 @@ namespace Tizen.Applications
/// Overrides this method if want to handle behavior when the application is terminated.
/// If base.OnTerminate() is not called, the event 'Terminated' will not be emitted.
///
+ /// 3
protected virtual void OnTerminate()
{
Terminated?.Invoke(this, EventArgs.Empty);
@@ -145,6 +164,7 @@ namespace Tizen.Applications
/// If base.OnAppControlReceived() is not called, the event 'AppControlReceived' will not be emitted.
///
///
+ /// 3
protected virtual void OnAppControlReceived(AppControlReceivedEventArgs e)
{
AppControlReceived?.Invoke(this, e);
@@ -154,9 +174,23 @@ namespace Tizen.Applications
/// Overrides this method if want to handle behavior when the system memory is low.
/// If base.OnLowMemory() is not called, the event 'LowMemory' will not be emitted.
///
+ /// The low memory event argument
+ /// 3
protected virtual void OnLowMemory(LowMemoryEventArgs e)
{
LowMemory?.Invoke(this, e);
+ double interval = new Random().Next(10 * 1000);
+ if (interval <= 0)
+ interval = 10 * 1000;
+
+ sTimer = new Timer(interval);
+ sTimer.Elapsed += OnTimedEvent;
+ sTimer.AutoReset = false;
+ sTimer.Enabled = true;
+ }
+
+ private static void OnTimedEvent(Object source, ElapsedEventArgs e)
+ {
System.GC.Collect();
}
@@ -164,6 +198,8 @@ namespace Tizen.Applications
/// Overrides this method if want to handle behavior when the system battery is low.
/// If base.OnLowBattery() is not called, the event 'LowBattery' will not be emitted.
///
+ /// The low battery event argument
+ /// 3
protected virtual void OnLowBattery(LowBatteryEventArgs e)
{
LowBattery?.Invoke(this, e);
@@ -173,8 +209,11 @@ namespace Tizen.Applications
/// Overrides this method if want to handle behavior when the system language is changed.
/// If base.OnLocaleChanged() is not called, the event 'LocaleChanged' will not be emitted.
///
+ /// The locale changed event argument
+ /// 3
protected virtual void OnLocaleChanged(LocaleChangedEventArgs e)
{
+ ChangeCurrentUICultureInfo(e.Locale);
LocaleChanged?.Invoke(this, e);
}
@@ -182,8 +221,11 @@ namespace Tizen.Applications
/// Overrides this method if want to handle behavior when the region format is changed.
/// If base.OnRegionFormatChanged() is not called, the event 'RegionFormatChanged' will not be emitted.
///
+ /// The region format changed event argument
+ /// 3
protected virtual void OnRegionFormatChanged(RegionFormatChangedEventArgs e)
{
+ ChangeCurrentCultureInfo(e.Region);
RegionFormatChanged?.Invoke(this, e);
}
@@ -191,6 +233,8 @@ namespace Tizen.Applications
/// Overrides this method if want to handle behavior when the device orientation is changed.
/// If base.OnRegionFormatChanged() is not called, the event 'RegionFormatChanged' will not be emitted.
///
+ /// The device orientation changed event argument
+ /// 3
protected virtual void OnDeviceOrientationChanged(DeviceOrientationEventArgs e)
{
DeviceOrientationChanged?.Invoke(this, e);
@@ -200,6 +244,7 @@ namespace Tizen.Applications
/// Releases any unmanaged resources used by this object. Can also dispose any other disposable objects.
///
/// If true, disposes any disposable objects. If false, does not dispose disposable objects.
+ /// 3
protected override void Dispose(bool disposing)
{
if (!_disposedValue)
@@ -213,5 +258,212 @@ namespace Tizen.Applications
}
base.Dispose(disposing);
}
+
+ private CultureInfo ConvertCultureInfo(string locale)
+ {
+ ULocale pLocale = new ULocale(locale);
+
+ try
+ {
+ return new CultureInfo(pLocale.LCID);
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ return GetFallbackCultureInfo(pLocale);
+ }
+ catch (CultureNotFoundException)
+ {
+ return GetFallbackCultureInfo(pLocale);
+ }
+ }
+
+ private void ChangeCurrentCultureInfo(string locale)
+ {
+ CultureInfo.CurrentCulture = ConvertCultureInfo(locale);
+ }
+
+ private void ChangeCurrentUICultureInfo(string locale)
+ {
+ CultureInfo.CurrentUICulture = ConvertCultureInfo(locale);
+ }
+
+ private bool ExistCultureInfo(string locale)
+ {
+ foreach (var cultureInfo in CultureInfo.GetCultures(CultureTypes.AllCultures))
+ {
+ if (cultureInfo.Name == locale)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private CultureInfo GetCultureInfo(string locale)
+ {
+ if (!ExistCultureInfo(locale))
+ {
+ return null;
+ }
+
+ try
+ {
+ return new CultureInfo(locale);
+ }
+ catch (CultureNotFoundException)
+ {
+ return null;
+ }
+ }
+
+ private CultureInfo GetFallbackCultureInfo(ULocale uLocale)
+ {
+ string locale = uLocale.Locale.Replace("_", "-");
+ CultureInfo fallbackCultureInfo = GetCultureInfo(locale);
+
+ if (fallbackCultureInfo == null && uLocale.Script != null && uLocale.Country != null)
+ {
+ locale = uLocale.Language + "-" + uLocale.Script + "-" + uLocale.Country;
+ fallbackCultureInfo = GetCultureInfo(locale);
+ }
+
+ if (fallbackCultureInfo == null && uLocale.Script != null)
+ {
+ locale = uLocale.Language + "-" + uLocale.Script;
+ fallbackCultureInfo = GetCultureInfo(locale);
+ }
+
+ if (fallbackCultureInfo == null && uLocale.Country != null)
+ {
+ locale = uLocale.Language + "-" + uLocale.Country;
+ fallbackCultureInfo = GetCultureInfo(locale);
+ }
+
+ if (fallbackCultureInfo == null)
+ {
+ try
+ {
+ fallbackCultureInfo = new CultureInfo(uLocale.Language);
+ }
+ catch (CultureNotFoundException)
+ {
+ fallbackCultureInfo = new CultureInfo("en");
+ }
+ }
+
+ return fallbackCultureInfo;
+ }
+ }
+
+ internal class ULocale
+ {
+ private const int ULOC_FULLNAME_CAPACITY = 157;
+ private const int ULOC_LANG_CAPACITY = 12;
+ private const int ULOC_SCRIPT_CAPACITY = 6;
+ private const int ULOC_COUNTRY_CAPACITY = 4;
+ private const int ULOC_VARIANT_CAPACITY = ULOC_FULLNAME_CAPACITY;
+
+ internal ULocale(string locale)
+ {
+ Locale = Canonicalize(locale);
+ Language = GetLanguage(Locale);
+ Script = GetScript(Locale);
+ Country = GetCountry(Locale);
+ Variant = GetVariant(Locale);
+ LCID = GetLCID(Locale);
+ }
+
+ internal string Locale { get; private set; }
+ internal string Language { get; private set; }
+ internal string Script { get; private set; }
+ internal string Country { get; private set; }
+ internal string Variant { get; private set; }
+ internal int LCID { get; private set; }
+
+ private string Canonicalize(string localeName)
+ {
+ // Get the locale name from ICU
+ StringBuilder sb = new StringBuilder(ULOC_FULLNAME_CAPACITY);
+ if (Interop.BaseUtilsi18n.Canonicalize(localeName, sb, sb.Capacity) <= 0)
+ {
+ return null;
+ }
+
+ return sb.ToString();
+ }
+
+ private string GetLanguage(string locale)
+ {
+ // Get the language name from ICU
+ StringBuilder sb = new StringBuilder(ULOC_LANG_CAPACITY);
+ if (Interop.BaseUtilsi18n.GetLanguage(locale, sb, sb.Capacity, out int bufSizeLanguage) != 0)
+ {
+ return null;
+ }
+
+ return sb.ToString();
+ }
+
+ private string GetScript(string locale)
+ {
+ // Get the script name from ICU
+ StringBuilder sb = new StringBuilder(ULOC_SCRIPT_CAPACITY);
+ if (Interop.BaseUtilsi18n.GetScript(locale, sb, sb.Capacity) <= 0)
+ {
+ return null;
+ }
+
+ return sb.ToString();
+ }
+
+ private string GetCountry(string locale)
+ {
+ int err = 0;
+
+ // Get the country name from ICU
+ StringBuilder sb = new StringBuilder(ULOC_COUNTRY_CAPACITY);
+ if (Interop.BaseUtilsi18n.GetCountry(locale, sb, sb.Capacity, out err) <= 0)
+ {
+ return null;
+ }
+
+ return sb.ToString();
+ }
+
+ private string GetVariant(string locale)
+ {
+ // Get the variant name from ICU
+ StringBuilder sb = new StringBuilder(ULOC_VARIANT_CAPACITY);
+ if (Interop.BaseUtilsi18n.GetVariant(locale, sb, sb.Capacity) <= 0)
+ {
+ return null;
+ }
+
+ return sb.ToString();
+ }
+
+ private int GetLCID(string locale)
+ {
+ // Get the LCID from ICU
+ uint lcid = Interop.BaseUtilsi18n.GetLCID(locale);
+ return (int)lcid;
+ }
+
+ internal static string GetDefaultLocale()
+ {
+ IntPtr stringPtr = IntPtr.Zero;
+ if (Interop.BaseUtilsi18n.GetDefault(out stringPtr) != 0)
+ {
+ return string.Empty;
+ }
+
+ if (stringPtr == IntPtr.Zero)
+ {
+ return string.Empty;
+ }
+
+ return Marshal.PtrToStringAnsi(stringPtr);
+ }
}
}