diff --git a/src/Android/MainApplication.cs b/src/Android/MainApplication.cs index 994a7e122..fd83053e2 100644 --- a/src/Android/MainApplication.cs +++ b/src/Android/MainApplication.cs @@ -2,6 +2,8 @@ using System.IO; using System.Threading.Tasks; using Android.App; +using Android.Content; +using Android.OS; using Android.Runtime; using Bit.App.Abstractions; using Bit.App.Services; @@ -13,7 +15,9 @@ using Bit.Droid.Services; using Bit.Droid.Utilities; using Plugin.CurrentActivity; using Plugin.Fingerprint; -using Plugin.Fingerprint.Abstractions; +#if !FDROID +using Android.Gms.Security; +#endif namespace Bit.Droid { @@ -23,7 +27,11 @@ namespace Bit.Droid [Application(Debuggable = false)] #endif [Register("com.x8bit.bitwarden.MainApplication")] +#if FDROID public class MainApplication : Application +#else + public class MainApplication : Application, ProviderInstaller.IProviderInstallListener +#endif { public MainApplication(IntPtr handle, JniHandleOwnership transer) : base(handle, transer) @@ -38,6 +46,12 @@ namespace Bit.Droid Task.Delay(2000).Wait(); } } +#if !FDROID + if(Build.VERSION.SdkInt <= BuildVersionCodes.Kitkat) + { + ProviderInstaller.InstallIfNeededAsync(ApplicationContext, this); + } +#endif } public override void OnCreate() @@ -47,6 +61,14 @@ namespace Bit.Droid CrossCurrentActivity.Current.Init(this); } + public void OnProviderInstallFailed(int errorCode, Intent recoveryIntent) + { + } + + public void OnProviderInstalled() + { + } + private void RegisterLocalServices() { ServiceContainer.Register("logService", new AndroidLogService()); @@ -73,7 +95,7 @@ namespace Bit.Droid CrossFingerprint.SetDialogFragmentType(); var preferencesStorage = new PreferencesStorageService(null); - var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); + var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); var liteDbStorage = new LiteDbStorageService(Path.Combine(documentsPath, "bitwarden.db")); liteDbStorage.InitAsync(); var localizeService = new LocalizeService(); diff --git a/src/Android/ci-build-apks.ps1 b/src/Android/ci-build-apks.ps1 index cff95c22a..c20e702c8 100644 --- a/src/Android/ci-build-apks.ps1 +++ b/src/Android/ci-build-apks.ps1 @@ -3,7 +3,9 @@ $androidPath = $($rootPath + "\src\Android\Android.csproj"); $appPath = $($rootPath + "\src\App\App.csproj"); +echo "########################################" echo "##### Increment Version" +echo "########################################" $androidManifest = $($rootPath + "\src\Android\Properties\AndroidManifest.xml"); @@ -15,35 +17,73 @@ $node.SetAttribute("android:versionCode", $env:APPVEYOR_BUILD_NUMBER); $xml.Save($androidManifest); +echo "########################################" echo "##### Decrypt Keystore" +echo "########################################" $encKeystorePath = $($rootPath + "\src\Android\8bit.keystore.enc"); $secureFilePath = $($rootPath + "\secure-file\tools\secure-file.exe"); Invoke-Expression "& `"$secureFilePath`" -decrypt $($encKeystorePath) -secret $($env:keystore_dec_secret)" +echo "########################################" echo "##### Sign Release Configuration" +echo "########################################" -msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=Release" "/p:AndroidKeyStore=true" "/p:AndroidSigningKeyAlias=bitwarden" "/p:AndroidSigningKeyPass=$($env:keystore_password)" "/p:AndroidSigningKeyStore=8bit.keystore" "/p:AndroidSigningStorePass=$($env:keystore_password)" "/v:quiet" - +msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=Release" "/p:AndroidKeyStore=true" ` + "/p:AndroidSigningKeyAlias=bitwarden" "/p:AndroidSigningKeyPass=$($env:keystore_password)" ` + "/p:AndroidSigningKeyStore=8bit.keystore" "/p:AndroidSigningStorePass=$($env:keystore_password)" "/v:quiet" + +echo "########################################" echo "##### Copy Release apk to project root" +echo "########################################" $signedApkPath = $($rootPath + "\src\Android\bin\Release\com.x8bit.bitwarden-Signed.apk"); $signedApkDestPath = $($rootPath + "\com.x8bit.bitwarden.apk"); Copy-Item $signedApkPath $signedApkDestPath +echo "########################################" echo "##### Clean Android and App" +echo "########################################" msbuild "$($androidPath)" "/t:Clean" "/p:Configuration=FDroid" msbuild "$($appPath)" "/t:Clean" "/p:Configuration=FDroid" +echo "########################################" echo "##### Backup project files" +echo "########################################" +Copy-Item $androidManifest $($androidManifest + ".original"); Copy-Item $androidPath $($androidPath + ".original"); Copy-Item $appPath $($appPath + ".original"); + +echo "########################################" +echo "##### Cleanup Android Manifest" +echo "########################################" + +$xml=New-Object XML; +$xml.Load($androidManifest); + +$nsAndroid=New-Object System.Xml.XmlNamespaceManager($xml.NameTable); +$nsAndroid.AddNamespace("android", "http://schemas.android.com/apk/res/android"); + +$firebaseReceiver1=$xml.SelectSingleNode(` + "/manifest/application/receiver[@android:name='com.google.firebase.iid.FirebaseInstanceIdInternalReceiver']", ` + $nsAndroid); +$firebaseReceiver1.ParentNode.RemoveChild($firebaseReceiver1); + +$firebaseReceiver2=$xml.SelectSingleNode(` + "/manifest/application/receiver[@android:name='com.google.firebase.iid.FirebaseInstanceIdReceiver']", ` + $nsAndroid); +$firebaseReceiver2.ParentNode.RemoveChild($firebaseReceiver2); + +$xml.Save($androidManifest); + +echo "########################################" echo "##### Uninstall from Android.csproj" +echo "########################################" $xml=New-Object XML; $xml.Load($androidPath); @@ -51,12 +91,19 @@ $xml.Load($androidPath); $ns=New-Object System.Xml.XmlNamespaceManager($xml.NameTable); $ns.AddNamespace("ns", $xml.DocumentElement.NamespaceURI); -$firebaseNode=$xml.SelectSingleNode("/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.Firebase.Messaging']", $ns); +$firebaseNode=$xml.SelectSingleNode(` + "/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.Firebase.Messaging']", $ns); $firebaseNode.ParentNode.RemoveChild($firebaseNode); +$safetyNetNode=$xml.SelectSingleNode(` + "/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.GooglePlayServices.SafetyNet']", $ns); +$safetyNetNode.ParentNode.RemoveChild($safetyNetNode); + $xml.Save($androidPath); +echo "########################################" echo "##### Uninstall from App.csproj" +echo "########################################" $xml=New-Object XML; $xml.Load($appPath); @@ -66,22 +113,31 @@ $hockeyNode.ParentNode.RemoveChild($hockeyNode); $xml.Save($appPath); +echo "########################################" echo "##### Restore NuGet" - -$nugetPath = $($rootPath + "\nuget.exe"); +echo "########################################" Invoke-Expression "& nuget restore" +echo "########################################" echo "##### Build and Sign FDroid Configuration" +echo "########################################" -msbuild "$($androidPath)" "/logger:C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" "/p:Configuration=FDroid" -msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=FDroid" "/p:AndroidKeyStore=true" "/p:AndroidSigningKeyAlias=bitwarden" "/p:AndroidSigningKeyPass=$($env:keystore_password)" "/p:AndroidSigningKeyStore=8bit.keystore" "/p:AndroidSigningStorePass=$($env:keystore_password)" "/v:quiet" - +msbuild "$($androidPath)" "/logger:C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" ` + "/p:Configuration=FDroid" +msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=FDroid" "/p:AndroidKeyStore=true" ` + "/p:AndroidSigningKeyAlias=bitwarden" "/p:AndroidSigningKeyPass=$($env:keystore_password)" ` + "/p:AndroidSigningKeyStore=8bit.keystore" "/p:AndroidSigningStorePass=$($env:keystore_password)" "/v:quiet" + +echo "########################################" echo "##### Copy FDroid apk to project root" +echo "########################################" $signedApkPath = $($rootPath + "\src\Android\bin\FDroid\com.x8bit.bitwarden-Signed.apk"); $signedApkDestPath = $($rootPath + "\com.x8bit.bitwarden-fdroid.apk"); Copy-Item $signedApkPath $signedApkDestPath +echo "########################################" echo "##### Done" +echo "########################################"