Compare commits
	
		
			32 Commits
		
	
	
		
			v1.12-r6b
			...
			v1.12-r9-b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					da0513c768 | ||
| 
						 | 
					37f520cdbe | ||
| 
						 | 
					c98572bee0 | ||
| 
						 | 
					b1774ffc4b | ||
| 
						 | 
					57aaa0c4cd | ||
| 
						 | 
					b961ae1b33 | ||
| 
						 | 
					5e418e2b1b | ||
| 
						 | 
					6d22a213f3 | ||
| 
						 | 
					a76addc43f | ||
| 
						 | 
					1d96217713 | ||
| 
						 | 
					d2b8fdcfff | ||
| 
						 | 
					507b671448 | ||
| 
						 | 
					3118ffaeb5 | ||
| 
						 | 
					0abe29bd77 | ||
| 
						 | 
					f3a7831390 | ||
| 
						 | 
					37cd58f7ba | ||
| 
						 | 
					7dd80a8ef7 | ||
| 
						 | 
					c78636264b | ||
| 
						 | 
					035506a5a3 | ||
| 
						 | 
					4cf46ef062 | ||
| 
						 | 
					c7b8063171 | ||
| 
						 | 
					0a8b149c9a | ||
| 
						 | 
					9240a27791 | ||
| 
						 | 
					e90d5b903c | ||
| 
						 | 
					50b4a9f1b9 | ||
| 
						 | 
					9783c3b5fe | ||
| 
						 | 
					7a837e3237 | ||
| 
						 | 
					c8f6714373 | ||
| 
						 | 
					bc0313aa6a | ||
| 
						 | 
					0f98668bcd | ||
| 
						 | 
					0aa78ffd66 | ||
| 
						 | 
					c1dbf171f5 | 
							
								
								
									
										13
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -309,6 +309,14 @@ jobs:
 | 
			
		||||
      run: |
 | 
			
		||||
        make java
 | 
			
		||||
 | 
			
		||||
    - name: Update dotnet workloads
 | 
			
		||||
      run: |
 | 
			
		||||
        dotnet workload update        
 | 
			
		||||
 | 
			
		||||
    - name: Select the manifest
 | 
			
		||||
      run: |
 | 
			
		||||
        make manifestlink Flavor=Net
 | 
			
		||||
 | 
			
		||||
    - name: Install NuGet dependencies (net)
 | 
			
		||||
      run: make nuget Flavor=Net
 | 
			
		||||
 | 
			
		||||
