Compare commits
	
		
			119 Commits
		
	
	
		
			l10n_maste
			...
			bugfix/lis
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					677c6555e8 | ||
| 
						 | 
					c62f6ef139 | ||
| 
						 | 
					0c34625782 | ||
| 
						 | 
					e86fa6f9fa | ||
| 
						 | 
					e2e975f357 | ||
| 
						 | 
					8eaf6d3f88 | ||
| 
						 | 
					a9fed1c203 | ||
| 
						 | 
					6d8407676d | ||
| 
						 | 
					1157716c9c | ||
| 
						 | 
					861615b7a4 | ||
| 
						 | 
					e12d11264e | ||
| 
						 | 
					6588f40007 | ||
| 
						 | 
					67aaba0656 | ||
| 
						 | 
					2d8eac4f12 | ||
| 
						 | 
					00d822ad4b | ||
| 
						 | 
					5cf15b26b9 | ||
| 
						 | 
					07f08a8851 | ||
| 
						 | 
					d2e0ae6394 | ||
| 
						 | 
					cbae7c38cf | ||
| 
						 | 
					15656109bc | ||
| 
						 | 
					93e415120a | ||
| 
						 | 
					c47e7c03f9 | ||
| 
						 | 
					125512d2c3 | ||
| 
						 | 
					65b0d31762 | ||
| 
						 | 
					9103529b64 | ||
| 
						 | 
					349952cb52 | ||
| 
						 | 
					305cf6b050 | ||
| 
						 | 
					78ff49a6d4 | ||
| 
						 | 
					9cd8996aeb | ||
| 
						 | 
					25232a4146 | ||
| 
						 | 
					5266d2f985 | ||
| 
						 | 
					ae35d5873a | ||
| 
						 | 
					fe9aaa0d29 | ||
| 
						 | 
					076bde7669 | ||
| 
						 | 
					592bee1ac1 | ||
| 
						 | 
					c9a7d56da4 | ||
| 
						 | 
					2157cc8e4a | ||
| 
						 | 
					2cd11ba50e | ||
| 
						 | 
					eddcedd00b | ||
| 
						 | 
					0d4fe11cfb | ||
| 
						 | 
					ecbf4e511d | ||
| 
						 | 
					16bbae832e | ||
| 
						 | 
					571da788d0 | ||
| 
						 | 
					f2eed5ece0 | ||
| 
						 | 
					2c5516310f | ||
| 
						 | 
					5550dffab8 | ||
| 
						 | 
					b9744dd6b5 | ||
| 
						 | 
					82fedb3526 | ||
| 
						 | 
					cc4f0a3dec | ||
| 
						 | 
					cdfa48d942 | ||
| 
						 | 
					c4edc871b3 | ||
| 
						 | 
					ed6d1d2aaf | ||
| 
						 | 
					b0f56dbb2c | ||
| 
						 | 
					c794efe899 | ||
| 
						 | 
					c2fb4f103d | ||
| 
						 | 
					18b192bc42 | ||
| 
						 | 
					522fc9816d | ||
| 
						 | 
					3be4fb8460 | ||
| 
						 | 
					7ca07814bb | ||
| 
						 | 
					aaea8ed956 | ||
| 
						 | 
					822ccdc349 | ||
| 
						 | 
					dbc1b9553a | ||
| 
						 | 
					04c5f08f5f | ||
| 
						 | 
					5c10385246 | ||
| 
						 | 
					90f9b6f414 | ||
| 
						 | 
					b555194d8e | ||
| 
						 | 
					0e7c4eced7 | ||
| 
						 | 
					816a40d0ec | ||
| 
						 | 
					75a819b7b4 | ||
| 
						 | 
					cf0e5be55c | ||
| 
						 | 
					492fb404fe | ||
| 
						 | 
					6453d215eb | ||
| 
						 | 
					35f13eff53 | ||
| 
						 | 
					fe2c5185eb | ||
| 
						 | 
					f1429c0d0d | ||
| 
						 | 
					d6e30b805d | ||
| 
						 | 
					e8aeaf71d4 | ||
| 
						 | 
					1500d635e9 | ||
| 
						 | 
					27798ea073 | ||
| 
						 | 
					891918269e | ||
| 
						 | 
					0cf8ec67da | ||
| 
						 | 
					217a3d107d | ||
| 
						 | 
					38a229cb78 | ||
| 
						 | 
					0598d49ba0 | ||
| 
						 | 
					f8f2dbc7f4 | ||
| 
						 | 
					7449d5dbb1 | ||
| 
						 | 
					a890b0f66e | ||
| 
						 | 
					1647ed455e | ||
| 
						 | 
					a383847d5b | ||
| 
						 | 
					3fb2a824cf | ||
| 
						 | 
					dd7579ce7c | ||
| 
						 | 
					49c51ceea4 | ||
| 
						 | 
					a5370793cb | ||
| 
						 | 
					6f72020607 | ||
| 
						 | 
					6a7c61ea3c | ||
| 
						 | 
					46c1854481 | ||
| 
						 | 
					72030a4749 | ||
| 
						 | 
					1c18884527 | ||
| 
						 | 
					1c5c695f4f | ||
| 
						 | 
					a1cef1ccda | ||
| 
						 | 
					4dfcbbf62a | ||
| 
						 | 
					d0e1a15673 | ||
| 
						 | 
					8fc9324be5 | ||
| 
						 | 
					4f4724804e | ||
| 
						 | 
					533d92509f | ||
| 
						 | 
					96960ef376 | ||
| 
						 | 
					46194317a8 | ||
| 
						 | 
					c4d6e18759 | ||
| 
						 | 
					ee41a600b1 | ||
| 
						 | 
					07562cc5a9 | ||
| 
						 | 
					0f5b411dc7 | ||
| 
						 | 
					7577e3064c | ||
| 
						 | 
					d33e1f266c | ||
| 
						 | 
					aeda21f163 | ||
| 
						 | 
					4d1142df4d | ||
| 
						 | 
					4c632d0c72 | ||
| 
						 | 
					deb3701ebf | ||
| 
						 | 
					980df2b3a7 | ||
| 
						 | 
					f001d1fa54 | 
							
								
								
									
										1
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
									
									
									
									
								
							@@ -20,6 +20,7 @@
 | 
				
			|||||||
#  - nuget: restore NuGet packages
 | 
					#  - nuget: restore NuGet packages
 | 
				
			||||||
#  - msbuild: build the project
 | 
					#  - msbuild: build the project
 | 
				
			||||||
#  - apk: same as all
 | 
					#  - apk: same as all
 | 
				
			||||||
 | 
					#  - manifestlink: creates a symlink (to be used in building) to the AndroidManifest corresponding to the selected Flavor
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#  - distclean: run a 'git clean -xdff'. Remove everyhing that is not in the git tree.
 | 
					#  - distclean: run a 'git clean -xdff'. Remove everyhing that is not in the git tree.
 | 
				
			||||||
