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); + } } }