From d3af69b31ed907648f5f275848813b176cb8738f Mon Sep 17 00:00:00 2001 From: Tsanie Lily Date: Tue, 15 Mar 2022 22:45:21 +0800 Subject: [PATCH] feature: support db import on Android --- Billing.Shared/App.cs | 32 ++++++-- .../Billing.Android/Billing.Android.csproj | 75 ++++++++++++------- Billing/Billing.Android/MainActivity.cs | 17 ++++- .../Properties/AssemblyInfo.cs | 1 + .../Resources/Resource.designer.cs | 2 +- Billing/Billing.Android/SplashActivity.cs | 18 ++++- Billing/Billing.iOS/AppDelegate.cs | 6 +- 7 files changed, 113 insertions(+), 38 deletions(-) diff --git a/Billing.Shared/App.cs b/Billing.Shared/App.cs index cf65162..d5ff537 100644 --- a/Billing.Shared/App.cs +++ b/Billing.Shared/App.cs @@ -24,8 +24,11 @@ namespace Billing private static List accounts; private static List categories; - public App() + private string initialUrl; + + public App(string url = null) { + initialUrl = url; CurrentCulture = new PlatformCulture(); InitResources(); @@ -36,6 +39,13 @@ namespace Billing { Helper.Debug($"personal folder: {StoreHelper.PersonalFolder}"); Helper.Debug($"cache folder: {StoreHelper.CacheFolder}"); + + if (initialUrl != null) + { + var url = initialUrl; + initialUrl = null; + _ = OpenUrl(url); + } } public static async Task InitializeData() @@ -83,17 +93,25 @@ namespace Billing Resources = instance; } - public static bool OpenUrl(Uri uri) + public static async Task OpenUrl(string url) { - if (uri == null || !uri.IsFile) + if (string.IsNullOrEmpty(url)) { - return true; + return false; } - var absolute = uri.AbsolutePath; - var url = System.Net.WebUtility.UrlDecode(absolute); if (File.Exists(url)) { - Task.Run(async () => + var status = await Permissions.CheckStatusAsync(); + if (status != PermissionStatus.Disabled && + status != PermissionStatus.Granted) + { + status = await Permissions.RequestAsync(); + } + if (status != PermissionStatus.Granted) + { + return false; + } + _ = Task.Run(async () => { var result = await StoreHelper.ReloadDatabase(url); if (result) diff --git a/Billing/Billing.Android/Billing.Android.csproj b/Billing/Billing.Android/Billing.Android.csproj index 70629ec..9a73377 100644 --- a/Billing/Billing.Android/Billing.Android.csproj +++ b/Billing/Billing.Android/Billing.Android.csproj @@ -37,11 +37,11 @@ false false false - x86_64;x86 - true + x86;x86_64;arm64-v8a + false - true + false portable true bin\Release @@ -54,6 +54,10 @@ false false arm64-v8a + true + true + r8 + @@ -130,44 +134,64 @@ - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + @@ -583,10 +607,7 @@ - - - - + \ No newline at end of file diff --git a/Billing/Billing.Android/MainActivity.cs b/Billing/Billing.Android/MainActivity.cs index 18f4aad..51d68ff 100644 --- a/Billing/Billing.Android/MainActivity.cs +++ b/Billing/Billing.Android/MainActivity.cs @@ -1,7 +1,9 @@ using Android.App; +using Android.Content; using Android.Content.PM; using Android.Runtime; using Android.OS; +using Android.Net; namespace Billing.Droid { @@ -18,9 +20,22 @@ namespace Billing.Droid { base.OnCreate(savedInstanceState); + string url; + if (Intent.ActionView.Equals(Intent.Action) && Intent.Data is Uri uri) + { + url = uri.Path; + if (url != null && url.StartsWith("/root")) + { + url = url[5..]; + } + } + else + { + url = null; + } Xamarin.Essentials.Platform.Init(this, savedInstanceState); Xamarin.Forms.Forms.Init(this, savedInstanceState); - LoadApplication(new App()); + LoadApplication(new App(url)); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults) diff --git a/Billing/Billing.Android/Properties/AssemblyInfo.cs b/Billing/Billing.Android/Properties/AssemblyInfo.cs index f42b84f..12114b5 100644 --- a/Billing/Billing.Android/Properties/AssemblyInfo.cs +++ b/Billing/Billing.Android/Properties/AssemblyInfo.cs @@ -27,3 +27,4 @@ using Android.App; // Add some common permissions, these can be removed if not needed [assembly: UsesPermission(Android.Manifest.Permission.Internet)] [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)] +[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)] diff --git a/Billing/Billing.Android/Resources/Resource.designer.cs b/Billing/Billing.Android/Resources/Resource.designer.cs index f81d669..b3dabc0 100644 --- a/Billing/Billing.Android/Resources/Resource.designer.cs +++ b/Billing/Billing.Android/Resources/Resource.designer.cs @@ -14,7 +14,7 @@ namespace Billing.Droid { - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "12.2.0.155")] public partial class Resource { diff --git a/Billing/Billing.Android/SplashActivity.cs b/Billing/Billing.Android/SplashActivity.cs index 8f096bd..286ffe2 100644 --- a/Billing/Billing.Android/SplashActivity.cs +++ b/Billing/Billing.Android/SplashActivity.cs @@ -1,5 +1,6 @@ using Android.App; using Android.Content; +using Android.Net; using Android.OS; using AndroidX.AppCompat.App; using System.Threading.Tasks; @@ -11,6 +12,12 @@ namespace Billing.Droid NoHistory = true, Theme = "@style/MainTheme.Splash", Name = "org.tsanie.billing.SplashScreen")] + [IntentFilter( + new[] { Intent.ActionView }, + Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, + DataScheme = "file", + DataMimeType = "*/*", + DataPathPattern = ".*\\\\.db3")] public class SplashActivity : AppCompatActivity { public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState) @@ -23,7 +30,16 @@ namespace Billing.Droid protected override void OnResume() { base.OnResume(); - Task.Run(() => StartActivity(new Intent(Application.Context, typeof(MainActivity)))); + Task.Run(() => + { + var intent = new Intent(Application.Context, typeof(MainActivity)); + if (Intent?.Data is Uri uri) + { + intent.SetAction(Intent.ActionView); + intent.SetData(uri); + } + StartActivity(intent); + }); } } } \ No newline at end of file diff --git a/Billing/Billing.iOS/AppDelegate.cs b/Billing/Billing.iOS/AppDelegate.cs index 76aab35..2e73242 100644 --- a/Billing/Billing.iOS/AppDelegate.cs +++ b/Billing/Billing.iOS/AppDelegate.cs @@ -26,7 +26,11 @@ namespace Billing.iOS public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) { - return App.OpenUrl(url); + if (url?.IsFileUrl == true) + { + return App.OpenUrl(url.Path).Result; + } + return false; } } } \ No newline at end of file