#  - clean: all clean_* targets below
 | 
					#  - clean: all clean_* targets below
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
files:
 | 
					files:
 | 
				
			||||||
  - source: src/keepass2android/Resources/values/strings.xml
 | 
					  - source: src/keepass2android-app/Resources/values/strings.xml
 | 
				
			||||||
    translation: >-
 | 
					    translation: >-
 | 
				
			||||||
      /src/keepass2android/Resources/values-%two_letters_code%/%original_file_name%
 | 
					      /src/keepass2android-app/Resources/values-%two_letters_code%/%original_file_name%
 | 
				
			||||||
    translate_attributes: '0'
 | 
					    translate_attributes: '0'
 | 
				
			||||||
    content_segmentation: '0'
 | 
					    content_segmentation: '0'
 | 
				
			||||||
    languages_mapping:
 | 
					    languages_mapping:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										48
									
								
								src/DropboxBinding/Additions/AboutAdditions.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/DropboxBinding/Additions/AboutAdditions.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					Additions allow you to add arbitrary C# to the generated classes
 | 
				
			||||||
 | 
					before they are compiled.  This can be helpful for providing convenience
 | 
				
			||||||
 | 
					methods or adding pure C# classes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					== Adding Methods to Generated Classes ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Let's say the library being bound has a Rectangle class with a constructor
 | 
				
			||||||
 | 
					that takes an x and y position, and a width and length size.  It will look like
 | 
				
			||||||
 | 
					this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public partial class Rectangle
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public Rectangle (int x, int y, int width, int height)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // JNI bindings
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Imagine we want to add a constructor to this class that takes a Point and
 | 
				
			||||||
 | 
					Size structure instead of 4 ints.  We can add a new file called Rectangle.cs
 | 
				
			||||||
 | 
					with a partial class containing our new method:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public partial class Rectangle
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public Rectangle (Point location, Size size) :
 | 
				
			||||||
 | 
					        this (location.X, location.Y, size.Width, size.Height)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					At compile time, the additions class will be added to the generated class
 | 
				
			||||||
 | 
					and the final assembly will a Rectangle class with both constructors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					== Adding C# Classes ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Another thing that can be done is adding fully C# managed classes to the
 | 
				
			||||||
 | 
					generated library.  In the above example, let's assume that there isn't a
 | 
				
			||||||
 | 
					Point class available in Java or our library.  The one we create doesn't need
 | 
				
			||||||
 | 
					to interact with Java, so we'll create it like a normal class in C#.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					By adding a Point.cs file with this class, it will end up in the binding library:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Point
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public int X { get; set; }
 | 
				
			||||||
 | 
					    public int Y { get; set; }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/DropboxBinding/DropboxBinding.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/DropboxBinding/DropboxBinding.csproj
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					<Project Sdk="Microsoft.NET.Sdk">
 | 
				
			||||||
 | 
					  <PropertyGroup>
 | 
				
			||||||
 | 
					    <TargetFramework>net8.0-android</TargetFramework>
 | 
				
			||||||
 | 
					    <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
 | 
				
			||||||
 | 
					    <Nullable>enable</Nullable>
 | 
				
			||||||
 | 
					    <ImplicitUsings>enable</ImplicitUsings>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
							
								
								
									
										14
									
								
								src/DropboxBinding/Transforms/EnumFields.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/DropboxBinding/Transforms/EnumFields.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					<enum-field-mappings>
 | 
				
			||||||
 | 
					  <!--
 | 
				
			||||||
 | 
					  This example converts the constants Fragment_id, Fragment_name,
 | 
				
			||||||
 | 
					  and Fragment_tag from android.support.v4.app.FragmentActivity.FragmentTag
 | 
				
			||||||
 | 
					  to an enum called Android.Support.V4.App.FragmentTagType with values
 | 
				
			||||||
 | 
					  Id, Name, and Tag.
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <mapping jni-class="android/support/v4/app/FragmentActivity$FragmentTag" clr-enum-type="Android.Support.V4.App.FragmentTagType">
 | 
				
			||||||
 | 
					    <field jni-name="Fragment_name" clr-name="Name" value="0" />
 | 
				
			||||||
 | 
					    <field jni-name="Fragment_id" clr-name="Id" value="1" />
 | 
				
			||||||
 | 
					    <field jni-name="Fragment_tag" clr-name="Tag" value="2" />
 | 
				
			||||||
 | 
					  </mapping>
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					</enum-field-mappings>
 | 
				
			||||||
							
								
								
									
										13
									
								
								src/DropboxBinding/Transforms/EnumMethods.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/DropboxBinding/Transforms/EnumMethods.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					<enum-method-mappings>
 | 
				
			||||||
 | 
					  <!--
 | 
				
			||||||
 | 
					  This example changes the Java method:
 | 
				
			||||||
 | 
					    android.support.v4.app.Fragment.SavedState.writeToParcel (int flags)
 | 
				
			||||||
 | 
					  to be:
 | 
				
			||||||
 | 
					    android.support.v4.app.Fragment.SavedState.writeToParcel (Android.OS.ParcelableWriteFlags flags)
 | 
				
			||||||
 | 
					  when bound in C#.
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <mapping jni-class="android/support/v4/app/Fragment.SavedState">
 | 
				
			||||||
 | 
					    <method jni-name="writeToParcel" parameter="flags" clr-enum-type="Android.OS.ParcelableWriteFlags" />
 | 
				
			||||||
 | 
					  </mapping>
 | 
				
			||||||
 | 
					  -->
 | 
				
			||||||
 | 
					</enum-method-mappings>
 | 
				
			||||||
							
								
								
									
										35
									
								
								src/DropboxBinding/Transforms/Metadata.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/DropboxBinding/Transforms/Metadata.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					<metadata>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.http']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.json']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.oauth']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.sdk.android']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.stone']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.util']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v1']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.account']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.callbacks']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.check']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.seenstate']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.teamcommon']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.secondaryemails']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.async']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.auth']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.common']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.contacts']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.fileproperties']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.filerequests']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.files']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.paper']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.openid']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.sharing']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.team']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.teamlog']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.teampolicies']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.users']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.v2.userscommon']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.android']" />
 | 
				
			||||||
 | 
					  <remove-node path="/api/package[@name='com.dropbox.core.android']" />
 | 
				
			||||||
 | 
					</metadata>
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								src/DropboxBinding/dropbox-android-sdk-7.0.0.aar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/DropboxBinding/dropbox-android-sdk-7.0.0.aar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -29,6 +29,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PCloudBindings", "PCloudBin
 | 
				
			|||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kp2aAutofillParser.Tests", "Kp2aAutofillParser.Tests\Kp2aAutofillParser.Tests.csproj", "{F5A2A8F9-C084-498F-9603-9D927BA5C626}"
 | 
					Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kp2aAutofillParser.Tests", "Kp2aAutofillParser.Tests\Kp2aAutofillParser.Tests.csproj", "{F5A2A8F9-C084-498F-9603-9D927BA5C626}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
 | 
					Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DropboxBinding", "DropboxBinding\DropboxBinding.csproj", "{2FE6E335-E834-4F86-AB83-2C5D225DA929}"
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
Global
 | 
					Global
 | 
				
			||||||
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
						GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
				
			||||||
		Debug|Any CPU = Debug|Any CPU
 | 
							Debug|Any CPU = Debug|Any CPU
 | 
				
			||||||
@@ -369,6 +371,30 @@ Global
 | 
				
			|||||||
		{F5A2A8F9-C084-498F-9603-9D927BA5C626}.ReleaseNoNet|Win32.Build.0 = Release|Any CPU
 | 
							{F5A2A8F9-C084-498F-9603-9D927BA5C626}.ReleaseNoNet|Win32.Build.0 = Release|Any CPU
 | 
				
			||||||
		{F5A2A8F9-C084-498F-9603-9D927BA5C626}.ReleaseNoNet|x64.ActiveCfg = Release|Any CPU
 | 
							{F5A2A8F9-C084-498F-9603-9D927BA5C626}.ReleaseNoNet|x64.ActiveCfg = Release|Any CPU
 | 
				
			||||||
		{F5A2A8F9-C084-498F-9603-9D927BA5C626}.ReleaseNoNet|x64.Build.0 = Release|Any CPU
 | 
							{F5A2A8F9-C084-498F-9603-9D927BA5C626}.ReleaseNoNet|x64.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Debug|Any CPU.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Debug|Win32.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Debug|Win32.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Debug|x64.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Debug|x64.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Release|Any CPU.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Release|Any CPU.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Release|Win32.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Release|Win32.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Release|x64.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.Release|x64.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.ReleaseNoNet|Any CPU.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.ReleaseNoNet|Any CPU.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.ReleaseNoNet|Mixed Platforms.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.ReleaseNoNet|Mixed Platforms.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.ReleaseNoNet|Win32.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.ReleaseNoNet|Win32.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.ReleaseNoNet|x64.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{2FE6E335-E834-4F86-AB83-2C5D225DA929}.ReleaseNoNet|x64.Build.0 = Release|Any CPU
 | 
				
			||||||
	EndGlobalSection
 | 
						EndGlobalSection
 | 
				
			||||||
	GlobalSection(SolutionProperties) = preSolution
 | 
						GlobalSection(SolutionProperties) = preSolution
 | 
				
			||||||
		HideSolutionNode = FALSE
 | 
							HideSolutionNode = FALSE
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,8 +35,6 @@ namespace KeePassLib.Cryptography
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			get
 | 
								get
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				Debug.Assert(m_dicts.Count > 0); // Should be initialized
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				int iMaxLen = 0;
 | 
									int iMaxLen = 0;
 | 
				
			||||||
				foreach(int iLen in m_dicts.Keys)
 | 
									foreach(int iLen in m_dicts.Keys)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -445,6 +445,9 @@ namespace Kp2aAutofillParser
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        public static string ToCanonicalHint(string hint)
 | 
					        public static string ToCanonicalHint(string hint)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            //avoid crash when looking up a null key
 | 
				
			||||||
 | 
					            if (hint == null)
 | 
				
			||||||
 | 
					                return "";
 | 
				
			||||||
            string canonicalHint;
 | 
					            string canonicalHint;
 | 
				
			||||||
            if (!hintToCanonicalReplacement.TryGetValue(hint, out canonicalHint))
 | 
					            if (!hintToCanonicalReplacement.TryGetValue(hint, out canonicalHint))
 | 
				
			||||||
                canonicalHint = hint;
 | 
					                canonicalHint = hint;
 | 
				
			||||||
