*/
using System;
-
+using System.Globalization;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Timers;
using Tizen.Applications.CoreBackend;
namespace Tizen.Applications
private readonly ICoreBackend _backend;
private bool _disposedValue = false;
+ private static Timer sTimer;
+
/// <summary>
/// Initializes the CoreApplication class.
/// </summary>
_backend.AddEventHandler<RegionFormatChangedEventArgs>(EventType.RegionFormatChanged, OnRegionFormatChanged);
_backend.AddEventHandler<DeviceOrientationEventArgs>(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);
}
/// <since_tizen> 3 </since_tizen>
protected virtual void OnCreate()
{
+ string locale = ULocale.GetDefaultLocale();
+ ChangeCurrentUICultureInfo(locale);
+ ChangeCurrentCultureInfo(locale);
+
Created?.Invoke(this, EventArgs.Empty);
}
/// 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.
/// </summary>
+ /// <param name="e">The low memory event argument</param>
/// <since_tizen> 3 </since_tizen>
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();
}
/// 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.
/// </summary>
+ /// <param name="e">The low battery event argument</param>
/// <since_tizen> 3 </since_tizen>
protected virtual void OnLowBattery(LowBatteryEventArgs e)
{
/// 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.
/// </summary>
+ /// <param name="e">The locale changed event argument</param>
/// <since_tizen> 3 </since_tizen>
protected virtual void OnLocaleChanged(LocaleChangedEventArgs e)
{
+ ChangeCurrentUICultureInfo(e.Locale);
LocaleChanged?.Invoke(this, e);
}
/// 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.
/// </summary>
+ /// <param name="e">The region format changed event argument</param>
/// <since_tizen> 3 </since_tizen>
protected virtual void OnRegionFormatChanged(RegionFormatChangedEventArgs e)
{
+ ChangeCurrentCultureInfo(e.Region);
RegionFormatChanged?.Invoke(this, e);
}
/// 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.
/// </summary>
+ /// <param name="e">The device orientation changed event argument</param>
/// <since_tizen> 3 </since_tizen>
protected virtual void OnDeviceOrientationChanged(DeviceOrientationEventArgs e)
{
}
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);
+ }
}
}