@@ -327,12 +335,17 @@ jobs:
 | 
			
		||||
        path: |
 | 
			
		||||
          src/keepass2android/bin/*/*-Signed.apk
 | 
			
		||||
 | 
			
		||||
    - name: Select the manifest
 | 
			
		||||
      run: |
 | 
			
		||||
        make manifestlink Flavor=NoNet
 | 
			
		||||
 | 
			
		||||
    - name: Install NuGet dependencies (nonet)
 | 
			
		||||
      run: make nuget Flavor=NoNet
 | 
			
		||||
 | 
			
		||||
    - name: Build keepass2android (nonet)
 | 
			
		||||
      run: |
 | 
			
		||||
        make msbuild Flavor=NoNet
 | 
			
		||||
 | 
			
		||||
    - name: Test Autofill
 | 
			
		||||
      working-directory: ./src/Kp2aAutofillParser.Tests
 | 
			
		||||
      run: dotnet test
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,21 @@
 | 
			
		||||
name: Create keepass2android release
 | 
			
		||||
env:
 | 
			
		||||
  NAME: 'ReleaseNet'
 | 
			
		||||
  NAME: 'Release'
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  release:
 | 
			
		||||
    types: [published]  # Trigger when a new GitHub release is published
 | 
			
		||||
  workflow_dispatch: # For manual testing
 | 
			
		||||
 | 
			
		||||
  push:
 | 
			
		||||
    tags:
 | 
			
		||||
      - "v1.*"
 | 
			
		||||
jobs:
 | 
			
		||||
 | 
			
		||||
  build-release:
 | 
			
		||||
 | 
			
		||||
    runs-on: windows-2022
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        flavor: [Net, NoNet]
 | 
			
		||||
        target: [apk, apk_split]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    
 | 
			
		||||
@@ -76,49 +78,45 @@ jobs:
 | 
			
		||||
      run: |
 | 
			
		||||
        make java
 | 
			
		||||
 | 
			
		||||
    - name: Install NuGet dependencies (net)
 | 
			
		||||
      run: make nuget Flavor=Net
 | 
			
		||||
 | 
			
		||||
    - name: Use the _net manifest
 | 
			
		||||
    - name: Update dotnet workloads
 | 
			
		||||
      run: |
 | 
			
		||||
        make manifestlink Flavor=Net
 | 
			
		||||
        dotnet workload update        
 | 
			
		||||
 | 
			
		||||
    - name: Select the manifest
 | 
			
		||||
      run: |
 | 
			
		||||
        make manifestlink Flavor=${{ matrix.flavor }}
 | 
			
		||||
 | 
			
		||||
    - name: Install NuGet dependencies
 | 
			
		||||
      run: make nuget Flavor=${{ matrix.flavor }}
 | 
			
		||||
 | 
			
		||||
    - name: Build APK (net)
 | 
			
		||||
      env:
 | 
			
		||||
        KeyStore: "${{ github.workspace }}/kp2a.keystore"
 | 
			
		||||
        MyAndroidSigningStorePass: ${{ secrets.KEY_STORE_PASSWORD }}
 | 
			
		||||
        MyAndroidSigningKeyPass: ${{ secrets.KEY_PASSWORD }}
 | 
			
		||||
        DropboxAppKey: ${{ secrets.DROPBOX_APP_KEY }}
 | 
			
		||||
        DropboxAppSecret: ${{ secrets.DROPBOX_APP_SECRET }}
 | 
			
		||||
        DropboxAppFolderAppKey: ${{ secrets.DROPBOX_APP_FOLDER_APP_KEY }}
 | 
			
		||||
        DropboxAppFolderAppSecret: ${{ secrets.DROPBOX_APP_FOLDER_APP_SECRET }}
 | 
			
		||||
 | 
			
		||||
      run: |
 | 
			
		||||
        make Configuration=Release Flavor=Net
 | 
			
		||||
        make ${{ matrix.target }} Configuration=Release Flavor=${{ matrix.flavor }}
 | 
			
		||||
 | 
			
		||||
    - name: List files
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        ls src/keepass2android-app/bin/**/*.*
 | 
			
		||||
 | 
			
		||||
    - name: Archive production artifacts (net)
 | 
			
		||||
    - name: Archive production artifacts
 | 
			
		||||
      uses: actions/upload-artifact@v4
 | 
			
		||||
      with:
 | 
			
		||||
        name: signed APK ('net' built on ${{ github.job }})
 | 
			
		||||
        name: signed APK (built on ${{ github.job }})
 | 
			
		||||
        path: |
 | 
			
		||||
          src/keepass2android-app/bin/Release/net8.0-android/*-Signed.apk
 | 
			
		||||
          src/keepass2android-app/bin/Release/**/*.apk
 | 
			
		||||
    
 | 
			
		||||
    - name: Upload APK to GitHub Release
 | 
			
		||||
      uses: softprops/action-gh-release@v2
 | 
			
		||||
      if: github.ref_type == 'tag'
 | 
			
		||||
      with:
 | 
			
		||||
        files: |
 | 
			
		||||
            src/keepass2android-app/bin/Release/net8.0-android/*-Signed.apk
 | 
			
		||||
 | 
			
		||||
    - name: Run checksum action
 | 
			
		||||
      uses: thewh1teagle/checksum@v2
 | 
			
		||||
      with:
 | 
			
		||||
        pre-release: true
 | 
			
		||||
        file-name: 'apk-checksum-sha256.txt'
 | 
			
		||||
        patterns: | 
 | 
			
		||||
          src/keepass2android-app/bin/Release/net8.0-android/*-Signed.apk
 | 
			
		||||
        algorithm: sha256 
 | 
			
		||||
      env:
 | 
			
		||||
        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
    #- name: Upload APK to GitHub Release
 | 
			
		||||
    #  uses: softprops/action-gh-release@v2
 | 
			
		||||
    #  if: github.ref_type == 'tag'
 | 
			
		||||
    #  with:
 | 
			
		||||
    #    files: |
 | 
			
		||||
    #        src/keepass2android-app/bin/Release/net8.0-android/*/publish/*.apk src/keepass2android-app/bin/Release/net8.0-android/publish/*.apk
 | 
			
		||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -64,7 +64,7 @@ Thumbs.db
 | 
			
		||||
/src/java/android-filechooser/code/projectzip/project.zip
 | 
			
		||||
/src/java/android-filechooser/code/unused.txt
 | 
			
		||||
 | 
			
		||||
/src/Kp2aBusinessLogic/Io/DropboxFileStorageKeys.cs
 | 
			
		||||
/src/Kp2aBusinessLogic/Io/DropboxFileStorage.g.cs
 | 
			
		||||
 | 
			
		||||
/src/java/workspace/DriveTest
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								Makefile
									
									
									
									
									
								
							@@ -62,11 +62,11 @@ $(info )
 | 
			
		||||
 | 
			
		||||
# On linux use xabuild, on Windows use MSBuild.exe, otherwise (macos?) use msbuild.
 | 
			
		||||
ifeq ($(detected_OS),Linux)
 | 
			
		||||
  MSBUILD_binary := xabuild
 | 
			
		||||
  MSBUILD := $(shell $(WHICH) $(MSBUILD_binary))
 | 
			
		||||
  MSBUILD_binary := dotnet
 | 
			
		||||
  MSBUILD := $(shell $(WHICH) $(MSBUILD_binary)) publish
 | 
			
		||||
else ifeq ($(detected_OS),Windows)
 | 
			
		||||
  MSBUILD_binary := MSBuild.exe
 | 
			
		||||
  MSBUILD := $(shell $(WHICH) $(MSBUILD_binary) 2> nul)
 | 
			
		||||
  MSBUILD_binary := dotnet
 | 
			
		||||
  MSBUILD := $(shell $(WHICH) $(MSBUILD_binary) 2> nul) publish
 | 
			
		||||
  ifeq ($(MSBUILD),)
 | 
			
		||||
    # Additional heuristic to find MSBUILD_BINARY on Windows
 | 
			
		||||
    VSWHERE := "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
 | 
			
		||||
@@ -312,19 +312,20 @@ manifestlink:
 | 
			
		||||
	$(CREATE_MANIFEST_LINK)	
 | 
			
		||||
 | 
			
		||||
#####
 | 
			
		||||
src/Kp2aBusinessLogic/Io/DropboxFileStorageKeys.cs:
 | 
			
		||||
ifeq ($(detected_OS),Windows)
 | 
			
		||||
	$(CP) src\Kp2aBusinessLogic\Io\DropboxFileStorageKeysDummy.cs src\Kp2aBusinessLogic\Io\DropboxFileStorageKeys.cs
 | 
			
		||||
else
 | 
			
		||||
	$(CP) src/Kp2aBusinessLogic/Io/DropboxFileStorageKeysDummy.cs $@
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
msbuild: manifestlink native java nuget src/Kp2aBusinessLogic/Io/DropboxFileStorageKeys.cs
 | 
			
		||||
msbuild: manifestlink native java nuget 
 | 
			
		||||
	$(MSBUILD) src/KeePass.sln -target:keepass2android-app -p:AndroidSdkDirectory="$(ANDROID_SDK_ROOT)" -p:BuildProjectReferences=true $(MSBUILD_PARAM) -p:Platform="Any CPU" -m
 | 
			
		||||
 | 
			
		||||
apk: msbuild 
 | 
			
		||||
	$(MSBUILD) src/keepass2android-app/keepass2android-app.csproj -p:AndroidSdkDirectory="$(ANDROID_SDK_ROOT)" -t:SignAndroidPackage $(MSBUILD_PARAM) -p:Platform=AnyCPU -m 
 | 
			
		||||
 | 
			
		||||
apk_split: msbuild
 | 
			
		||||
	$(MSBUILD) src/keepass2android-app/keepass2android-app.csproj -p:AndroidSdkDirectory="$(ANDROID_SDK_ROOT)" -t:SignAndroidPackage $(MSBUILD_PARAM) -p:Platform=AnyCPU -m -p:RuntimeIdentifier=android-arm
 | 
			
		||||
	$(MSBUILD) src/keepass2android-app/keepass2android-app.csproj -p:AndroidSdkDirectory="$(ANDROID_SDK_ROOT)" -t:SignAndroidPackage $(MSBUILD_PARAM) -p:Platform=AnyCPU -m -p:RuntimeIdentifier=android-arm64
 | 
			
		||||
	$(MSBUILD) src/keepass2android-app/keepass2android-app.csproj -p:AndroidSdkDirectory="$(ANDROID_SDK_ROOT)" -t:SignAndroidPackage $(MSBUILD_PARAM) -p:Platform=AnyCPU -m -p:RuntimeIdentifier=android-x86
 | 
			
		||||
	$(MSBUILD) src/keepass2android-app/keepass2android-app.csproj -p:AndroidSdkDirectory="$(ANDROID_SDK_ROOT)" -t:SignAndroidPackage $(MSBUILD_PARAM) -p:Platform=AnyCPU -m -p:RuntimeIdentifier=android-x64
 | 
			
		||||
	src/build-scripts/rename-output-apks.sh src/keepass2android-app/bin/Release/net8.0-android/
 | 
			
		||||
 | 
			
		||||
build_all: msbuild
 | 
			
		||||
 | 
			
		||||
##### Cleanup targets
 | 
			
		||||
 
 | 
			
		||||
@@ -95,7 +95,7 @@ namespace Kp2aAutofillParserTest
 | 
			
		||||
            StructureParserBase<TestInputField> parser =
 | 
			
		||||
                new StructureParserBase<TestInputField>(new TestLogger(), new TestDalSourceTrustAll());
 | 
			
		||||
 | 
			
		||||
            var result = parser.ParseForFill(false, autofillView);
 | 
			
		||||
            var result = parser.ParseForFill(autofillView);
 | 
			
		||||
            if (expectedPackageName != null)
 | 
			
		||||
                Assert.Equal(expectedPackageName, result.PackageName);
 | 
			
		||||
            if (expectedWebDomain != null)
 | 
			
		||||
 
 | 
			
		||||
@@ -58,7 +58,8 @@
 | 
			
		||||
      "IsFocused": false,
 | 
			
		||||
      "InputType": 97,
 | 
			
		||||
      "HtmlInfoTag": null,
 | 
			
		||||
      "HtmlInfoTypeAttribute": null
 | 
			
		||||
      "HtmlInfoTypeAttribute": null,
 | 
			
		||||
      "ExpectedAssignedHints": [ "username" ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "IdEntry": "password_text_input_layout",
 | 
			
		||||
@@ -81,6 +82,7 @@
 | 
			
		||||
      "InputType": 129,
 | 
			
		||||
      "HtmlInfoTag": null,
 | 
			
		||||
      "HtmlInfoTypeAttribute": null,
 | 
			
		||||
      "ExpectedAssignedHints": [ "password" ]
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -476,8 +476,16 @@ namespace Kp2aAutofillParser
 | 
			
		||||
 | 
			
		||||
            foreach (var field in autofillFields.HintMap.Values.Distinct())
 | 
			
		||||
            {
 | 
			
		||||
                if (field == null || field.AutofillHints == null)
 | 
			
		||||
                {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var hint in field.AutofillHints)
 | 
			
		||||
                {
 | 
			
		||||
                    if (hint == null)
 | 
			
		||||
                    {
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (GetPartitionIndex(hint) == partitionIndex)
 | 
			
		||||
                    {
 | 
			
		||||
                        filteredCollection.Add(field);
 | 
			
		||||
@@ -793,14 +801,14 @@ namespace Kp2aAutofillParser
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public AutofillTargetId ParseForFill(bool isManual, AutofillView<FieldT> autofillView)
 | 
			
		||||
        public AutofillTargetId ParseForFill(AutofillView<FieldT> autofillView)
 | 
			
		||||
        {
 | 
			
		||||
            return Parse(true, isManual, autofillView);
 | 
			
		||||
            return Parse(true, autofillView);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public AutofillTargetId ParseForSave(AutofillView<FieldT> autofillView)
 | 
			
		||||
        {
 | 
			
		||||
            return Parse(false, true, autofillView);
 | 
			
		||||
            return Parse(false, autofillView);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@@ -808,8 +816,7 @@ namespace Kp2aAutofillParser
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <returns>The parse.</returns>
 | 
			
		||||
        /// <param name="forFill">If set to <c>true</c> for fill.</param>
 | 
			
		||||
        /// <param name="isManualRequest"></param>
 | 
			
		||||
        protected virtual AutofillTargetId Parse(bool forFill, bool isManualRequest, AutofillView<FieldT> autofillView)
 | 
			
		||||
        protected virtual AutofillTargetId Parse(bool forFill, AutofillView<FieldT> autofillView)
 | 
			
		||||
        {
 | 
			
		||||
            AutofillTargetId result = new AutofillTargetId()
 | 
			
		||||
            {
 | 
			
		||||
@@ -876,8 +883,9 @@ namespace Kp2aAutofillParser
 | 
			
		||||
                    
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                //for "heuristic determination" we demand that one of the filled fields is focused:
 | 
			
		||||
                if (passwordFields.Concat(usernameFields).Any(f => f.IsFocused))
 | 
			
		||||
                //for "heuristic determination" we demand that there is a password field or one of the username fields is focused:
 | 
			
		||||
                //Note that "IsFocused" might be false even when tapping the field. It might require long-press to autofill.
 | 
			
		||||
                if (passwordFields.Any() || usernameFields.Any(f => f.IsFocused))
 | 
			
		||||
                {
 | 
			
		||||
                    foreach (var uf in usernameFields)
 | 
			
		||||
                        AddFieldToHintMap(uf, new string[] { AutofillHintsHelper.AutofillHintUsername });
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
namespace keepass2android.Io
 | 
			
		||||
{
 | 
			
		||||
	public partial class DropboxFileStorage
 | 
			
		||||
	{
 | 
			
		||||
		private const string AppKey = "dummy";
 | 
			
		||||
		private const string AppSecret = "dummy";
 | 
			
		||||
	}
 | 
			
		||||
	public partial class DropboxAppFolderFileStorage
 | 
			
		||||
	{
 | 
			
		||||
		private const string AppKey = "dummy";
 | 
			
		||||
		private const string AppSecret = "dummy";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								src/Kp2aBusinessLogic/Io/GenerateSecrets.targets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/Kp2aBusinessLogic/Io/GenerateSecrets.targets
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
<Project>
 | 
			
		||||
  <Target Name="GenerateDropboxSecrets" BeforeTargets="BeforeCompile"
 | 
			
		||||
  Inputs="@(DropboxSecretLines)"
 | 
			
		||||
  Outputs="DropboxFileStorage.g.cs">
 | 
			
		||||
 | 
			
		||||
    <WriteLinesToFile
 | 
			
		||||
    File="Io/DropboxFileStorage.g.cs"
 | 
			
		||||
      Lines="@(DropboxSecretLines->'%(Text)')"
 | 
			
		||||
      Overwrite="true"
 | 
			
		||||
      />
 | 
			
		||||
  </Target>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <DropboxSecretLines Include="GeneratedDropboxSecrets">
 | 
			
		||||
      <Text>namespace keepass2android.Io {
 | 
			
		||||
    public partial class DropboxFileStorage {
 | 
			
		||||
      private const string AppKey = "$(DropboxAppKey)";
 | 
			
		||||
      private const string AppSecret = "$(DropboxAppSecret)";
 | 
			
		||||
    }
 | 
			
		||||
    public partial class DropboxAppFolderFileStorage {
 | 
			
		||||
      private const string AppKey = "$(DropboxAppFolderAppKey)";
 | 
			
		||||
      private const string AppSecret = "$(DropboxAppFolderAppSecret)";
 | 
			
		||||
    }
 | 
			
		||||
  }</Text>
 | 
			
		||||
    </DropboxSecretLines>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -4,30 +4,43 @@
 | 
			
		||||
    <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
 | 
			
		||||
    <Nullable>enable</Nullable>
 | 
			
		||||
    <ImplicitUsings>enable</ImplicitUsings>
 | 
			
		||||
    <DefineConstants Condition="'$(Flavor)'=='NoNet'">NO_QR_SCANNER;EXCLUDE_JAVAFILESTORAGE;NoNet</DefineConstants>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Folder Include="Resources\" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="FluentFTP" Version="51.1.0" />
 | 
			
		||||
    <PackageReference Include="MegaApiClient" Version="1.10.4" />
 | 
			
		||||
    <PackageReference Include="Microsoft.Graph" Version="5.68.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.Identity.Client" Version="4.67.1" />
 | 
			
		||||
    <PackageReference Include="FluentFTP" Version="51.1.0" Condition="'$(Flavor)'!='NoNet'"/>
 | 
			
		||||
    <PackageReference Include="MegaApiClient" Version="1.10.4"  Condition="'$(Flavor)'!='NoNet'"/>
 | 
			
		||||
    <PackageReference Include="Microsoft.Graph" Version="5.68.0" Condition="'$(Flavor)'!='NoNet'"/>
 | 
			
		||||
    <PackageReference Include="Microsoft.Identity.Client" Version="4.67.1" Condition="'$(Flavor)'!='NoNet'"/>
 | 
			
		||||
    <PackageReference Include="Xamarin.AndroidX.Browser" Version="1.8.0" />
 | 
			
		||||
    <PackageReference Include="Xamarin.AndroidX.Core" Version="1.13.1.5" />
 | 
			
		||||
    <PackageReference Include="Xamarin.Google.Android.Material" Version="1.11.0.3" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\AndroidFileChooserBinding\AndroidFileChooserBinding.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\JavaFileStorageBindings\JavaFileStorageBindings.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\JavaFileStorageBindings\JavaFileStorageBindings.csproj" Condition="'$(Flavor)'!='NoNet'"  />
 | 
			
		||||
    <ProjectReference Include="..\KeePassLib2Android\KeePassLib2Android.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\KP2AKdbLibraryBinding\KP2AKdbLibraryBinding.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\TwofishCipher\TwofishCipher.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
  <None Remove="Io/DropboxFileStorageKeysDummy.cs" />
 | 
			
		||||
  <Compile Remove="Io/DropboxFileStorageKeysDummy.cs" />
 | 
			
		||||
  <Content Remove="Io/DropboxFileStorageKeysDummy.cs" />
 | 
			
		||||
 | 
			
		||||
</ItemGroup>
 | 
			
		||||
<ItemGroup  Condition="'$(Flavor)'=='NoNet'">
 | 
			
		||||
  <None Remove="Io/OneDrive2FileStorage.cs" />
 | 
			
		||||
  <Compile Remove="Io/OneDrive2FileStorage.cs" />
 | 
			
		||||
  <Content Remove="Io/OneDrive2FileStorage.cs" />
 | 
			
		||||
  <None Remove="Io/MegaFileStorage.cs" />
 | 
			
		||||
  <Compile Remove="Io/MegaFileStorage.cs" />
 | 
			
		||||
  <Content Remove="Io/MegaFileStorage.cs" />
 | 
			
		||||
</ItemGroup>
 | 
			
		||||
 | 
			
		||||
<Import Project="Io/GenerateSecrets.targets" />
 | 
			
		||||
<ItemGroup>
 | 
			
		||||
<Compile Include="Io/DropboxFileStorage.g.cs" />
 | 
			
		||||
</ItemGroup>
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
</Project>
 | 
			
		||||
@@ -15,7 +15,14 @@ namespace KeePass.Util
 | 
			
		||||
            string errorMessage = e.Message;
 | 
			
		||||
            if (e is Java.Lang.Exception javaException)
 | 
			
		||||
            {
 | 
			
		||||
                errorMessage = javaException.LocalizedMessage ?? javaException.Message ?? errorMessage;
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    errorMessage = javaException.LocalizedMessage ?? javaException.Message ?? errorMessage;
 | 
			
		||||
                }
 | 
			
		||||
                finally
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return errorMessage;
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,6 @@ git clone --recurse-submodules https://github.com/PhilippC/keepass2android.git
 | 
			
		||||
cd keepass2android/src/build-scripts
 | 
			
		||||
./build-java.sh && ./build-native.sh
 | 
			
		||||
cd ..
 | 
			
		||||
cp Kp2aBusinessLogic/Io/DropboxFileStorageKeysDummy.cs Kp2aBusinessLogic/Io/DropboxFileStorageKeys.cs
 | 
			
		||||
cd keepass2android-app
 | 
			
		||||
ln -s Manifests/AndroidManifest_debug.xml AndroidManifest.xml
 | 
			
		||||
dotnet workload restore
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								src/build-scripts/rename-output-apks.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/build-scripts/rename-output-apks.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
BASE_DIR="${1}"
 | 
			
		||||
 | 
			
		||||
for arch_dir in "$BASE_DIR"/android-*/; do
 | 
			
		||||
  arch=$(basename "$arch_dir")
 | 
			
		||||
  arch=${arch#android-}
 | 
			
		||||
  APK_DIR="${arch_dir}publish"
 | 
			
		||||
  if [[ -d "$APK_DIR" ]]; then
 | 
			
		||||
    apk_path=$(find "$APK_DIR" -maxdepth 1 -type f -name "*.apk" | head -n1)
 | 
			
		||||
    if [[ -n "$apk_path" ]]; then
 | 
			
		||||
      base=$(basename "$apk_path" .apk)
 | 
			
		||||
      new_path="$APK_DIR/${base}-${arch}.apk"
 | 
			
		||||
      mv "$apk_path" "$new_path"
 | 
			
		||||
      echo "Renamed $apk_path to $new_path"
 | 
			
		||||
    else
 | 
			
		||||
      echo "No APK found in $APK_DIR"
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    echo "Directory $APK_DIR does not exist"
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
@@ -6,8 +6,7 @@
 | 
			
		||||
        android:allowBackup="true"
 | 
			
		||||
        android:icon="@mipmap/ic_launcher"
 | 
			
		||||
        android:label="@string/app_name"
 | 
			
		||||
        android:supportsRtl="true"
 | 
			
		||||
        android:theme="@style/AppTheme">
 | 
			
		||||
        android:supportsRtl="true">
 | 
			
		||||
        <activity android:name="com.crocoapps.javafilestoragetest2.MainActivity"
 | 
			
		||||
                  android:exported="true">
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ using keepass2android;
 | 
			
		||||
 | 
			
		||||
namespace keepass2android
 | 
			
		||||
{
 | 
			
		||||
	[Activity(Label = AppNames.AppName)]
 | 
			
		||||
	[Activity(Label = AppNames.AppName, Theme = "@style/Kp2aTheme_BlueNoActionBar")]
 | 
			
		||||
	public class AppKilledInfo : Activity, IDialogInterfaceOnDismissListener
 | 
			
		||||
	{
 | 
			
		||||
		protected override void OnCreate(Bundle bundle)
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ using keepass2android.services.AutofillBase;
 | 
			
		||||
 | 
			
		||||
namespace keepass2android
 | 
			
		||||
{
 | 
			
		||||
    [Activity(Label = "DisableAutofillForQueryActivity")]
 | 
			
		||||
    [Activity(Label = "DisableAutofillForQueryActivity", Theme = "@style/Kp2aTheme_ActionBar")]
 | 
			
		||||
    public class DisableAutofillForQueryActivity : Activity
 | 
			
		||||
    {
 | 
			
		||||
        public IAutofillIntentBuilder IntentBuilder = new Kp2aAutofillIntentBuilder();
 | 
			
		||||
@@ -63,8 +63,6 @@ namespace keepass2android
 | 
			
		||||
 | 
			
		||||
            prefs.Edit().PutStringSet("AutoFillDisabledQueries", disabledValues).Commit();
 | 
			
		||||
 | 
			
		||||
            bool isManual = Intent.GetBooleanExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, false);
 | 
			
		||||
            
 | 
			
		||||
            Intent reply = new Intent();
 | 
			
		||||
            FillResponse.Builder builder = new FillResponse.Builder();
 | 
			
		||||
            AssistStructure structure = (AssistStructure)Intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure);
 | 
			
		||||
@@ -77,7 +75,7 @@ namespace keepass2android
 | 
			
		||||
            StructureParser parser = new StructureParser(this, structure);
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                parser.ParseForFill(isManual);
 | 
			
		||||
                parser.ParseForFill();
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            catch (Java.Lang.SecurityException e)
 | 
			
		||||
 
 | 
			
		||||
@@ -37,8 +37,10 @@ using System.Net;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using Android.Content.Res;
 | 
			
		||||
using Android.Database;
 | 
			
		||||
#if !NO_QR_SCANNER
 | 
			
		||||
using Android.Gms.Common;
 | 
			
		||||
using Android.Gms.Tasks;
 | 
			
		||||
#endif
 | 
			
		||||
using Android.Graphics;
 | 
			
		||||
using Android.Graphics.Drawables;
 | 
			
		||||
using Android.Runtime;
 | 
			
		||||
@@ -55,10 +57,11 @@ using Object = Java.Lang.Object;
 | 
			
		||||
using Uri = Android.Net.Uri;
 | 
			
		||||
using Resource = keepass2android.Resource;
 | 
			
		||||
using Google.Android.Material.TextField;
 | 
			
		||||
#if !NO_QR_SCANNER
 | 
			
		||||
using Xamarin.Google.MLKit.Vision.Barcode.Common;
 | 
			
		||||
using Xamarin.Google.MLKit.Vision.CodeScanner;
 | 
			
		||||
#endif
 | 
			
		||||
using Console = System.Console;
 | 
			
		||||
using Task = Android.Gms.Tasks.Task;
 | 
			
		||||
 | 
			
		||||
namespace keepass2android
 | 
			
		||||
{
 | 
			
		||||
@@ -1158,8 +1161,10 @@ namespace keepass2android
 | 
			
		||||
            {
 | 
			
		||||
                dlgView.FindViewById(Resource.Id.totp_custom_settings_group).Visibility = args.IsChecked ? ViewStates.Visible : ViewStates.Gone;
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            dlgView.FindViewById<Button>(Resource.Id.totp_scan).Click += async (object o, EventArgs args) =>
 | 
			
		||||
#if NO_QR_SCANNER
 | 
			
		||||
            dlgView.FindViewById<Button>(Resource.Id.totp_scan).Visibility = ViewStates.Gone;
 | 
			
		||||
#else
 | 
			
		||||
			dlgView.FindViewById<Button>(Resource.Id.totp_scan).Click += async (object o, EventArgs args) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this) != ConnectionResult.Success)
 | 
			
		||||
                {
 | 
			
		||||
@@ -1194,6 +1199,7 @@ namespace keepass2android
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
			//copy values from entry into dialog
 | 
			
		||||
			View ees = (View)sender.Parent;
 | 
			
		||||
@@ -1572,6 +1578,7 @@ namespace keepass2android
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
#if !NO_QR_SCANNER
 | 
			
		||||
    public class SuccessListener : Object, IOnSuccessListener
 | 
			
		||||
    {
 | 
			
		||||
        private readonly Action<Barcode> _onSuccess;
 | 
			
		||||
@@ -1601,8 +1608,9 @@ namespace keepass2android
 | 
			
		||||
            _onFailure?.Invoke(e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    public class DefaultEdit : EditModeBase
 | 
			
		||||
	public class DefaultEdit : EditModeBase
 | 
			
		||||
	{
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -894,9 +894,14 @@ namespace keepass2android
 | 
			
		||||
                    RegisterInfoTextDisplay(
 | 
			
		||||
                        "DbReadOnly"); //this ensures that we don't show the general info texts too soon
 | 
			
		||||
 | 
			
		||||
                    FindViewById<TextView>(Resource.Id.dbreadonly_infotext_text).Text =
 | 
			
		||||
                    (GetString(Resource.String.FileReadOnlyMessagePre) + " " +
 | 
			
		||||
                     App.Kp2a.GetResourceString(reason.Result));
 | 
			
		||||
                    var infotext_view = FindViewById<TextView>(Resource.Id.dbreadonly_infotext_text);
 | 
			
		||||
                    if (infotext_view != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        infotext_view.Text =
 | 
			
		||||
                            (GetString(Resource.String.FileReadOnlyMessagePre) + " " +
 | 
			
		||||
                             App.Kp2a.GetResourceString(reason.Result));
 | 
			
		||||
                    }
 | 
			
		||||
                    
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            UpdateBottomBarElementVisibility(Resource.Id.dbreadonly_infotext, canShow);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
			android:versionCode="210"
 | 
			
		||||
			android:versionName="1.12-r6b"
 | 
			
		||||
			package="keepass2android.keepass2android"
 | 
			
		||||
			xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
			android:installLocation="auto">
 | 
			
		||||
      android:versionCode="217"
 | 
			
		||||
      android:versionName="1.12-r9c"
 | 
			
		||||
      package="keepass2android.keepass2android"
 | 
			
		||||
      xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
      android:installLocation="auto">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  <queries>
 | 
			
		||||
@@ -46,13 +46,11 @@
 | 
			
		||||
 | 
			
		||||
  <permission android:description="@string/permission_desc2" android:icon="@drawable/ic_launcher" android:label="KP2A entry search" android:name="keepass2android.keepass2android.permission.KP2aInternalSearch" android:protectionLevel="signature" />
 | 
			
		||||
  <permission android:description="@string/permission_desc3" android:icon="@drawable/ic_launcher" android:label="KP2A choose autofill dataset" android:name="keepass2android.keepass2android.permission.Kp2aChooseAutofill" android:protectionLevel="signature" />
 | 
			
		||||
 | 
			
		||||
  <application android:label="keepass2android"
 | 
			
		||||
	android:icon="@mipmap/ic_launcher_online"
 | 
			
		||||
	android:roundIcon="@mipmap/ic_launcher_online_round"
 | 
			
		||||
	android:networkSecurityConfig="@xml/network_security_config"
 | 
			
		||||
 | 
			
		||||
	>
 | 
			
		||||
    android:icon="@mipmap/ic_launcher_online"
 | 
			
		||||
    android:roundIcon="@mipmap/ic_launcher_online_round"
 | 
			
		||||
    android:networkSecurityConfig="@xml/network_security_config"
 | 
			
		||||
  >
 | 
			
		||||
 | 
			
		||||
    <meta-data
 | 
			
		||||
      android:name="com.google.mlkit.vision.DEPENDENCIES"
 | 
			
		||||
@@ -107,16 +105,15 @@
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
    </activity>
 | 
			
		||||
    <activity android:name="keepass2android.softkeyboard.InputLanguageSelection"
 | 
			
		||||
              
 | 
			
		||||
               android:exported="true">
 | 
			
		||||
      <!-- android:label="@string/language_selection_title" TODO  -->
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="android.intent.action.MAIN"/>
 | 
			
		||||
        <action android:name="keepass2android.softkeyboard.INPUT_LANGUAGE_SELECTION"/>
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
    </activity>
 | 
			
		||||
    <activity android:configChanges="orientation|keyboard|keyboardHidden" android:label="@string/app_name" android:theme="@style/Kp2aTheme_BlueNoActionBar" android:name="keepass2android.SelectCurrentDbActivity"  android:windowSoftInputMode="adjustResize" android:exported="true">
 | 
			
		||||
    <activity android:configChanges="orientation|keyboard|keyboardHidden" android:label="@string/app_name" android:theme="@style/Kp2aTheme_BlueNoActionBar" android:name="keepass2android.SelectCurrentDbActivity" android:windowSoftInputMode="adjustResize"
 | 
			
		||||
    android:exported="true">
 | 
			
		||||
      <intent-filter android:label="@string/app_name">
 | 
			
		||||
        <action android:name="android.intent.action.VIEW" />
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
 
 | 
			
		||||
@@ -1,24 +1,27 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
			android:versionCode="200" 
 | 
			
		||||
			android:versionName="1.11-r0" 
 | 
			
		||||
			package="keepass2android.keepass2android_nonet"
 | 
			
		||||
			xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
			android:installLocation="auto">
 | 
			
		||||
      android:versionCode="217"
 | 
			
		||||
      android:versionName="1.12-r9c"
 | 
			
		||||
      package="keepass2android.keepass2android_nonet"
 | 
			
		||||
      xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
      android:installLocation="auto">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  <queries>
 | 
			
		||||
    <!-- Specific intents and packages we query for (required since Android 11) -->
 | 
			
		||||
    <package android:name="keepass2android.plugin.keyboardswap2" />
 | 
			
		||||
    <package android:name="keepass2android.AncientIconSet" />
 | 
			
		||||
	<package android:name="com.dropbox.android" />
 | 
			
		||||
    <package android:name="keepass2android.plugin.qr" />
 | 
			
		||||
    <package android:name="it.andreacioni.kp2a.plugin.keelink" />
 | 
			
		||||
    <package android:name="com.inputstick.apps.kp2aplugin" />
 | 
			
		||||
    <package android:name="com.dropbox.android" />
 | 
			
		||||
 | 
			
		||||
    <intent>
 | 
			
		||||
        <action android:name="android.intent.action.OPEN_DOCUMENT" />
 | 
			
		||||
        <data android:mimeType="*/*" />
 | 
			
		||||
      </intent>
 | 
			
		||||
      <action android:name="android.intent.action.OPEN_DOCUMENT" />
 | 
			
		||||
      <data android:mimeType="*/*" />
 | 
			
		||||
    </intent>
 | 
			
		||||
 | 
			
		||||
	  <intent>
 | 
			
		||||
    <intent>
 | 
			
		||||
      <action android:name="android.intent.action.GET_DOCUMENT" />
 | 
			
		||||
      <data android:mimeType="*/*" />
 | 
			
		||||
    </intent>
 | 
			
		||||
@@ -36,59 +39,57 @@
 | 
			
		||||
    </intent>
 | 
			
		||||
 | 
			
		||||
    <intent>
 | 
			
		||||
        <action android:name="android.intent.action.VIEW" />
 | 
			
		||||
	  </intent>
 | 
			
		||||
      <action android:name="android.intent.action.VIEW" />
 | 
			
		||||
    </intent>
 | 
			
		||||
  </queries>
 | 
			
		||||
  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
 | 
			
		||||
 | 
			
		||||
	<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
 | 
			
		||||
  <permission android:description="@string/permission_desc2" android:icon="@drawable/ic_launcher_offline" android:label="KP2A entry search" android:name="keepass2android.keepass2android_nonet.permission.KP2aInternalSearch" android:protectionLevel="signature" />
 | 
			
		||||
  <permission android:description="@string/permission_desc3" android:icon="@drawable/ic_launcher_offline" android:label="KP2A choose autofill dataset" android:name="keepass2android.keepass2android_nonet.permission.Kp2aChooseAutofill" android:protectionLevel="signature" />
 | 
			
		||||
	<application 
 | 
			
		||||
		android:label="keepass2android" 
 | 
			
		||||
		android:icon="@mipmap/ic_launcher_offline"
 | 
			
		||||
		android:networkSecurityConfig="@xml/network_security_config"
 | 
			
		||||
	>
 | 
			
		||||
  <application android:label="keepass2android"
 | 
			
		||||
    android:icon="@mipmap/ic_launcher_offline"
 | 
			
		||||
    android:roundIcon="@mipmap/ic_launcher_offline_round"
 | 
			
		||||
    android:networkSecurityConfig="@xml/network_security_config"
 | 
			
		||||
  >
 | 
			
		||||
 | 
			
		||||
    <meta-data
 | 
			
		||||
      android:name="com.google.mlkit.vision.DEPENDENCIES"
 | 
			
		||||
      android:value="barcode_ui"/>
 | 
			
		||||
 | 
			
		||||
		<uses-library
 | 
			
		||||
    <uses-library
 | 
			
		||||
            android:name="org.apache.http.legacy"
 | 
			
		||||
            android:required="false"/>
 | 
			
		||||
  
 | 
			
		||||
		<provider android:name="group.pals.android.lib.ui.filechooser.providers.localfile.LocalFileProvider" android:authorities="keepass2android.keepass2android_nonet.android-filechooser.localfile" android:exported="false" />
 | 
			
		||||
		<provider android:name="group.pals.android.lib.ui.filechooser.providers.history.HistoryProvider" android:authorities="keepass2android.keepass2android_nonet.android-filechooser.history" android:exported="false" />
 | 
			
		||||
		<activity android:name="group.pals.android.lib.ui.filechooser.FileChooserActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:screenOrientation="user" android:theme="@style/Afc.Theme.Light">
 | 
			
		||||
		</activity>
 | 
			
		||||
    <provider android:name="group.pals.android.lib.ui.filechooser.providers.localfile.LocalFileProvider" android:authorities="keepass2android.keepass2android_nonet.android-filechooser.localfile" android:exported="false" />
 | 
			
		||||
    <provider android:name="group.pals.android.lib.ui.filechooser.providers.history.HistoryProvider" android:authorities="keepass2android.keepass2android_nonet.android-filechooser.history" android:exported="false" />
 | 
			
		||||
    <activity android:name="group.pals.android.lib.ui.filechooser.FileChooserActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:screenOrientation="user" android:theme="@style/Afc.Theme.Light">
 | 
			
		||||
    </activity>
 | 
			
		||||
 | 
			
		||||
		<service android:name="keepass2android.softkeyboard.KP2AKeyboard" android:permission="android.permission.BIND_INPUT_METHOD" android:exported="true">
 | 
			
		||||
			<intent-filter>
 | 
			
		||||
				<action android:name="android.view.InputMethod" />
 | 
			
		||||
			</intent-filter>
 | 
			
		||||
			<meta-data android:name="android.view.im" android:resource="@xml/method" />
 | 
			
		||||
		</service>
 | 
			
		||||
		<activity android:name="keepass2android.softkeyboard.LatinIMESettings" android:label="@string/english_ime_settings" android:exported="true">
 | 
			
		||||
			<intent-filter>
 | 
			
		||||
				<action android:name="android.intent.action.MAIN" />
 | 
			
		||||
			</intent-filter>
 | 
			
		||||
			<intent-filter>
 | 
			
		||||
				<action android:name="keepass2android.softkeyboard.LatinIMESettings" />
 | 
			
		||||
				<category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
			</intent-filter>
 | 
			
		||||
		</activity>
 | 
			
		||||
		 <activity android:name="keepass2android.softkeyboard.InputLanguageSelection"
 | 
			
		||||
                android:label="@string/language_selection_title"
 | 
			
		||||
                android:exported="true">
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
                <action android:name="android.intent.action.MAIN"/>
 | 
			
		||||
                <action android:name="keepass2android.softkeyboard.INPUT_LANGUAGE_SELECTION"/>
 | 
			
		||||
                <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
        </activity>
 | 
			
		||||
 
 | 
			
		||||
		<activity android:configChanges="orientation|keyboard|keyboardHidden" android:label="@string/app_name" android:theme="@style/Kp2aTheme_BlueNoActionBar" android:name="keepass2android.SelectCurrentDbActivity" android:windowSoftInputMode="adjustResize"
 | 
			
		||||
              android:exported="true">
 | 
			
		||||
    <service android:name="keepass2android.softkeyboard.KP2AKeyboard" android:permission="android.permission.BIND_INPUT_METHOD" android:exported="true">
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="android.view.InputMethod" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
      <meta-data android:name="android.view.im" android:resource="@xml/method" />
 | 
			
		||||
    </service>
 | 
			
		||||
    <activity android:name="keepass2android.softkeyboard.LatinIMESettings" android:label="@string/english_ime_settings" android:exported="true">
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="android.intent.action.MAIN" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="keepass2android.softkeyboard.LatinIMESettings" />
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
    </activity>
 | 
			
		||||
    <activity android:name="keepass2android.softkeyboard.InputLanguageSelection"
 | 
			
		||||
               android:exported="true">
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="android.intent.action.MAIN"/>
 | 
			
		||||
        <action android:name="keepass2android.softkeyboard.INPUT_LANGUAGE_SELECTION"/>
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
    </activity>
 | 
			
		||||
    <activity android:configChanges="orientation|keyboard|keyboardHidden" android:label="@string/app_name" android:theme="@style/Kp2aTheme_BlueNoActionBar" android:name="keepass2android.SelectCurrentDbActivity" android:windowSoftInputMode="adjustResize"
 | 
			
		||||
    android:exported="true">
 | 
			
		||||
      <intent-filter android:label="@string/app_name">
 | 
			
		||||
        <action android:name="android.intent.action.VIEW" />
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
@@ -98,7 +99,7 @@
 | 
			
		||||
        <data android:host="*" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
 | 
			
		||||
	  <intent-filter>
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="kp2a.action.SelectCurrentDbActivity" />
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
@@ -112,7 +113,7 @@
 | 
			
		||||
        <data android:mimeType="application/*" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
 | 
			
		||||
<!-- intent filter for opening database files 
 | 
			
		||||
      <!-- intent filter for opening database files 
 | 
			
		||||
Note that this stopped working nicely with Android 7, see e.g. https://stackoverflow.com/a/26635162/292233
 | 
			
		||||
KP2A was using 
 | 
			
		||||
<data android:scheme="content" />
 | 
			
		||||
@@ -126,7 +127,7 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<!-- This intent filter is for apps which use content with a URI containing the extension but no specific mimeType, e.g. ASTRO file manager -->
 | 
			
		||||
      <!-- This intent filter is for apps which use content with a URI containing the extension but no specific mimeType, e.g. ASTRO file manager -->
 | 
			
		||||
 | 
			
		||||
      <intent-filter android:label="@string/app_name">
 | 
			
		||||
        <action android:name="android.intent.action.VIEW" />
 | 
			
		||||
@@ -168,7 +169,7 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
 | 
			
		||||
      <!-- This intent filter is for apps which use content with a URI not containing the extension but at least specify mimeType=application/octet-stream, e.g. GoogleDrive or FolderSync -->
 | 
			
		||||
<intent-filter android:label="@string/app_name">
 | 
			
		||||
      <intent-filter android:label="@string/app_name">
 | 
			
		||||
        <action android:name="android.intent.action.VIEW" />
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
        <category android:name="android.intent.category.BROWSABLE" />
 | 
			
		||||
@@ -218,24 +219,15 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
 | 
			
		||||
        <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.kdb" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="android.intent.action.VIEW"/>
 | 
			
		||||
        <category android:name="android.intent.category.BROWSABLE"/>
 | 
			
		||||
        <data
 | 
			
		||||
          android:scheme="https"
 | 
			
		||||
          android:host="my.yubico.com"
 | 
			
		||||
          android:pathPrefix="/neo"/>
 | 
			
		||||
      <intent-filter android:label="@string/kp2a_findUrl">
 | 
			
		||||
        <action android:name="android.intent.action.SEND" />
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
        <data android:mimeType="text/plain" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="keepass2android.ACTION_START_WITH_TASK" />
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
	  
 | 
			
		||||
			<intent-filter android:label="@string/kp2a_findUrl">
 | 
			
		||||
				<action android:name="android.intent.action.SEND" />
 | 
			
		||||
				<category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
				<data android:mimeType="text/plain" />
 | 
			
		||||
			</intent-filter>
 | 
			
		||||
			<intent-filter>
 | 
			
		||||
				<action android:name="keepass2android.ACTION_START_WITH_TASK" />
 | 
			
		||||
				<category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
			</intent-filter>
 | 
			
		||||
      <intent-filter>
 | 
			
		||||
        <action android:name="android.intent.action.VIEW" />
 | 
			
		||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
			
		||||
@@ -244,24 +236,28 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
 | 
			
		||||
        <data android:host="totp"/>
 | 
			
		||||
        <data android:host="hotp"/>
 | 
			
		||||
      </intent-filter>
 | 
			
		||||
		</activity>
 | 
			
		||||
		<uses-library android:required="false" android:name="com.sec.android.app.multiwindow" />
 | 
			
		||||
		<meta-data android:name="com.sec.android.support.multiwindow" android:value="true" />
 | 
			
		||||
		<meta-data android:name="com.sec.android.multiwindow.DEFAULT_SIZE_W" android:value="632.0dip" />
 | 
			
		||||
		<meta-data android:name="com.sec.android.multiwindow.DEFAULT_SIZE_H" android:value="598.0dip" />
 | 
			
		||||
		<meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_W" android:value="426.0dip" />
 | 
			
		||||
		<meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_H" android:value="360.0dip" />
 | 
			
		||||
	</application>
 | 
			
		||||
	<uses-permission android:name="android.permission.VIBRATE" />
 | 
			
		||||
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 | 
			
		||||
	<uses-permission android:name="android.permission.USE_FINGERPRINT" />
 | 
			
		||||
    </activity>
 | 
			
		||||
    <uses-library android:required="false" android:name="com.sec.android.app.multiwindow" />
 | 
			
		||||
    <meta-data android:name="com.sec.android.support.multiwindow" android:value="true" />
 | 
			
		||||
    <meta-data android:name="com.sec.android.multiwindow.DEFAULT_SIZE_W" android:value="632.0dip" />
 | 
			
		||||
    <meta-data android:name="com.sec.android.multiwindow.DEFAULT_SIZE_H" android:value="598.0dip" />
 | 
			
		||||
    <meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_W" android:value="426.0dip" />
 | 
			
		||||
    <meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_H" android:value="360.0dip" />
 | 
			
		||||
  </application>
 | 
			
		||||
  <uses-permission android:name="android.permission.VIBRATE" />
 | 
			
		||||
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 | 
			
		||||
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 | 
			
		||||
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 | 
			
		||||
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
 | 
			
		||||
  <uses-permission android:name="keepass2android.keepass2android_nonet.permission.KP2aInternalFileBrowsing" />
 | 
			
		||||
  <uses-permission android:name="keepass2android.keepass2android_nonet.permission.KP2aInternalSearch" />
 | 
			
		||||
  <uses-permission android:name="android.permission.USE_FINGERPRINT" />
 | 
			
		||||
  <uses-permission android:name="android.permission.USE_BIOMETRIC" />
 | 
			
		||||
  <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
 | 
			
		||||
 | 
			
		||||
  <uses-feature android:name="android.hardware.camera" android:required="false" />
 | 
			
		||||
 | 
			
		||||
  <uses-permission android:name="keepass2android.keepass2android_nonet.permission.KP2aInternalFileBrowsing" />
 | 
			
		||||
  <uses-permission android:name="keepass2android.keepass2android_nonet.permission.KP2aInternalSearch" />
 | 
			
		||||
  <!-- Samsung Pass permission -->
 | 
			
		||||
  <uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />
 | 
			
		||||
  <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
 | 
			
		||||
	
 | 
			
		||||
</manifest>
 | 
			
		||||
 
 | 
			
		||||
@@ -1245,7 +1245,7 @@ namespace keepass2android
 | 
			
		||||
	    {
 | 
			
		||||
	        var db = TryFindDatabaseForElement(element);
 | 
			
		||||
            if (db == null)
 | 
			
		||||
                throw new Exception("Database element not found!");
 | 
			
		||||
                throw new Exception($"Database element {element.Uuid} not found in any of {OpenDatabases.Count()} databases!");
 | 
			
		||||
	        return db;
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ using Android.Content.Res;
 | 
			
		||||
using Android.Preferences;
 | 
			
		||||
using Google.Android.Material.Dialog;
 | 
			
		||||
using keepass2android;
 | 
			
		||||
using PluginTOTP;
 | 
			
		||||
 | 
			
		||||
namespace keepass2android
 | 
			
		||||
{
 | 
			
		||||
@@ -638,19 +639,7 @@ namespace keepass2android
 | 
			
		||||
 | 
			
		||||
            if (CopyTotpToClipboard && isTotpEntry)
 | 
			
		||||
            {
 | 
			
		||||
                Dictionary<string, string> entryFields = pwEntryOutput.OutputStrings.ToDictionary(pair => StrUtil.SafeXmlString(pair.Key), pair => pair.Value.ReadString());
 | 
			
		||||
                var totpData= totpPluginAdapter.GetTotpData(entryFields, activity, true);
 | 
			
		||||
                if (totpData.IsTotpEntry)
 | 
			
		||||
                {
 | 
			
		||||
                    TOTPProvider prov = new TOTPProvider(totpData);
 | 
			
		||||
                    string totp = prov.GenerateByByte(totpData.TotpSecret);
 | 
			
		||||
                    CopyToClipboardService.CopyValueToClipboardWithTimeout(activity, totp, true);
 | 
			
		||||
 | 
			
		||||
                    App.Kp2a.ShowMessage(activity, activity.GetString(Resource.String.TotpCopiedToClipboard),
 | 
			
		||||
                         MessageSeverity.Info);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                
 | 
			
		||||
                DoCopyTotpToClipboard(activity, pwEntryOutput, totpPluginAdapter);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (CloseAfterCreate)
 | 
			
		||||
@@ -661,7 +650,23 @@ namespace keepass2android
 | 
			
		||||
                activity.CloseAfterTaskComplete();	
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
        private static void DoCopyTotpToClipboard(EntryActivity activity, PwEntryOutput pwEntryOutput,
 | 
			
		||||
            ITotpPluginAdapter? totpPluginAdapter)
 | 
			
		||||
        {
 | 
			
		||||
            Dictionary<string, string> entryFields = pwEntryOutput.OutputStrings.ToDictionary(pair => StrUtil.SafeXmlString(pair.Key), pair => pair.Value.ReadString());
 | 
			
		||||
            var totpData = totpPluginAdapter.GetTotpData(entryFields, activity, true);
 | 
			
		||||
            if (totpData.IsTotpEntry)
 | 
			
		||||
            {
 | 
			
		||||
                TOTPProvider prov = new TOTPProvider(totpData);
 | 
			
		||||
                string totp = prov.GenerateByByte(totpData.TotpSecret);
 | 
			
		||||
                CopyToClipboardService.CopyValueToClipboardWithTimeout(activity, totp, true);
 | 
			
		||||
 | 
			
		||||
                App.Kp2a.ShowMessage(activity, activity.GetString(Resource.String.TotpCopiedToClipboard),
 | 
			
		||||
                    MessageSeverity.Info);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/// <summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@
 | 
			
		||||
    <ApplicationVersion>1</ApplicationVersion>
 | 
			
		||||
    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
 | 
			
		||||
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
 | 
			
		||||
    <DefineConstants Condition="'$(Flavor)'=='NoNet'">NO_QR_SCANNER;EXCLUDE_JAVAFILESTORAGE;NoNet</DefineConstants>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <None Remove="Assets\fontawesome-webfont.ttf" />
 | 
			
		||||
@@ -750,18 +751,18 @@
 | 
			
		||||
    <PackageReference Include="Xamarin.AndroidX.Preference" Version="1.2.1.12" />
 | 
			
		||||
    <PackageReference Include="Xamarin.Google.Android.Material" Version="1.12.0.2" />
 | 
			
		||||
    <PackageReference Include="Xamarin.Google.Guava" Version="33.4.0.1" />
 | 
			
		||||
    <PackageReference Include="Xamarin.GooglePlayServices.Auth" Version="121.3.0.1" />
 | 
			
		||||
    <PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.5.0.4" />
 | 
			
		||||
    <PackageReference Include="Xamarin.GooglePlayServices.Code.Scanner" Version="116.1.0.10" />
 | 
			
		||||
    <PackageReference Include="Xamarin.GooglePlayServices.Auth" Version="121.3.0.1" Condition="'$(Flavor)'!='NoNet'" />
 | 
			
		||||
    <PackageReference Include="Xamarin.GooglePlayServices.Base" Version="118.5.0.4" Condition="'$(Flavor)'!='NoNet'" />
 | 
			
		||||
    <PackageReference Include="Xamarin.GooglePlayServices.Code.Scanner" Version="116.1.0.10" Condition="'$(Flavor)'!='NoNet'" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\AndroidFileChooserBinding\AndroidFileChooserBinding.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\DropboxBinding\DropboxBinding.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\JavaFileStorageBindings\JavaFileStorageBindings.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\DropboxBinding\DropboxBinding.csproj" Condition="'$(Flavor)'!='NoNet'" />
 | 
			
		||||
    <ProjectReference Include="..\JavaFileStorageBindings\JavaFileStorageBindings.csproj" Condition="'$(Flavor)'!='NoNet'" />
 | 
			
		||||
    <ProjectReference Include="..\Kp2aAutofillParser\Kp2aAutofillParser.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\KP2AKdbLibraryBinding\KP2AKdbLibraryBinding.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\Kp2aKeyboardBinding\Kp2aKeyboardBinding.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\PCloudBindings\PCloudBindings.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\PCloudBindings\PCloudBindings.csproj" Condition="'$(Flavor)'!='NoNet'" />
 | 
			
		||||
    <ProjectReference Include="..\PluginSdkBinding\PluginSdkBinding.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\ZlibAndroid\ZlibAndroid.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\TwofishCipher\TwofishCipher.csproj" />
 | 
			
		||||
 
 | 
			
		||||
@@ -28,13 +28,11 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
{
 | 
			
		||||
    public interface IAutofillIntentBuilder
 | 
			
		||||
    {
 | 
			
		||||
        PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage,
 | 
			
		||||
            bool isManualRequest, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning);
 | 
			
		||||
        PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning);
 | 
			
		||||
 | 
			
		||||
        PendingIntent GetAuthPendingIntentForWarning(Context context, PwUuid entryUuid, AutofillServiceBase.DisplayWarning warning);
 | 
			
		||||
 | 
			
		||||
        PendingIntent GetDisablePendingIntentForResponse(Context context, string query, 
 | 
			
		||||
            bool isManualRequest, bool isDisable);
 | 
			
		||||
        PendingIntent GetDisablePendingIntentForResponse(Context context, string query, bool isDisable);
 | 
			
		||||
        Intent GetRestartAppIntent(Context context);
 | 
			
		||||
 | 
			
		||||
        int AppIconResource { get; }
 | 
			
		||||
@@ -150,7 +148,7 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
                var parser = new StructureParser(this, structure);
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    query = parser.ParseForFill(isManual);
 | 
			
		||||
                    query = parser.ParseForFill();
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                catch (Java.Lang.SecurityException e)
 | 
			
		||||
@@ -213,16 +211,14 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
                    {
 | 
			
		||||
                        if (query.WebDomain != null)
 | 
			
		||||
                            AddQueryDataset(query.WebDomain,
 | 
			
		||||
                                query.WebDomain, query.PackageName,
 | 
			
		||||
                                isManual, autofillIds, responseBuilder, !hasEntryDataset,
 | 
			
		||||
                                query.WebDomain, query.PackageName, autofillIds, responseBuilder, !hasEntryDataset,
 | 
			
		||||
                                query.IncompatiblePackageAndDomain
 | 
			
		||||
                                    ? DisplayWarning.FillDomainInUntrustedApp
 | 
			
		||||
                                    : DisplayWarning.None,
 | 
			
		||||
                                AutofillHelper.ExtractSpec(inlinePresentationSpecs, entryDatasets.Count));
 | 
			
		||||
                        else
 | 
			
		||||
                            AddQueryDataset(query.PackageNameWithPseudoSchema,
 | 
			
		||||
                                query.WebDomain, query.PackageName,
 | 
			
		||||
                                isManual, autofillIds, responseBuilder, !hasEntryDataset, DisplayWarning.None,
 | 
			
		||||
                                query.WebDomain, query.PackageName, autofillIds, responseBuilder, !hasEntryDataset, DisplayWarning.None,
 | 
			
		||||
                                AutofillHelper.ExtractSpec(inlinePresentationSpecs, entryDatasets.Count));
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -340,9 +336,9 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void AddQueryDataset(string query, string queryDomain, string queryPackage, bool isManual, AutofillId[] autofillIds, FillResponse.Builder responseBuilder, bool autoReturnFromQuery, DisplayWarning warning, InlinePresentationSpec inlinePresentationSpec)
 | 
			
		||||
        private void AddQueryDataset(string query, string queryDomain, string queryPackage, AutofillId[] autofillIds, FillResponse.Builder responseBuilder, bool autoReturnFromQuery, DisplayWarning warning, InlinePresentationSpec inlinePresentationSpec)
 | 
			
		||||
        {
 | 
			
		||||
            PendingIntent pendingIntent = IntentBuilder.GetAuthPendingIntentForResponse(this, query, queryDomain, queryPackage, isManual, autoReturnFromQuery, warning);
 | 
			
		||||
            PendingIntent pendingIntent = IntentBuilder.GetAuthPendingIntentForResponse(this, query, queryDomain, queryPackage, autoReturnFromQuery, warning);
 | 
			
		||||
            string text = GetString(Resource.String.autofill_sign_in_prompt);
 | 
			
		||||
            RemoteViews overlayPresentation = AutofillHelper.NewRemoteViews(base.PackageName,
 | 
			
		||||
                text, AppNames.LauncherIcon);
 | 
			
		||||
@@ -396,7 +392,7 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
            if (isQueryDisabled && !isManual)
 | 
			
		||||
                return;
 | 
			
		||||
            bool isForDisable = !isQueryDisabled;
 | 
			
		||||
            var pendingIntent = IntentBuilder.GetDisablePendingIntentForResponse(this, query, isManual, isForDisable);
 | 
			
		||||
            var pendingIntent = IntentBuilder.GetDisablePendingIntentForResponse(this, query, isForDisable);
 | 
			
		||||
 | 
			
		||||
            string text = GetString(isForDisable ? Resource.String.autofill_disable : Resource.String.autofill_enable_for, new Java.Lang.Object[] { GetDisplayNameForQuery(query, this) });
 | 
			
		||||
            RemoteViews presentation = AutofillHelper.NewRemoteViews(base.PackageName,
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,6 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
        public static string ExtraQueryPackageString => "EXTRA_QUERY_PACKAGE_STRING";
 | 
			
		||||
        public static string ExtraQueryDomainString => "EXTRA_QUERY_DOMAIN_STRING";
 | 
			
		||||
        public static string ExtraUseLastOpenedEntry => "EXTRA_USE_LAST_OPENED_ENTRY"; //if set to true, no query UI is displayed. Can be used to just show a warning
 | 
			
		||||
        public static string ExtraIsManualRequest => "EXTRA_IS_MANUAL_REQUEST";
 | 
			
		||||
        public static string ExtraAutoReturnFromQuery => "EXTRA_AUTO_RETURN_FROM_QUERY";
 | 
			
		||||
        public static string ExtraDisplayWarning => "EXTRA_DISPLAY_WARNING";
 | 
			
		||||
 | 
			
		||||
@@ -185,18 +184,18 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
            ReplyIntent = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void OnSuccess(FilledAutofillFieldCollection<ViewNodeInputField> clientFormDataMap, bool isManual)
 | 
			
		||||
        protected void OnSuccess(FilledAutofillFieldCollection<ViewNodeInputField> clientFormDataMap)
 | 
			
		||||
        {
 | 
			
		||||
            var intent = Intent;
 | 
			
		||||
            AssistStructure structure = (AssistStructure)intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure);
 | 
			
		||||
            if (structure == null)
 | 
			
		||||
            if (structure == null || clientFormDataMap == null)
 | 
			
		||||
            {
 | 
			
		||||
                SetResult(Result.Canceled);
 | 
			
		||||
                Finish();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            StructureParser parser = new StructureParser(this, structure);
 | 
			
		||||
            parser.ParseForFill(isManual);
 | 
			
		||||
            parser.ParseForFill();
 | 
			
		||||
            AutofillFieldMetadataCollection autofillFields = parser.AutofillFields;
 | 
			
		||||
            var partitionData = AutofillHintsHelper.FilterForPartition(clientFormDataMap, parser.AutofillFields.FocusedAutofillCanonicalHints);
 | 
			
		||||
            
 | 
			
		||||
@@ -229,7 +228,7 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
 | 
			
		||||
        private void ReturnSuccess()
 | 
			
		||||
        {
 | 
			
		||||
            OnSuccess(GetDataset(), Intent.GetBooleanExtra(ExtraIsManualRequest, false));
 | 
			
		||||
            OnSuccess(GetDataset());
 | 
			
		||||
            Finish();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
            domainSuffixParserCache = new PublicSuffixRuleCache(context);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public AutofillView<ViewNodeInputField> GetAutofillView(bool isManualRequest)
 | 
			
		||||
        public AutofillView<ViewNodeInputField> GetAutofillView()
 | 
			
		||||
        {
 | 
			
		||||
            AutofillView<ViewNodeInputField> autofillView = new AutofillView<ViewNodeInputField>();
 | 
			
		||||
            
 | 
			
		||||
@@ -83,7 +83,7 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
                var node = _structure.GetWindowNodeAt(i);
 | 
			
		||||
 | 
			
		||||
                var view = node.RootViewNode;
 | 
			
		||||
                ParseRecursive(autofillView, view, isManualRequest);
 | 
			
		||||
                ParseRecursive(autofillView, view);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            autofillView.PackageId = autofillView.PackageId ?? _structure.ActivityComponent.PackageName;
 | 
			
		||||
@@ -93,7 +93,7 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        void ParseRecursive(AutofillView<ViewNodeInputField> autofillView, AssistStructure.ViewNode viewNode, bool isManualRequest)
 | 
			
		||||
        void ParseRecursive(AutofillView<ViewNodeInputField> autofillView, AssistStructure.ViewNode viewNode)
 | 
			
		||||
        {
 | 
			
		||||
            String webDomain = viewNode.WebDomain;
 | 
			
		||||
            if ((autofillView.PackageId == null) && (!string.IsNullOrWhiteSpace(viewNode.IdPackage)) &&
 | 
			
		||||
@@ -129,7 +129,7 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
            {
 | 
			
		||||
                for (int i = 0; i < childrenSize; i++)
 | 
			
		||||
                {
 | 
			
		||||
                    ParseRecursive(autofillView, viewNode.GetChildAt(i), isManualRequest);
 | 
			
		||||
                    ParseRecursive(autofillView, viewNode.GetChildAt(i));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -159,11 +159,11 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override AutofillTargetId Parse(bool forFill, bool isManualRequest, AutofillView<ViewNodeInputField> autofillView)
 | 
			
		||||
        protected override AutofillTargetId Parse(bool forFill, AutofillView<ViewNodeInputField> autofillView)
 | 
			
		||||
        {
 | 
			
		||||
            if (autofillView == null)
 | 
			
		||||
                Kp2aLog.Log("Received null autofill view!");
 | 
			
		||||
            var result = base.Parse(forFill, isManualRequest, autofillView);
 | 
			
		||||
            var result = base.Parse(forFill, autofillView);
 | 
			
		||||
 | 
			
		||||
            Kp2aLog.Log("Parsing done");
 | 
			
		||||
 | 
			
		||||
@@ -185,14 +185,14 @@ namespace keepass2android.services.AutofillBase
 | 
			
		||||
 | 
			
		||||
        public AutofillTargetId ParseForSave()
 | 
			
		||||
        {
 | 
			
		||||
            var autofillView = new AutofillViewFromAssistStructureFinder(_context, _structure).GetAutofillView(true);
 | 
			
		||||
            return Parse(false, true, autofillView);
 | 
			
		||||
            var autofillView = new AutofillViewFromAssistStructureFinder(_context, _structure).GetAutofillView();
 | 
			
		||||
            return Parse(false, autofillView);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public StructureParserBase<ViewNodeInputField>.AutofillTargetId ParseForFill(bool isManual)
 | 
			
		||||
        public StructureParserBase<ViewNodeInputField>.AutofillTargetId ParseForFill()
 | 
			
		||||
        {
 | 
			
		||||
            var autofillView = new AutofillViewFromAssistStructureFinder(_context, _structure).GetAutofillView(isManual);
 | 
			
		||||
            return Parse(true, isManual, autofillView);
 | 
			
		||||
            var autofillView = new AutofillViewFromAssistStructureFinder(_context, _structure).GetAutofillView();
 | 
			
		||||
            return Parse(true, autofillView);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,14 +17,12 @@ namespace keepass2android.services
 | 
			
		||||
    {
 | 
			
		||||
        private static int _pendingIntentRequestCode = 0;
 | 
			
		||||
 | 
			
		||||
        public PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage,
 | 
			
		||||
            bool isManualRequest, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning)
 | 
			
		||||
        public PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning)
 | 
			
		||||
        {
 | 
			
		||||
            Intent intent = new Intent(context, typeof(ChooseForAutofillActivity));
 | 
			
		||||
            intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryString, query);
 | 
			
		||||
            intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryDomainString, queryDomain);
 | 
			
		||||
            intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryPackageString, queryPackage);
 | 
			
		||||
            intent.PutExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, isManualRequest);
 | 
			
		||||
            intent.PutExtra(ChooseForAutofillActivityBase.ExtraAutoReturnFromQuery, autoReturnFromQuery);
 | 
			
		||||
            intent.PutExtra(ChooseForAutofillActivityBase.ExtraDisplayWarning, (int)warning);
 | 
			
		||||
            return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Mutable));
 | 
			
		||||
@@ -40,12 +38,10 @@ namespace keepass2android.services
 | 
			
		||||
            return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Mutable));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public PendingIntent GetDisablePendingIntentForResponse(Context context, string query,
 | 
			
		||||
            bool isManualRequest, bool isDisable)
 | 
			
		||||
        public PendingIntent GetDisablePendingIntentForResponse(Context context, string query, bool isDisable)
 | 
			
		||||
        {
 | 
			
		||||
            Intent intent = new Intent(context, typeof(DisableAutofillForQueryActivity));
 | 
			
		||||
            intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryString, query);
 | 
			
		||||
            intent.PutExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, isManualRequest);
 | 
			
		||||
            intent.PutExtra(DisableAutofillForQueryActivity.ExtraIsDisable, isDisable);
 | 
			
		||||
 | 
			
		||||
            return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Immutable));
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ using KeePassLib.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace keepass2android
 | 
			
		||||
{
 | 
			
		||||
    [Activity]
 | 
			
		||||
    [Activity(Theme = "@style/Kp2aTheme_ActionBar")]
 | 
			
		||||
    public class ExportKeyfileActivity : LockCloseActivity
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user