246 lines
8.8 KiB
C#
246 lines
8.8 KiB
C#
using System;
|
|
#if DEBUG
|
|
using System.Diagnostics;
|
|
#endif
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using Pixiview.Illust;
|
|
using Pixiview.Resources;
|
|
using Pixiview.UI.Theme;
|
|
using Pixiview.Utils;
|
|
using Xamarin.Essentials;
|
|
using Xamarin.Forms;
|
|
|
|
namespace Pixiview
|
|
{
|
|
public class App : Application
|
|
{
|
|
// public properties
|
|
public static AppTheme CurrentTheme { get; private set; }
|
|
public static PlatformCulture CurrentCulture { get; private set; }
|
|
|
|
public App()
|
|
{
|
|
Device.SetFlags(new string[0]);
|
|
}
|
|
|
|
private void InitResources()
|
|
{
|
|
var theme = AppInfo.RequestedTheme;
|
|
SetTheme(theme, true);
|
|
}
|
|
|
|
private void InitPreferences()
|
|
{
|
|
Configs.SetCookie(Preferences.Get(Configs.CookieKey, null));
|
|
Configs.SetUserId(Preferences.Get(Configs.UserIdKey, null));
|
|
|
|
Configs.DownloadIllustThreads = Preferences.Get(Configs.DownloadIllustThreadsKey, 1);
|
|
Configs.IsOnR18 = Preferences.Get(Configs.IsOnR18Key, false);
|
|
Configs.SyncFavType = (SyncType)Preferences.Get(Configs.SyncFavTypeKey, 0);
|
|
var isProxied = Preferences.Get(Configs.IsProxiedKey, false);
|
|
if (isProxied)
|
|
{
|
|
var host = Preferences.Get(Configs.HostKey, string.Empty);
|
|
int port = Preferences.Get(Configs.PortKey, 0);
|
|
if (!string.IsNullOrEmpty(host) && port > 0)
|
|
{
|
|
Configs.Proxy = new System.Net.WebProxy(host, port);
|
|
#if LOG
|
|
DebugPrint($"load proxy: {host}:{port}");
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
Configs.Proxy = null;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Configs.Proxy = null;
|
|
}
|
|
}
|
|
|
|
private void InitLanguage()
|
|
{
|
|
var ci = EnvironmentService.GetCurrentCultureInfo();
|
|
EnvironmentService.SetCultureInfo(ci);
|
|
CurrentCulture = new PlatformCulture(ci.Name.ToLower());
|
|
}
|
|
|
|
private void SetTheme(AppTheme theme, bool force = false)
|
|
{
|
|
if (force || theme != CurrentTheme)
|
|
{
|
|
CurrentTheme = theme;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
#if LOG
|
|
DebugPrint($"application theme: {theme}");
|
|
#endif
|
|
ThemeBase themeInstance;
|
|
if (theme == AppTheme.Dark)
|
|
{
|
|
themeInstance = DarkTheme.Instance;
|
|
}
|
|
else
|
|
{
|
|
themeInstance = LightTheme.Instance;
|
|
}
|
|
#if __IOS__
|
|
var style = (StatusBarStyles)themeInstance[ThemeBase.StatusBarStyle];
|
|
EnvironmentService.SetStatusBarStyle(style);
|
|
#elif __ANDROID__
|
|
var color = (Color)themeInstance[ThemeBase.NavColor];
|
|
EnvironmentService.SetStatusBarColor(color);
|
|
#endif
|
|
Resources = themeInstance;
|
|
}
|
|
|
|
protected override void OnStart()
|
|
{
|
|
InitLanguage();
|
|
MainPage = new AppShell();
|
|
|
|
InitResources();
|
|
InitPreferences();
|
|
}
|
|
|
|
protected override void OnSleep()
|
|
{
|
|
base.OnSleep();
|
|
}
|
|
|
|
protected override void OnResume()
|
|
{
|
|
var theme = AppInfo.RequestedTheme;
|
|
SetTheme(theme);
|
|
}
|
|
#if DEBUG
|
|
public static void DebugPrint(string message)
|
|
{
|
|
Debug.WriteLine("[{0:HH:mm:ss.ffff}] - {1}", DateTime.Now, message);
|
|
}
|
|
public static void DebugError(string category, string message)
|
|
{
|
|
Debug.Fail(string.Format("[{0:HH:mm:ss.ffff}] - {1} - {2}", DateTime.Now, category, message));
|
|
}
|
|
#else
|
|
public static void DebugPrint(string message)
|
|
{
|
|
Console.WriteLine("[Debug.Print] - {0}", message);
|
|
}
|
|
public static void DebugError(string category, string message)
|
|
{
|
|
Console.Error.WriteLine(string.Format("[Debug.Error] - {0} - {1}", category, message));
|
|
}
|
|
#endif
|
|
public static bool OpenUrl(Uri uri)
|
|
{
|
|
var current = Current.MainPage;
|
|
if (current != null && uri != null)
|
|
{
|
|
var url = uri.AbsolutePath;
|
|
if ("pixiview".Equals(uri.Scheme, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
var m = Regex.Match(url, "/artworks/([0-9]+)", RegexOptions.IgnoreCase);
|
|
if (m.Success)
|
|
{
|
|
var illust = new IllustItem { Id = m.Groups[1].Value };
|
|
var page = new ViewIllustPage(illust);
|
|
MainThread.BeginInvokeOnMainThread(() => current.Navigation.PushAsync(page));
|
|
}
|
|
else
|
|
{
|
|
MainThread.BeginInvokeOnMainThread(() => current.DisplayAlert(
|
|
url,
|
|
ResourceHelper.InvalidUrl,
|
|
ResourceHelper.Ok));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
url = System.Net.WebUtility.UrlDecode(url);
|
|
if (File.Exists(url))
|
|
{
|
|
IllustFavorite favObj;
|
|
try
|
|
{
|
|
favObj = Stores.LoadFavoritesIllusts(url);
|
|
foreach (var o in favObj.Illusts)
|
|
{
|
|
o.BookmarkId = null;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
DebugError("open.file", $"failed to parse file, name: {url}, error: {ex.Message}");
|
|
return true;
|
|
}
|
|
var path = Stores.FavoritesPath;
|
|
if (url == path)
|
|
{
|
|
return false;
|
|
}
|
|
if (File.Exists(path))
|
|
{
|
|
MainThread.BeginInvokeOnMainThread(async () =>
|
|
{
|
|
var opReplace = ResourceHelper.FavoritesReplace;
|
|
var opCombine = ResourceHelper.FavoritesCombine;
|
|
var result = await current.DisplayActionSheet(
|
|
ResourceHelper.FavoritesOperation,
|
|
ResourceHelper.Cancel,
|
|
opCombine,
|
|
opReplace);
|
|
if (result == opReplace)
|
|
{
|
|
// replace favorite file
|
|
File.Copy(url, path, true);
|
|
}
|
|
else if (result == opCombine)
|
|
{
|
|
// combine favorite file
|
|
var favNow = Stores.GetFavoriteObject();
|
|
var list = favNow.Illusts;
|
|
var distinct = favObj.Illusts.Where(f => !list.Any(i => i.Id == f.Id)).ToList();
|
|
list.InsertRange(0, distinct);
|
|
|
|
//favNow.Illusts = list;
|
|
Stores.SaveFavoritesIllusts();
|
|
}
|
|
|
|
if (Shell.Current.CurrentState.Location.OriginalString.EndsWith(Routes.Favorites))
|
|
{
|
|
var sc = (IShellSectionController)Shell.Current.CurrentItem.CurrentItem;
|
|
if (sc.PresentedPage is FavoritesPage fav)
|
|
{
|
|
fav.Reload(true);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
else
|
|
{
|
|
File.Copy(url, path);
|
|
if (Shell.Current.CurrentState.Location.OriginalString.EndsWith(Routes.Favorites))
|
|
{
|
|
var sc = (IShellSectionController)Shell.Current.CurrentItem.CurrentItem;
|
|
if (sc.PresentedPage is FavoritesPage fav)
|
|
{
|
|
fav.Reload(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|