@@ -730,7 +733,7 @@ namespace Kp2aAutofillParser
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        public List<TField> InputFields { get; set; } = new List<TField>();
 | 
					        public List<TField> InputFields { get; set; } = new List<TField>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public string PackageId { get; set; } = null;
 | 
					        public string? PackageId { get; set; } = null;
 | 
				
			||||||
        public string WebDomain { get; set; } = null;
 | 
					        public string WebDomain { get; set; } = null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -841,6 +844,7 @@ namespace Kp2aAutofillParser
 | 
				
			|||||||
                        continue;
 | 
					                        continue;
 | 
				
			||||||
                    if (viewHints.Where(h => h != null).Select(AutofillHintsHelper.ToCanonicalHint).Intersect(_autofillHintsForLogin).Any())
 | 
					                    if (viewHints.Where(h => h != null).Select(AutofillHintsHelper.ToCanonicalHint).Intersect(_autofillHintsForLogin).Any())
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        AddFieldToHintMap(viewNode, viewHints.Where(h => h != null).Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet().ToArray());
 | 
					                        AddFieldToHintMap(viewNode, viewHints.Where(h => h != null).Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet().ToArray());
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1148,30 +1148,46 @@ namespace keepass2android.Io
 | 
				
			|||||||
                });
 | 
					                });
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            string? driveId = parentPath.DriveId;
 | 
					 | 
				
			||||||
            if ((string.IsNullOrEmpty(driveId)) && (drives?.Any() == true))
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                driveId = drives.First().Id;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            if (!CanListShares)
 | 
					            if (!CanListShares)
 | 
				
			||||||
                return result;
 | 
					                return result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var sharedWithMeResponse = await client.Drives[driveId].SharedWithMe.GetAsSharedWithMeGetResponseAsync();
 | 
					 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            foreach (DriveItem i in sharedWithMeResponse?.Value ?? [])
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var oneDrive2ItemLocation = parentPath.BuildShare(i.RemoteItem.Id, i.RemoteItem.Name, i.RemoteItem.WebUrl, i.RemoteItem.ParentReference.DriveId);
 | 
					                string? driveId = parentPath.DriveId;
 | 
				
			||||||
                FileDescription sharedFileEntry = new FileDescription()
 | 
					                if (string.IsNullOrEmpty(driveId))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    CanWrite = true, CanRead = true, DisplayName = i.Name,
 | 
					                    driveId = (await client.Me.Drive.GetAsync()).Id;
 | 
				
			||||||
                    IsDirectory = true,
 | 
					                }
 | 
				
			||||||
                    Path = oneDrive2ItemLocation.ToString()
 | 
					                if ((string.IsNullOrEmpty(driveId)) && (drives?.Any() == true))
 | 
				
			||||||
                };
 | 
					                {
 | 
				
			||||||
                result.Add(sharedFileEntry);
 | 
					                    driveId = drives.First().Id;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var sharedWithMeResponse = await client.Drives[driveId].SharedWithMe.GetAsSharedWithMeGetResponseAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                foreach (DriveItem i in sharedWithMeResponse?.Value ?? [])
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var oneDrive2ItemLocation = parentPath.BuildShare(i.RemoteItem.Id, i.RemoteItem.Name, i.RemoteItem.WebUrl, i.RemoteItem.ParentReference.DriveId);
 | 
				
			||||||
 | 
					                    FileDescription sharedFileEntry = new FileDescription()
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        CanWrite = true,
 | 
				
			||||||
 | 
					                        CanRead = true,
 | 
				
			||||||
 | 
					                        DisplayName = i.Name,
 | 
				
			||||||
 | 
					                        IsDirectory = (i.Folder != null) || ((i.RemoteItem != null) && (i.RemoteItem.Folder != null)),
 | 
				
			||||||
 | 
					                        Path = oneDrive2ItemLocation.ToString()
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					                    result.Add(sharedFileEntry);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception e)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logDebug("Failed to list shares: " + e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return result;
 | 
					            return result;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,6 @@
 | 
				
			|||||||
    <PackageReference Include="FluentFTP" Version="51.1.0" />
 | 
					    <PackageReference Include="FluentFTP" Version="51.1.0" />
 | 
				
			||||||
    <PackageReference Include="MegaApiClient" Version="1.10.4" />
 | 
					    <PackageReference Include="MegaApiClient" Version="1.10.4" />
 | 
				
			||||||
    <PackageReference Include="Microsoft.Graph" Version="5.68.0" />
 | 
					    <PackageReference Include="Microsoft.Graph" Version="5.68.0" />
 | 
				
			||||||
	<PackageReference Include="Microsoft.Graph.Auth" Version="1.0.0-preview.7" />
 | 
					 | 
				
			||||||
    <PackageReference Include="Microsoft.Identity.Client" Version="4.67.1" />
 | 
					    <PackageReference Include="Microsoft.Identity.Client" Version="4.67.1" />
 | 
				
			||||||
    <PackageReference Include="Xamarin.AndroidX.Browser" Version="1.8.0" />
 | 
					    <PackageReference Include="Xamarin.AndroidX.Browser" Version="1.8.0" />
 | 
				
			||||||
    <PackageReference Include="Xamarin.AndroidX.Core" Version="1.13.1.5" />
 | 
					    <PackageReference Include="Xamarin.AndroidX.Core" Version="1.13.1.5" />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -138,7 +138,8 @@ namespace keepass2android
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if (host.IndexOf(otherHost, StringComparison.InvariantCultureIgnoreCase) > -1)
 | 
									if (string.Equals(host, otherHost, StringComparison.OrdinalIgnoreCase) ||
 | 
				
			||||||
 | 
										host.EndsWith("." + otherHost, StringComparison.OrdinalIgnoreCase))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					pgResults.AddEntry(entry, false);
 | 
										pgResults.AddEntry(entry, false);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,7 +41,8 @@ dependencies {
 | 
				
			|||||||
        exclude group: 'com.google.android.google-play-services'
 | 
					        exclude group: 'com.google.android.google-play-services'
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    implementation 'com.google.apis:google-api-services-drive:v2-rev102-1.16.0-rc'
 | 
					    implementation 'com.google.apis:google-api-services-drive:v2-rev102-1.16.0-rc'
 | 
				
			||||||
    implementation 'com.dropbox.core:dropbox-core-sdk:5.4.6'
 | 
					    implementation 'com.dropbox.core:dropbox-core-sdk:7.0.0'
 | 
				
			||||||
 | 
					    implementation 'com.dropbox.core:dropbox-android-sdk:7.0.0'
 | 
				
			||||||
    implementation 'com.google.api-client:google-api-client:1.30.5'
 | 
					    implementation 'com.google.api-client:google-api-client:1.30.5'
 | 
				
			||||||
    implementation 'com.google.api-client:google-api-client-android:1.30.5'
 | 
					    implementation 'com.google.api-client:google-api-client-android:1.30.5'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@ import com.dropbox.core.DbxOAuth1Upgrader;
 | 
				
			|||||||
import com.dropbox.core.DbxRequestConfig;
 | 
					import com.dropbox.core.DbxRequestConfig;
 | 
				
			||||||
import com.dropbox.core.InvalidAccessTokenException;
 | 
					import com.dropbox.core.InvalidAccessTokenException;
 | 
				
			||||||
import com.dropbox.core.android.Auth;
 | 
					import com.dropbox.core.android.Auth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.dropbox.core.json.JsonReadException;
 | 
					import com.dropbox.core.json.JsonReadException;
 | 
				
			||||||
import com.dropbox.core.oauth.DbxCredential;
 | 
					import com.dropbox.core.oauth.DbxCredential;
 | 
				
			||||||
import com.dropbox.core.v2.DbxClientV2;
 | 
					import com.dropbox.core.v2.DbxClientV2;
 | 
				
			||||||
@@ -154,7 +155,7 @@ public class DropboxV2Storage extends JavaFileStorageBase
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        if ((previousFileVersion == null) || (previousFileVersion.equals("")))
 | 
					        if ((previousFileVersion == null) || (previousFileVersion.equals("")))
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
            path = removeProtocol(path);
 | 
					        path = removeProtocol(path);
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            Metadata entry = dbxClient.files().getMetadata(path);
 | 
					            Metadata entry = dbxClient.files().getMetadata(path);
 | 
				
			||||||
            return !String.valueOf(entry.hashCode()) .equals(previousFileVersion);
 | 
					            return !String.valueOf(entry.hashCode()) .equals(previousFileVersion);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -304,6 +304,11 @@ public class WebDavStorage extends JavaFileStorageBase {
 | 
				
			|||||||
                        //relative path:
 | 
					                        //relative path:
 | 
				
			||||||
                        e.path = buildPathFromHref(parentPath, r.href);
 | 
					                        e.path = buildPathFromHref(parentPath, r.href);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					                    if ( (parentPath.indexOf("@") != -1) && (e.path.indexOf("@") == -1))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        //username/password not contained in .href response. Add it back from parentPath:
 | 
				
			||||||
 | 
					                        e.path = parentPath.substring(0, parentPath.indexOf("@")+1) + e.path.substring(e.path.indexOf("://")+3);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if ((depth == 1) && e.isDirectory)
 | 
					                    if ((depth == 1) && e.isDirectory)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,4 +113,15 @@ extends Activity implements JavaFileStorage.FileStorageSetupActivity {
 | 
				
			|||||||
		return state;
 | 
							return state;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
 | 
				
			||||||
 | 
							super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 | 
				
			||||||
 | 
							MainActivity.storageToTest.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -147,6 +147,7 @@ import java.util.List;
 | 
				
			|||||||
//import keepass2android.javafilestorage.DropboxCloudRailStorage;
 | 
					//import keepass2android.javafilestorage.DropboxCloudRailStorage;
 | 
				
			||||||
import keepass2android.javafilestorage.DropboxV2Storage;
 | 
					import keepass2android.javafilestorage.DropboxV2Storage;
 | 
				
			||||||
import keepass2android.javafilestorage.GoogleDriveAppDataFileStorage;
 | 
					import keepass2android.javafilestorage.GoogleDriveAppDataFileStorage;
 | 
				
			||||||
 | 
					import keepass2android.javafilestorage.GoogleDriveFullFileStorage;
 | 
				
			||||||
import keepass2android.javafilestorage.ICertificateErrorHandler;
 | 
					import keepass2android.javafilestorage.ICertificateErrorHandler;
 | 
				
			||||||
import keepass2android.javafilestorage.JavaFileStorage;
 | 
					import keepass2android.javafilestorage.JavaFileStorage;
 | 
				
			||||||
import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
 | 
					import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
 | 
				
			||||||
@@ -547,7 +548,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//storageToTest = new GoogleDriveAppDataFileStorage();
 | 
							//storageToTest = new GoogleDriveAppDataFileStorage();
 | 
				
			||||||
		storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
 | 
							/*storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
 | 
				
			||||||
			@Override
 | 
								@Override
 | 
				
			||||||
			public boolean onValidationError(String error) {
 | 
								public boolean onValidationError(String error) {
 | 
				
			||||||
				return false;
 | 
									return false;
 | 
				
			||||||
@@ -558,10 +559,11 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
 | 
				
			|||||||
				return false;
 | 
									return false;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
		//storageToTest =  new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
 | 
							//storageToTest =  new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
 | 
				
			||||||
		//storageToTest =  new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
 | 
							//storageToTest =  new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
 | 
				
			||||||
		//storageToTest = new DropboxAppFolderFileStorage(ctx,"ax0268uydp1ya57", "3s86datjhkihwyc", true);
 | 
							//storageToTest = new DropboxAppFolderFileStorage(ctx,"ax0268uydp1ya57", "3s86datjhkihwyc", true);
 | 
				
			||||||
 | 
							storageToTest = new GoogleDriveFullFileStorage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return storageToTest;
 | 
							return storageToTest;
 | 
				
			||||||
@@ -581,6 +583,8 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
 | 
				
			|||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 | 
						protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 | 
				
			||||||
		// TODO Auto-generated method stub
 | 
							// TODO Auto-generated method stub
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -356,7 +356,13 @@ public class KP2AKeyboard extends InputMethodService
 | 
				
			|||||||
        pFilter.addAction("android.intent.action.PACKAGE_ADDED");
 | 
					        pFilter.addAction("android.intent.action.PACKAGE_ADDED");
 | 
				
			||||||
        pFilter.addAction("android.intent.action.PACKAGE_REPLACED");
 | 
					        pFilter.addAction("android.intent.action.PACKAGE_REPLACED");
 | 
				
			||||||
        pFilter.addAction("android.intent.action.PACKAGE_REMOVED");
 | 
					        pFilter.addAction("android.intent.action.PACKAGE_REMOVED");
 | 
				
			||||||
        registerReceiver(mPluginManager, pFilter);
 | 
					        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
				
			||||||
 | 
					            registerReceiver(mPluginManager, pFilter, RECEIVER_EXPORTED);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            registerReceiver(mPluginManager, pFilter);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        LatinIMEUtil.GCUtils.getInstance().reset();
 | 
					        LatinIMEUtil.GCUtils.getInstance().reset();
 | 
				
			||||||
@@ -375,16 +381,28 @@ public class KP2AKeyboard extends InputMethodService
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // register to receive ringer mode changes for silent mode
 | 
					        // register to receive ringer mode changes for silent mode
 | 
				
			||||||
        IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
 | 
					        IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
 | 
				
			||||||
        registerReceiver(mSilentModeReceiver, filter);
 | 
					        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
				
			||||||
 | 
					            registerReceiver(mSilentModeReceiver, filter, RECEIVER_EXPORTED);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            registerReceiver(mSilentModeReceiver, filter);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        prefs.registerOnSharedPreferenceChangeListener(this);
 | 
					        prefs.registerOnSharedPreferenceChangeListener(this);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        //check if we have KP2A data available:
 | 
					        //check if we have KP2A data available:
 | 
				
			||||||
        mHadKp2aData = mShowKp2aKeyboard = keepass2android.kbbridge.KeyboardData.hasData();
 | 
					        mHadKp2aData = mShowKp2aKeyboard = KeyboardData.hasData();
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        mClearKeyboardReceiver = new ClearKeyboardBroadcastReceiver();
 | 
					        mClearKeyboardReceiver = new ClearKeyboardBroadcastReceiver();
 | 
				
			||||||
        registerReceiver(mClearKeyboardReceiver, new IntentFilter(get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this)));
 | 
					        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
				
			||||||
        android.util.Log.d("KP2AK", "registered receiver for clear keyboard broadcast: "+get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this));
 | 
					            registerReceiver(mClearKeyboardReceiver, new IntentFilter(get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this)), RECEIVER_EXPORTED);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            registerReceiver(mClearKeyboardReceiver, new IntentFilter(get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this)));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        Log.d("KP2AK", "registered receiver for clear keyboard broadcast: "+get_KEEPASS2ANDROID_KEYBOARD_CLEARED(this));
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
-->
 | 
					-->
 | 
				
			||||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
 | 
					<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
 | 
				
			||||||
    <!-- Title for Latin keyboard  -->
 | 
					    <!-- Title for Latin keyboard  -->
 | 
				
			||||||
    <string name="english_ime_name">KeePass2Android-Tastatur</string>
 | 
					    <string name="english_ime_name">Keepass2Android-Tastatur</string>
 | 
				
			||||||
    <!-- Title for Latin keyboard settings activity / dialog -->
 | 
					    <!-- Title for Latin keyboard settings activity / dialog -->
 | 
				
			||||||
    <string name="english_ime_settings">Android-Tastatureinstellungen</string>
 | 
					    <string name="english_ime_settings">Android-Tastatureinstellungen</string>
 | 
				
			||||||
    <!-- Title for Latin keyboard input options dialog -->
 | 
					    <!-- Title for Latin keyboard input options dialog -->
 | 
				
			||||||
@@ -49,7 +49,7 @@
 | 
				
			|||||||
    <!-- Description for text prediction -->
 | 
					    <!-- Description for text prediction -->
 | 
				
			||||||
    <string name="prediction_summary">Automatische Vervollständigung während der Eingabe aktivieren</string>
 | 
					    <string name="prediction_summary">Automatische Vervollständigung während der Eingabe aktivieren</string>
 | 
				
			||||||
    <!-- Dialog title for auto complete choices -->
 | 
					    <!-- Dialog title for auto complete choices -->
 | 
				
			||||||
    <string name="auto_complete_dialog_title">Automatische. Vervollständigung </string>
 | 
					    <string name="auto_complete_dialog_title">Autovervollständigung</string>
 | 
				
			||||||
    <!-- Option to enable text prediction in landscape -->
 | 
					    <!-- Option to enable text prediction in landscape -->
 | 
				
			||||||
    <string name="prediction_landscape">Textfeld vergrößern</string>
 | 
					    <string name="prediction_landscape">Textfeld vergrößern</string>
 | 
				
			||||||
    <!-- Description for text prediction -->
 | 
					    <!-- Description for text prediction -->
 | 
				
			||||||
@@ -62,7 +62,7 @@
 | 
				
			|||||||
    <string name="auto_punctuate">Autom. Zeichensetzung</string>
 | 
					    <string name="auto_punctuate">Autom. Zeichensetzung</string>
 | 
				
			||||||
    <!-- Description for auto punctuate -->
 | 
					    <!-- Description for auto punctuate -->
 | 
				
			||||||
    <!-- Option to enable quick fixes -->
 | 
					    <!-- Option to enable quick fixes -->
 | 
				
			||||||
    <string name="quick_fixes">Schnelle Fixierung</string>
 | 
					    <string name="quick_fixes">Schnelle Korrektur</string>
 | 
				
			||||||
    <!-- Description for quick fixes -->
 | 
					    <!-- Description for quick fixes -->
 | 
				
			||||||
    <string name="quick_fixes_summary">Korrigiert gängige Tippfehler</string>
 | 
					    <string name="quick_fixes_summary">Korrigiert gängige Tippfehler</string>
 | 
				
			||||||
    <!-- Option to enable showing suggestions -->
 | 
					    <!-- Option to enable showing suggestions -->
 | 
				
			||||||
@@ -112,7 +112,7 @@
 | 
				
			|||||||
    <!-- Tip to long press on typed word to add to dictionary -->
 | 
					    <!-- Tip to long press on typed word to add to dictionary -->
 | 
				
			||||||
    <string name="tip_add_to_dictionary">Lange auf das Wort ganz links außen drücken, um es zum Wörterbuch hinzuzufügen</string>
 | 
					    <string name="tip_add_to_dictionary">Lange auf das Wort ganz links außen drücken, um es zum Wörterbuch hinzuzufügen</string>
 | 
				
			||||||
    <!-- Instruction to touch the bubble to continue -->
 | 
					    <!-- Instruction to touch the bubble to continue -->
 | 
				
			||||||
    <string name="touch_to_continue">Diesen Hinweis berühren, um fortzufahren.»</string>
 | 
					    <string name="touch_to_continue">Diesen Hinweis antippen, um fortzufahren.»</string>
 | 
				
			||||||
    <!-- Instruction to touch the bubble to start typing -->
 | 
					    <!-- Instruction to touch the bubble to start typing -->
 | 
				
			||||||
    <string name="touch_to_finish">Hier berühren, um diesen Hinweis zu schließen und mit dem Tippen zu beginnen!</string>
 | 
					    <string name="touch_to_finish">Hier berühren, um diesen Hinweis zu schließen und mit dem Tippen zu beginnen!</string>
 | 
				
			||||||
    <!-- Tutorial tip 1 - The keyboard opens any time you touch a text field -->
 | 
					    <!-- Tutorial tip 1 - The keyboard opens any time you touch a text field -->
 | 
				
			||||||
@@ -138,7 +138,7 @@
 | 
				
			|||||||
    <!-- Label for "switch to symbols" key.  Must be short to fit on key! -->
 | 
					    <!-- Label for "switch to symbols" key.  Must be short to fit on key! -->
 | 
				
			||||||
    <string name="label_symbol_key">\?123</string>
 | 
					    <string name="label_symbol_key">\?123</string>
 | 
				
			||||||
    <!-- Label for "switch to numeric" key.  Must be short to fit on key! -->
 | 
					    <!-- Label for "switch to numeric" key.  Must be short to fit on key! -->
 | 
				
			||||||
    <string name="label_phone_key">Nummer</string>
 | 
					    <string name="label_phone_key">123</string>
 | 
				
			||||||
    <!-- Label for "switch to alphabetic" key.  Must be short to fit on key! -->
 | 
					    <!-- Label for "switch to alphabetic" key.  Must be short to fit on key! -->
 | 
				
			||||||
    <string name="label_alpha_key">ABC</string>
 | 
					    <string name="label_alpha_key">ABC</string>
 | 
				
			||||||
    <!-- Label for ALT modifier key.  Must be short to fit on key! -->
 | 
					    <!-- Label for ALT modifier key.  Must be short to fit on key! -->
 | 
				
			||||||
@@ -161,7 +161,7 @@
 | 
				
			|||||||
        "Swipe across keyboard to speak"). Also shown when enabling settings. -->
 | 
					        "Swipe across keyboard to speak"). Also shown when enabling settings. -->
 | 
				
			||||||
    <string name="voice_hint_dialog_message">Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur.</string>
 | 
					    <string name="voice_hint_dialog_message">Um die Spracheingabe zu verwenden, drücken Sie die Mikrofontaste oder ziehen Sie Ihren Finger über die Bildschirmtastatur.</string>
 | 
				
			||||||
    <!-- Short message to tell the user the system is ready for them to speak. -->
 | 
					    <!-- Short message to tell the user the system is ready for them to speak. -->
 | 
				
			||||||
    <string name="voice_listening">Sprechen Sie jetzt</string>
 | 
					    <string name="voice_listening">Jetzt sprechen</string>
 | 
				
			||||||
    <!-- Short message shown after the user finishes speaking. -->
 | 
					    <!-- Short message shown after the user finishes speaking. -->
 | 
				
			||||||
    <string name="voice_working">Vorgang läuft</string>
 | 
					    <string name="voice_working">Vorgang läuft</string>
 | 
				
			||||||
    <!-- Short message shown before the user should speak. -->
 | 
					    <!-- Short message shown before the user should speak. -->
 | 
				
			||||||
@@ -186,7 +186,7 @@
 | 
				
			|||||||
    <!-- Short hint shown in candidate view to explain voice input. -->
 | 
					    <!-- Short hint shown in candidate view to explain voice input. -->
 | 
				
			||||||
    <string name="voice_swipe_hint"><b>„Hinweis:“</b>„ Ziehen Sie zum Sprechen den Finger über die Tastatur.“</string>
 | 
					    <string name="voice_swipe_hint"><b>„Hinweis:“</b>„ Ziehen Sie zum Sprechen den Finger über die Tastatur.“</string>
 | 
				
			||||||
    <!-- Short hint shown in candidate view to explain that user can speak punctuation. -->
 | 
					    <!-- Short hint shown in candidate view to explain that user can speak punctuation. -->
 | 
				
			||||||
    <string name="voice_punctuation_hint"><b>„Hinweis: “</b>„ Versuchen Sie beim nächsten Mal, Satzzeichen wie „Punkt“, „Komma“ oder „Fragezeichen“ per Sprachbefehl einzugeben.“</string>
 | 
					    <string name="voice_punctuation_hint"><b>Hinweis: </b>Versuche beim nächsten Mal, Satzzeichen wie „Punkt“, „Komma“ oder „Fragezeichen“ per Sprachbefehl einzugeben.</string>
 | 
				
			||||||
    <!-- Label on button to stop recognition. Must be short to fit on button. -->
 | 
					    <!-- Label on button to stop recognition. Must be short to fit on button. -->
 | 
				
			||||||
    <string name="cancel">Abbrechen</string>
 | 
					    <string name="cancel">Abbrechen</string>
 | 
				
			||||||
    <!-- Label on button when an error occurs -->
 | 
					    <!-- Label on button when an error occurs -->
 | 
				
			||||||
@@ -216,7 +216,7 @@
 | 
				
			|||||||
    <!-- appears above image showing the user to click on a TextView to show the IME -->
 | 
					    <!-- appears above image showing the user to click on a TextView to show the IME -->
 | 
				
			||||||
    <string name="open_the_keyboard"><font size="17"><b>„Tastatur öffnen“\n</b></font><font size="3">\n</font>„Berühren Sie ein beliebiges Textfeld.“</string>
 | 
					    <string name="open_the_keyboard"><font size="17"><b>„Tastatur öffnen“\n</b></font><font size="3">\n</font>„Berühren Sie ein beliebiges Textfeld.“</string>
 | 
				
			||||||
    <!-- appears above the image showing the back button used to close the keyboard -->
 | 
					    <!-- appears above the image showing the back button used to close the keyboard -->
 | 
				
			||||||
    <string name="close_the_keyboard"><font size="17"><b>„Tastatur schließen“\n</b></font><font size="3">\n</font>„Drücken Sie die Zurück-Taste.“</string>
 | 
					    <string name="close_the_keyboard"><font size="17"><b>Tastatur schließen\n</b></font><font size="3">\n</font>Drücken die Zurück-Taste.</string>
 | 
				
			||||||
    <!-- appears above image showing how to use touch and hold -->
 | 
					    <!-- appears above image showing how to use touch and hold -->
 | 
				
			||||||
    <string name="touch_and_hold"><font size="17"><b>„Für Optionen eine Taste berühren und gedrückt halten“\n</b></font><font size="3">\n</font>„Greifen Sie auf Satzzeichen und Akzente zu.“</string>
 | 
					    <string name="touch_and_hold"><font size="17"><b>„Für Optionen eine Taste berühren und gedrückt halten“\n</b></font><font size="3">\n</font>„Greifen Sie auf Satzzeichen und Akzente zu.“</string>
 | 
				
			||||||
    <!-- appears above image showing how to access keyboard settings -->
 | 
					    <!-- appears above image showing how to access keyboard settings -->
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,7 +56,7 @@
 | 
				
			|||||||
    <string name="afc_title_sort_by">Sortieren nach…</string>
 | 
					    <string name="afc_title_sort_by">Sortieren nach…</string>
 | 
				
			||||||
    <string name="afc_yesterday">Gestern</string>
 | 
					    <string name="afc_yesterday">Gestern</string>
 | 
				
			||||||
    <plurals name="afc_title_choose_directories">
 | 
					    <plurals name="afc_title_choose_directories">
 | 
				
			||||||
        <item quantity="one">Ordner wählen …</item>
 | 
					        <item quantity="one">Ordner wählen…</item>
 | 
				
			||||||
        <item quantity="other">Verzeichnisse wählen</item>
 | 
					        <item quantity="other">Verzeichnisse wählen</item>
 | 
				
			||||||
    </plurals>
 | 
					    </plurals>
 | 
				
			||||||
    <plurals name="afc_title_choose_files">
 | 
					    <plurals name="afc_title_choose_files">
 | 
				
			||||||
@@ -64,7 +64,7 @@
 | 
				
			|||||||
        <item quantity="other">Dateien wählen …</item>
 | 
					        <item quantity="other">Dateien wählen …</item>
 | 
				
			||||||
    </plurals>
 | 
					    </plurals>
 | 
				
			||||||
    <plurals name="afc_title_choose_files_directories">
 | 
					    <plurals name="afc_title_choose_files_directories">
 | 
				
			||||||
        <item quantity="one">Datei/Ordner wählen …</item>
 | 
					        <item quantity="one">Datei/Ordner wählen…</item>
 | 
				
			||||||
        <item quantity="other">Dateien/Ordner wählen …</item>
 | 
					        <item quantity="other">Dateien/Ordner wählen …</item>
 | 
				
			||||||
    </plurals>
 | 
					    </plurals>
 | 
				
			||||||
</resources>
 | 
					</resources>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,9 +14,11 @@ using Android.Runtime;
 | 
				
			|||||||
using Android.Text;
 | 
					using Android.Text;
 | 
				
			||||||
using Android.Text.Method;
 | 
					using Android.Text.Method;
 | 
				
			||||||
using Android.Text.Util;
 | 
					using Android.Text.Util;
 | 
				
			||||||
 | 
					using Android.Util;
 | 
				
			||||||
using Android.Views;
 | 
					using Android.Views;
 | 
				
			||||||
using Android.Webkit;
 | 
					using Android.Webkit;
 | 
				
			||||||
using Android.Widget;
 | 
					using Android.Widget;
 | 
				
			||||||
 | 
					using AndroidX.Core.Content;
 | 
				
			||||||
using Google.Android.Material.Dialog;
 | 
					using Google.Android.Material.Dialog;
 | 
				
			||||||
using keepass2android;
 | 
					using keepass2android;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,7 +31,16 @@ namespace keepass2android
 | 
				
			|||||||
			MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(ctx);
 | 
								MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(ctx);
 | 
				
			||||||
			builder.SetTitle(ctx.GetString(Resource.String.ChangeLog_title));
 | 
								builder.SetTitle(ctx.GetString(Resource.String.ChangeLog_title));
 | 
				
			||||||
			List<string> changeLog = new List<string>{
 | 
								List<string> changeLog = new List<string>{
 | 
				
			||||||
                BuildChangelogString(ctx, new List<int>{Resource.Array.ChangeLog_1_11,Resource.Array.ChangeLog_1_11_net}, "1.11"),
 | 
					                BuildChangelogString(ctx, new List<int>{Resource.Array.ChangeLog_1_12
 | 
				
			||||||
 | 
					#if !NoNet
 | 
				
			||||||
 | 
										,Resource.Array.ChangeLog_1_12_net
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                }, "1.12"),
 | 
				
			||||||
 | 
					                BuildChangelogString(ctx, new List<int>{Resource.Array.ChangeLog_1_11
 | 
				
			||||||
 | 
					#if !NoNet
 | 
				
			||||||
 | 
					                    ,Resource.Array.ChangeLog_1_11_net
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                }, "1.11"),
 | 
				
			||||||
                BuildChangelogString(ctx, Resource.Array.ChangeLog_1_10, "1.10"),
 | 
					                BuildChangelogString(ctx, Resource.Array.ChangeLog_1_10, "1.10"),
 | 
				
			||||||
                BuildChangelogString(ctx, Resource.Array.ChangeLog_1_09e, "1.09e"),
 | 
					                BuildChangelogString(ctx, Resource.Array.ChangeLog_1_09e, "1.09e"),
 | 
				
			||||||
				BuildChangelogString(ctx, Resource.Array.ChangeLog_1_09d, "1.09d"),
 | 
									BuildChangelogString(ctx, Resource.Array.ChangeLog_1_09d, "1.09d"),
 | 
				
			||||||
@@ -99,32 +110,28 @@ namespace keepass2android
 | 
				
			|||||||
				warning = ctx.GetString(Resource.String.PreviewWarning);
 | 
									warning = ctx.GetString(Resource.String.PreviewWarning);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			builder.SetPositiveButton(Android.Resource.String.Ok, (dlgSender, dlgEvt) => {((AlertDialog)dlgSender).Dismiss(); });
 | 
								builder.SetPositiveButton(Android.Resource.String.Ok, (dlgSender, dlgEvt) => {((AndroidX.AppCompat.App.AlertDialog)dlgSender).Dismiss(); });
 | 
				
			||||||
			builder.SetCancelable(false);
 | 
								builder.SetCancelable(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			WebView wv = new WebView(ctx);
 | 
								WebView wv = new WebView(ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			wv.SetBackgroundColor(Color.White);
 | 
					 | 
				
			||||||
			wv.LoadDataWithBaseURL(null, GetLog(changeLog, warning, ctx), "text/html", "UTF-8", null);
 | 
					 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
			//builder.SetMessage("");
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			builder.SetView(wv);
 | 
								builder.SetView(wv);
 | 
				
			||||||
			Dialog dialog = builder.Create();
 | 
								Dialog dialog = builder.Create();
 | 
				
			||||||
			dialog.DismissEvent += (sender, e) =>
 | 
					            dialog.DismissEvent += (sender, e) =>
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				onDismiss();
 | 
									onDismiss();
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
			dialog.Show();
 | 
					            wv.SetBackgroundColor(Color.Transparent);
 | 
				
			||||||
			/*TextView message = (TextView)dialog.FindViewById(Android.Resource.Id.Message);
 | 
					            wv.LoadDataWithBaseURL(null, GetLog(changeLog, warning, dialog.Context), "text/html", "UTF-8", null);
 | 
				
			||||||
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			message.TextFormatted = Html.FromHtml(ConcatChangeLog(ctx, changeLog.ToArray()));
 | 
					 | 
				
			||||||
			message.AutoLinkMask=MatchOptions.WebUrls;*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            dialog.Show();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	    private static string BuildChangelogString(Context ctx, int changeLogResId, string version)
 | 
					        private static string BuildChangelogString(Context ctx, int changeLogResId, string version)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return BuildChangelogString(ctx, new List<int>() { changeLogResId }, version);
 | 
					            return BuildChangelogString(ctx, new List<int>() { changeLogResId }, version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -150,32 +157,44 @@ namespace keepass2android
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private const string HtmlStart = @"<html>
 | 
							private const string HtmlEnd = @"</body>
 | 
				
			||||||
 | 
					</html>";
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
							private static string GetLog(List<string> changeLog, string warning, Context ctx)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            string secondaryColor = "31628D";
 | 
				
			||||||
 | 
					            string onSurfaceColor = "171D1E";
 | 
				
			||||||
 | 
					            if (((int)ctx.Resources.Configuration.UiMode & (int)UiMode.NightMask) == (int)UiMode.NightYes)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                secondaryColor = "99CBFF";
 | 
				
			||||||
 | 
					                onSurfaceColor = "E1E4D6";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            string HtmlStart = @"<html>
 | 
				
			||||||
  <head>
 | 
					  <head>
 | 
				
			||||||
    <style type='text/css'>
 | 
					    <style type='text/css'>
 | 
				
			||||||
      a            { color:#000000 }
 | 
					      a            { color:#"+ onSurfaceColor + @" }
 | 
				
			||||||
      div.title    { 
 | 
					      div.title    { 
 | 
				
			||||||
          color:287AA9; 
 | 
					          color:"+ secondaryColor+@"; 
 | 
				
			||||||
          font-size:1.2em; 
 | 
					          font-size:1.2em; 
 | 
				
			||||||
          font-weight:bold; 
 | 
					          font-weight:bold; 
 | 
				
			||||||
          margin-top:1em; 
 | 
					          margin-top:1em; 
 | 
				
			||||||
          margin-bottom:0.5em; 
 | 
					          margin-bottom:0.5em; 
 | 
				
			||||||
          text-align:center }
 | 
					          text-align:center }
 | 
				
			||||||
      div.subtitle { 
 | 
					      div.subtitle { 
 | 
				
			||||||
          color:287AA9; 
 | 
					          color:"+ secondaryColor+@"; 
 | 
				
			||||||
          font-size:0.8em; 
 | 
					          font-size:0.8em; 
 | 
				
			||||||
          margin-bottom:1em; 
 | 
					          margin-bottom:1em; 
 | 
				
			||||||
          text-align:center }
 | 
					          text-align:center }
 | 
				
			||||||
      div.freetext { color:#000000 }
 | 
					      div.freetext { color:#"+ onSurfaceColor + @" }
 | 
				
			||||||
      div.list     { color:#000000 }
 | 
					      div.list     { color:#"+ onSurfaceColor + @" }
 | 
				
			||||||
    </style>
 | 
					    </style>
 | 
				
			||||||
  </head>
 | 
					  </head>
 | 
				
			||||||
  <body>";
 | 
					  <body>";
 | 
				
			||||||
		private const string HtmlEnd = @"</body>
 | 
					
 | 
				
			||||||
</html>";
 | 
					
 | 
				
			||||||
		private static string GetLog(List<string> changeLog, string warning, Context ctx)
 | 
					            StringBuilder sb = new StringBuilder(HtmlStart);
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			StringBuilder sb = new StringBuilder(HtmlStart);
 | 
					 | 
				
			||||||
			if (!string.IsNullOrEmpty(warning))
 | 
								if (!string.IsNullOrEmpty(warning))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				sb.Append(warning);
 | 
									sb.Append(warning);
 | 
				
			||||||
@@ -53,6 +53,7 @@ using keepass2android.fileselect;
 | 
				
			|||||||
using KeeTrayTOTP.Libraries;
 | 
					using KeeTrayTOTP.Libraries;
 | 
				
			||||||
using Boolean = Java.Lang.Boolean;
 | 
					using Boolean = Java.Lang.Boolean;
 | 
				
			||||||
using Android.Util;
 | 
					using Android.Util;
 | 
				
			||||||
 | 
					using AndroidX.Core.Content;
 | 
				
			||||||
using Google.Android.Material.Dialog;
 | 
					using Google.Android.Material.Dialog;
 | 
				
			||||||
using keepass2android;
 | 
					using keepass2android;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -491,9 +492,9 @@ namespace keepass2android
 | 
				
			|||||||
			App.Kp2a.LastOpenedEntry = new PwEntryOutput(Entry, App.Kp2a.CurrentDb);
 | 
								App.Kp2a.LastOpenedEntry = new PwEntryOutput(Entry, App.Kp2a.CurrentDb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			_pluginActionReceiver = new PluginActionReceiver(this);
 | 
								_pluginActionReceiver = new PluginActionReceiver(this);
 | 
				
			||||||
			RegisterReceiver(_pluginActionReceiver, new IntentFilter(Strings.ActionAddEntryAction), ReceiverFlags.Exported);
 | 
								ContextCompat.RegisterReceiver(this, _pluginActionReceiver, new IntentFilter(Strings.ActionAddEntryAction), (int)ReceiverFlags.Exported);
 | 
				
			||||||
			_pluginFieldReceiver = new PluginFieldReceiver(this);
 | 
								_pluginFieldReceiver = new PluginFieldReceiver(this);
 | 
				
			||||||
			RegisterReceiver(_pluginFieldReceiver, new IntentFilter(Strings.ActionSetEntryField), ReceiverFlags.Exported);
 | 
					            ContextCompat.RegisterReceiver(this, _pluginFieldReceiver, new IntentFilter(Strings.ActionSetEntryField), (int)ReceiverFlags.Exported);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var notifyPluginsOnOpenThread = new Thread(NotifyPluginsOnOpen);
 | 
					            var notifyPluginsOnOpenThread = new Thread(NotifyPluginsOnOpen);
 | 
				
			||||||
            notifyPluginsOnOpenThread.Start();
 | 
					            notifyPluginsOnOpenThread.Start();
 | 
				
			||||||
@@ -37,6 +37,7 @@ using System.Net;
 | 
				
			|||||||
using System.Text;
 | 
					using System.Text;
 | 
				
			||||||
using Android.Content.Res;
 | 
					using Android.Content.Res;
 | 
				
			||||||
using Android.Database;
 | 
					using Android.Database;
 | 
				
			||||||
 | 
					using Android.Gms.Common;
 | 
				
			||||||
using Android.Gms.Tasks;
 | 
					using Android.Gms.Tasks;
 | 
				
			||||||
using Android.Graphics;
 | 
					using Android.Graphics;
 | 
				
			||||||
using Android.Graphics.Drawables;
 | 
					using Android.Graphics.Drawables;
 | 
				
			||||||
@@ -1155,6 +1156,12 @@ namespace keepass2android
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            dlgView.FindViewById<Button>(Resource.Id.totp_scan).Click += async (object o, EventArgs args) =>
 | 
					            dlgView.FindViewById<Button>(Resource.Id.totp_scan).Click += async (object o, EventArgs args) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
					                if (GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this) != ConnectionResult.Success)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    Toast.MakeText(this, Resource.String.qr_scanning_error_no_google_play_services, ToastLength.Long);
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				GmsBarcodeScannerOptions options = new GmsBarcodeScannerOptions.Builder()
 | 
									GmsBarcodeScannerOptions options = new GmsBarcodeScannerOptions.Builder()
 | 
				
			||||||
                    .SetBarcodeFormats(Barcode.FormatQrCode)
 | 
					                    .SetBarcodeFormats(Barcode.FormatQrCode)
 | 
				
			||||||
                    .Build();
 | 
					                    .Build();
 | 
				
			||||||
@@ -21,6 +21,7 @@ using Android.OS;
 | 
				
			|||||||
using Android.Preferences;
 | 
					using Android.Preferences;
 | 
				
			||||||
using Android.Runtime;
 | 
					using Android.Runtime;
 | 
				
			||||||
using Android.Views;
 | 
					using Android.Views;
 | 
				
			||||||
 | 
					using AndroidX.Core.Content;
 | 
				
			||||||
using KeePassLib.Serialization;
 | 
					using KeePassLib.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace keepass2android
 | 
					namespace keepass2android
 | 
				
			||||||
@@ -69,7 +70,7 @@ namespace keepass2android
 | 
				
			|||||||
			IntentFilter filter = new IntentFilter();
 | 
								IntentFilter filter = new IntentFilter();
 | 
				
			||||||
			filter.AddAction(Intents.DatabaseLocked);
 | 
								filter.AddAction(Intents.DatabaseLocked);
 | 
				
			||||||
			filter.AddAction(Intent.ActionScreenOff);
 | 
								filter.AddAction(Intent.ActionScreenOff);
 | 
				
			||||||
			RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported);
 | 
					            ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		protected override void OnDestroy()
 | 
							protected override void OnDestroy()
 | 
				
			||||||
@@ -21,6 +21,7 @@ using Android.OS;
 | 
				
			|||||||
using Android.Preferences;
 | 
					using Android.Preferences;
 | 
				
			||||||
using Android.Runtime;
 | 
					using Android.Runtime;
 | 
				
			||||||
using Android.Views;
 | 
					using Android.Views;
 | 
				
			||||||
 | 
					using AndroidX.Core.Content;
 | 
				
			||||||
using KeePassLib.Serialization;
 | 
					using KeePassLib.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace keepass2android
 | 
					namespace keepass2android
 | 
				
			||||||
@@ -55,7 +56,7 @@ namespace keepass2android
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			filter.AddAction(Intents.DatabaseLocked);
 | 
								filter.AddAction(Intents.DatabaseLocked);
 | 
				
			||||||
			filter.AddAction(Intent.ActionScreenOff);
 | 
								filter.AddAction(Intent.ActionScreenOff);
 | 
				
			||||||
			RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported);
 | 
					            ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
@@ -18,6 +18,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using Android.Content;
 | 
					using Android.Content;
 | 
				
			||||||
using Android.OS;
 | 
					using Android.OS;
 | 
				
			||||||
 | 
					using AndroidX.Core.Content;
 | 
				
			||||||
using KeePassLib.Serialization;
 | 
					using KeePassLib.Serialization;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace keepass2android
 | 
					namespace keepass2android
 | 
				
			||||||
@@ -39,7 +40,7 @@ namespace keepass2android
 | 
				
			|||||||
			_intentReceiver = new LockCloseActivityBroadcastReceiver(this);
 | 
								_intentReceiver = new LockCloseActivityBroadcastReceiver(this);
 | 
				
			||||||
			IntentFilter filter = new IntentFilter();
 | 
								IntentFilter filter = new IntentFilter();
 | 
				
			||||||
			filter.AddAction(Intents.DatabaseLocked);
 | 
								filter.AddAction(Intents.DatabaseLocked);
 | 
				
			||||||
			RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported);
 | 
					            ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		protected override void OnResume() {
 | 
							protected override void OnResume() {
 | 
				
			||||||
@@ -47,8 +47,8 @@
 | 
				
			|||||||
  <permission android:description="@string/permission_desc2" android:icon="@drawable/ic_notify_locked" android:label="KP2A entry search" android:name="keepass2android.keepass2android_debug.permission.KP2aInternalSearch" android:protectionLevel="signature" />
 | 
					  <permission android:description="@string/permission_desc2" android:icon="@drawable/ic_notify_locked" android:label="KP2A entry search" android:name="keepass2android.keepass2android_debug.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_debug.permission.Kp2aChooseAutofill" android:protectionLevel="signature" />
 | 
					  <permission android:description="@string/permission_desc3" android:icon="@drawable/ic_launcher" android:label="KP2A choose autofill dataset" android:name="keepass2android.keepass2android_debug.permission.Kp2aChooseAutofill" android:protectionLevel="signature" />
 | 
				
			||||||
  <application
 | 
					  <application
 | 
				
			||||||
	android:icon="@mipmap/ic_launcher_online"
 | 
						android:icon="@mipmap/ic_launcher_debug"
 | 
				
			||||||
	android:roundIcon="@mipmap/ic_launcher_online_round"
 | 
						android:roundIcon="@mipmap/ic_launcher_debug_round"
 | 
				
			||||||
	android:networkSecurityConfig="@xml/network_security_config"
 | 
						android:networkSecurityConfig="@xml/network_security_config"
 | 
				
			||||||
	>
 | 
						>
 | 
				
			||||||
    <meta-data
 | 
					    <meta-data
 | 
				
			||||||
@@ -243,6 +243,15 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
 | 
				
			|||||||
        <action android:name="keepass2android.ACTION_START_WITH_TASK" />
 | 
					        <action android:name="keepass2android.ACTION_START_WITH_TASK" />
 | 
				
			||||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
					        <category android:name="android.intent.category.DEFAULT" />
 | 
				
			||||||
      </intent-filter>
 | 
					      </intent-filter>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <intent-filter>
 | 
				
			||||||
 | 
					        <action android:name="android.intent.action.VIEW" />
 | 
				
			||||||
 | 
					        <category android:name="android.intent.category.DEFAULT" />
 | 
				
			||||||
 | 
					        <category android:name="android.intent.category.BROWSABLE" />
 | 
				
			||||||
 | 
					        <data android:scheme="otpauth"/>
 | 
				
			||||||
 | 
					        <data android:host="totp"/>
 | 
				
			||||||
 | 
					        <data android:host="hotp"/>
 | 
				
			||||||
 | 
					      </intent-filter>
 | 
				
			||||||
    </activity>
 | 
					    </activity>
 | 
				
			||||||
    <uses-library android:required="false" android:name="com.sec.android.app.multiwindow" />
 | 
					    <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.support.multiwindow" android:value="true" />
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
					<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
			android:versionCode="200"
 | 
								android:versionCode="204"
 | 
				
			||||||
			android:versionName="1.11-r0"
 | 
								android:versionName="1.12-r3"
 | 
				
			||||||
			package="keepass2android.keepass2android"
 | 
								package="keepass2android.keepass2android"
 | 
				
			||||||
			xmlns:tools="http://schemas.android.com/tools"
 | 
								xmlns:tools="http://schemas.android.com/tools"
 | 
				
			||||||
			android:installLocation="auto">
 | 
								android:installLocation="auto">
 | 
				
			||||||
@@ -255,7 +255,14 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
 | 
				
			|||||||
        <action android:name="keepass2android.ACTION_START_WITH_TASK" />
 | 
					        <action android:name="keepass2android.ACTION_START_WITH_TASK" />
 | 
				
			||||||
        <category android:name="android.intent.category.DEFAULT" />
 | 
					        <category android:name="android.intent.category.DEFAULT" />
 | 
				
			||||||
      </intent-filter>
 | 
					      </intent-filter>
 | 
				
			||||||
      x
 | 
					      <intent-filter>
 | 
				
			||||||
 | 
					        <action android:name="android.intent.action.VIEW" />
 | 
				
			||||||
 | 
					        <category android:name="android.intent.category.DEFAULT" />
 | 
				
			||||||
 | 
					        <category android:name="android.intent.category.BROWSABLE" />
 | 
				
			||||||
 | 
					        <data android:scheme="otpauth"/>
 | 
				
			||||||
 | 
					        <data android:host="totp"/>
 | 
				
			||||||
 | 
					        <data android:host="hotp"/>
 | 
				
			||||||
 | 
					      </intent-filter>
 | 
				
			||||||
    </activity>
 | 
					    </activity>
 | 
				
			||||||
    <uses-library android:required="false" android:name="com.sec.android.app.multiwindow" />
 | 
					    <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.support.multiwindow" android:value="true" />
 | 
				
			||||||
@@ -236,6 +236,14 @@ The scheme=file is still there for old OS devices. It's also queried by apps lik
 | 
				
			|||||||
				<action android:name="keepass2android.ACTION_START_WITH_TASK" />
 | 
									<action android:name="keepass2android.ACTION_START_WITH_TASK" />
 | 
				
			||||||
				<category android:name="android.intent.category.DEFAULT" />
 | 
									<category android:name="android.intent.category.DEFAULT" />
 | 
				
			||||||
			</intent-filter>
 | 
								</intent-filter>
 | 
				
			||||||
 | 
					      <intent-filter>
 | 
				
			||||||
 | 
					        <action android:name="android.intent.action.VIEW" />
 | 
				
			||||||
 | 
					        <category android:name="android.intent.category.DEFAULT" />
 | 
				
			||||||
 | 
					        <category android:name="android.intent.category.BROWSABLE" />
 | 
				
			||||||
 | 
					        <data android:scheme="otpauth"/>
 | 
				
			||||||
 | 
					        <data android:host="totp"/>
 | 
				
			||||||
 | 
					        <data android:host="hotp"/>
 | 
				
			||||||
 | 
					      </intent-filter>
 | 
				
			||||||
		</activity>
 | 
							</activity>
 | 
				
			||||||
		<uses-library android:required="false" android:name="com.sec.android.app.multiwindow" />
 | 
							<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.support.multiwindow" android:value="true" />
 | 
				
			||||||
							
								
								
									
										24
									
								
								src/keepass2android-app/NullActivity.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/keepass2android-app/NullActivity.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					using Android.Content.PM;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace keepass2android
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [Activity(Label = AppNames.AppName,
 | 
				
			||||||
 | 
					        MainLauncher = false,
 | 
				
			||||||
 | 
					        Theme = "@style/Kp2aTheme_BlueNoActionBar",
 | 
				
			||||||
 | 
					        Exported = true)] 
 | 
				
			||||||
 | 
					    ///For autofill, we sometimes need to pass an intent to an inline presentation which never gets fired. We use this as a dummy activity.
 | 
				
			||||||
 | 
					    public class NullActivity: Activity
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        protected override void OnCreate(Bundle savedInstanceState)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Kp2aLog.Log("NullActivity.OnCreate - this is unexpected.");
 | 
				
			||||||
 | 
					            base.OnCreate(savedInstanceState);
 | 
				
			||||||
 | 
					            Finish();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -65,6 +65,7 @@ using Enum = System.Enum;
 | 
				
			|||||||
using Exception = System.Exception;
 | 
					using Exception = System.Exception;
 | 
				
			||||||
using String = System.String;
 | 
					using String = System.String;
 | 
				
			||||||
using Toolbar = AndroidX.AppCompat.Widget.Toolbar;
 | 
					using Toolbar = AndroidX.AppCompat.Widget.Toolbar;
 | 
				
			||||||
 | 
					using AndroidX.Core.Content;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace keepass2android
 | 
					namespace keepass2android
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -647,7 +648,7 @@ namespace keepass2android
 | 
				
			|||||||
		    _intentReceiver = new PasswordActivityBroadcastReceiver(this);
 | 
							    _intentReceiver = new PasswordActivityBroadcastReceiver(this);
 | 
				
			||||||
			IntentFilter filter = new IntentFilter();
 | 
								IntentFilter filter = new IntentFilter();
 | 
				
			||||||
			filter.AddAction(Intent.ActionScreenOff);
 | 
								filter.AddAction(Intent.ActionScreenOff);
 | 
				
			||||||
			RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported);
 | 
					            ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            //use FlagSecure to make sure the last (revealed) character of the master password is not visible in recent apps
 | 
					            //use FlagSecure to make sure the last (revealed) character of the master password is not visible in recent apps
 | 
				
			||||||
@@ -34,6 +34,7 @@ using keepass2android;
 | 
				
			|||||||
using KeePassLib;
 | 
					using KeePassLib;
 | 
				
			||||||
using KeePassLib.Serialization;
 | 
					using KeePassLib.Serialization;
 | 
				
			||||||
using Toolbar = AndroidX.AppCompat.Widget.Toolbar;
 | 
					using Toolbar = AndroidX.AppCompat.Widget.Toolbar;
 | 
				
			||||||
 | 
					using AndroidX.Core.Content;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace keepass2android
 | 
					namespace keepass2android
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -153,7 +154,7 @@ namespace keepass2android
 | 
				
			|||||||
			_intentReceiver = new QuickUnlockBroadcastReceiver(this);
 | 
								_intentReceiver = new QuickUnlockBroadcastReceiver(this);
 | 
				
			||||||
			IntentFilter filter = new IntentFilter();
 | 
								IntentFilter filter = new IntentFilter();
 | 
				
			||||||
			filter.AddAction(Intents.DatabaseLocked);
 | 
								filter.AddAction(Intents.DatabaseLocked);
 | 
				
			||||||
			RegisterReceiver(_intentReceiver, filter, ReceiverFlags.Exported);
 | 
					            ContextCompat.RegisterReceiver(this, _intentReceiver, filter, (int)ReceiverFlags.Exported);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Util.SetNoPersonalizedLearning(FindViewById<EditText>(Resource.Id.QuickUnlock_password));
 | 
					            Util.SetNoPersonalizedLearning(FindViewById<EditText>(Resource.Id.QuickUnlock_password));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user