154 lines
4.5 KiB
C#
154 lines
4.5 KiB
C#
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Threading.Tasks;
|
|
using Billing.Languages;
|
|
using Billing.Models;
|
|
using Billing.Store;
|
|
using Billing.Themes;
|
|
using Billing.UI;
|
|
using Xamarin.Essentials;
|
|
using Xamarin.Forms;
|
|
|
|
namespace Billing
|
|
{
|
|
public class App : Application
|
|
{
|
|
internal const string NewBillAction = "/newbill";
|
|
|
|
public static AppTheme CurrentTheme { get; private set; }
|
|
public static PlatformCulture CurrentCulture { get; private set; }
|
|
public static List<Bill> Bills => bills ??= new List<Bill>();
|
|
public static List<Account> Accounts => accounts ??= new List<Account>();
|
|
public static List<Category> Categories => categories ??= new List<Category>();
|
|
public static bool SaveLocation => saveLocation;
|
|
public static string MainRoute => mainRoute;
|
|
|
|
private static List<Bill> bills;
|
|
private static List<Account> accounts;
|
|
private static List<Category> categories;
|
|
private static bool saveLocation;
|
|
private static string mainRoute;
|
|
|
|
private string initialUrl;
|
|
|
|
public App(string url = null)
|
|
{
|
|
if (url == NewBillAction)
|
|
{
|
|
#if __ANDROID__
|
|
mainRoute = "//Bills/Details";
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
mainRoute = "//Bills";
|
|
initialUrl = url;
|
|
}
|
|
CurrentCulture = new PlatformCulture();
|
|
saveLocation = Preferences.Get(Definition.SaveLocationKey, false);
|
|
InitResources();
|
|
|
|
MainPage = new MainShell();
|
|
}
|
|
|
|
protected override void OnStart()
|
|
{
|
|
Helper.Debug($"personal folder: {StoreHelper.PersonalFolder}");
|
|
Helper.Debug($"cache folder: {StoreHelper.CacheFolder}");
|
|
|
|
if (initialUrl != null)
|
|
{
|
|
var url = initialUrl;
|
|
initialUrl = null;
|
|
_ = OpenUrl(url);
|
|
}
|
|
}
|
|
|
|
protected override void OnResume()
|
|
{
|
|
SetTheme(AppInfo.RequestedTheme);
|
|
}
|
|
|
|
private void InitResources()
|
|
{
|
|
var theme = AppInfo.RequestedTheme;
|
|
SetTheme(theme, true);
|
|
}
|
|
|
|
private void SetTheme(AppTheme theme, bool force = false)
|
|
{
|
|
if (force || theme != CurrentTheme)
|
|
{
|
|
CurrentTheme = theme;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
Helper.Debug($"application theme: {theme}");
|
|
|
|
BaseTheme instance;
|
|
if (theme == AppTheme.Dark)
|
|
{
|
|
instance = Dark.Instance;
|
|
}
|
|
else
|
|
{
|
|
instance = Light.Instance;
|
|
}
|
|
// TODO: status bar
|
|
Resources = instance;
|
|
}
|
|
|
|
public static void SetSaveLocation(bool flag)
|
|
{
|
|
saveLocation = flag;
|
|
}
|
|
|
|
public static async Task InitializeData()
|
|
{
|
|
var instance = await StoreHelper.Instance;
|
|
await Task.WhenAll(
|
|
Task.Run(async () => accounts = await instance.GetListAsync<Account>()),
|
|
Task.Run(async () => categories = await instance.GetListAsync<Category>()),
|
|
Task.Run(async () => bills = await instance.GetListAsync<Bill>()));
|
|
}
|
|
|
|
#if __ANDROID__
|
|
public static async Task<bool> OpenUrl(string url)
|
|
#elif __IOS__
|
|
public static bool OpenUrl(string url)
|
|
#endif
|
|
{
|
|
if (string.IsNullOrEmpty(url))
|
|
{
|
|
return false;
|
|
}
|
|
if (File.Exists(url))
|
|
{
|
|
#if __ANDROID__
|
|
var status = await Helper.CheckAndRequestPermissionAsync<Permissions.StorageRead>();
|
|
if (status != PermissionStatus.Granted)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|
|
_ = Task.Run(async () =>
|
|
{
|
|
var result = await StoreHelper.ReloadDatabase(url);
|
|
if (result)
|
|
{
|
|
await InitializeData();
|
|
|
|
var current = Shell.Current.CurrentPage;
|
|
if (current is BillingPage page)
|
|
{
|
|
MainThread.BeginInvokeOnMainThread(() => page.TriggerRefresh());
|
|
}
|
|
}
|
|
});
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
} |