diff --git a/.gitignore b/.gitignore
index af8e3100..b170c7b1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -153,3 +153,8 @@ intermediates
/src/java/Kp2aAccServiceLib/app/app.iml
/src/java/Kp2aAccServiceLib/gradle
adbprompt.ps1
+/src/java/KP2ASoftkeyboard_AS/build/android-profile/*.rawproto
+src/java/KP2ASoftkeyboard_AS/build/generated/mockable-android-23.jar
+*.rawproto
+src/java/Keepass2AndroidPluginSDK2/build/generated/mockable-Google-Inc.-Google-APIs-23.jar
+/src/.vs
diff --git a/docs/OreoAutoFill.md b/docs/OreoAutoFill.md
new file mode 100644
index 00000000..75b4818a
--- /dev/null
+++ b/docs/OreoAutoFill.md
@@ -0,0 +1,20 @@
+Google has introduced the Android Autofill interface in Android 8. Keepass2Android supports this interface. In most Android apps and all Autofill-enabled browsers, this is the most convenient way of entering passwords. As soon as you focus a field, you will see a popup "Fill with Keepass2Android".
+
+
+
+After clicking this popup, you can unlock your KP2A database. If automatic look up succeeds, KP2A will close automatically, if not you are prompted to select the entry you want to auto-fill. When returning to the target app, the fields should be filled automatically already.
+
+As of January 2018, the following browsers are known to have Android Autofill support:
+
+* Firefox Focus / Firefox Klar
+* Opera Mini
+
+These browsers do not (yet) have autofill support:
+
+* Google Chrome
+* Firefox for Android
+* Brave-Browser
+* Opera
+
+Please use the Share-URL-feature and the built-in KP2A keyboard for these browsers.
+
diff --git a/docs/autofill-facebook.png b/docs/autofill-facebook.png
new file mode 100644
index 00000000..83de5055
Binary files /dev/null and b/docs/autofill-facebook.png differ
diff --git a/src/AndroidFileChooserBinding/AndroidFileChooserBinding.csproj b/src/AndroidFileChooserBinding/AndroidFileChooserBinding.csproj
index a841a519..c0c6d534 100644
--- a/src/AndroidFileChooserBinding/AndroidFileChooserBinding.csproj
+++ b/src/AndroidFileChooserBinding/AndroidFileChooserBinding.csproj
@@ -10,7 +10,7 @@
AndroidFileChooserBindingAndroidFileChooserBinding512
- v7.1
+ v8.0True
@@ -47,9 +47,6 @@
-
- ..\packages\Xamarin.Android.Support.v4.20.0.0.4\lib\MonoAndroid10\Xamarin.Android.Support.v4.dll
-
diff --git a/src/AndroidFileChooserBinding/packages.config b/src/AndroidFileChooserBinding/packages.config
index 8cdf15fa..1508affa 100644
--- a/src/AndroidFileChooserBinding/packages.config
+++ b/src/AndroidFileChooserBinding/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/src/JavaFileStorageBindings/JavaFileStorageBindings.csproj b/src/JavaFileStorageBindings/JavaFileStorageBindings.csproj
index 9123ffe9..7c7486b5 100644
--- a/src/JavaFileStorageBindings/JavaFileStorageBindings.csproj
+++ b/src/JavaFileStorageBindings/JavaFileStorageBindings.csproj
@@ -11,7 +11,7 @@
JavaFileStorageBindings512True
- v7.1
+ v8.0true
@@ -50,15 +50,6 @@
..\Components\googleplayservices-19.0.0\lib\android\GooglePlayServicesLib.dll
-
- ..\Components\googleplayservices-19.0.0\lib\android\Xamarin.Android.Support.v4.dll
-
-
- ..\Components\googleplayservices-19.0.0\lib\android\Xamarin.Android.Support.v7.AppCompat.dll
-
-
- ..\Components\googleplayservices-19.0.0\lib\android\Xamarin.Android.Support.v7.MediaRouter.dll
-
diff --git a/src/KP2AKdbLibraryBinding/KP2AKdbLibraryBinding.csproj b/src/KP2AKdbLibraryBinding/KP2AKdbLibraryBinding.csproj
index 77429eaa..3ff0ddff 100644
--- a/src/KP2AKdbLibraryBinding/KP2AKdbLibraryBinding.csproj
+++ b/src/KP2AKdbLibraryBinding/KP2AKdbLibraryBinding.csproj
@@ -10,7 +10,7 @@
KP2AKdbLibraryBindingKP2AKdbLibraryBinding512
- v7.1
+ v8.0True
diff --git a/src/KeePass.sln b/src/KeePass.sln
index 0fda9671..2446d655 100644
--- a/src/KeePass.sln
+++ b/src/KeePass.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.31101.0
+# Visual Studio 15
+VisualStudioVersion = 15.0.27004.2009
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePassLib2Android", "KeePassLib2Android\KeePassLib2Android.csproj", "{545B4A6B-8BBA-4FBE-92FC-4AC060122A54}"
EndProject
@@ -247,6 +247,9 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {2B48EDA2-ABCE-4DB5-A609-DFDF5FAAE767}
+ EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
$0.DotNetNamingPolicy = $1
diff --git a/src/KeePassLib2Android/KeePassLib2Android.csproj b/src/KeePassLib2Android/KeePassLib2Android.csproj
index c10e7427..d3029e5f 100644
--- a/src/KeePassLib2Android/KeePassLib2Android.csproj
+++ b/src/KeePassLib2Android/KeePassLib2Android.csproj
@@ -12,7 +12,7 @@
Resources\Resource.designer.csResourceKeePassLib2Android
- v7.1
+ v8.0True8482b288
diff --git a/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj b/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj
index a5b3bf8c..32a191a2 100644
--- a/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj
+++ b/src/Kp2aBusinessLogic/Kp2aBusinessLogic.csproj
@@ -12,7 +12,7 @@
512Resources\Resource.Designer.csOff
- v7.1
+ v8.0true06ffb71c
diff --git a/src/Kp2aBusinessLogic/database/Database.cs b/src/Kp2aBusinessLogic/database/Database.cs
index c795e082..c236a806 100644
--- a/src/Kp2aBusinessLogic/database/Database.cs
+++ b/src/Kp2aBusinessLogic/database/Database.cs
@@ -289,6 +289,7 @@ namespace keepass2android
CanWrite = true;
_reloadRequested = false;
OtpAuxFileIoc = null;
+ LastOpenedEntry = null;
}
public void MarkAllGroupsAsDirty() {
diff --git a/src/Kp2aBusinessLogic/database/PwEntryOutput.cs b/src/Kp2aBusinessLogic/database/PwEntryOutput.cs
index 8ab57d0b..26d0ea18 100644
--- a/src/Kp2aBusinessLogic/database/PwEntryOutput.cs
+++ b/src/Kp2aBusinessLogic/database/PwEntryOutput.cs
@@ -56,5 +56,10 @@ namespace keepass2android
{
get { return _entry; }
}
+
+ ///
+ /// if the entry was selected by searching for a URL, the query URL is returned here.
+ ///
+ public string SearchUrl { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Kp2aBusinessLogic/database/edit/DeleteRunnable.cs b/src/Kp2aBusinessLogic/database/edit/DeleteRunnable.cs
index 5fa72baa..50fed440 100644
--- a/src/Kp2aBusinessLogic/database/edit/DeleteRunnable.cs
+++ b/src/Kp2aBusinessLogic/database/edit/DeleteRunnable.cs
@@ -181,6 +181,7 @@ namespace keepass2android
PwDeletedObject pdo = new PwDeletedObject(pe.Uuid, dtNow);
pd.DeletedObjects.Add(pdo);
touchedGroups.Add(pgParent);
+ Db.Entries.Remove(pe.Uuid);
}
else // Recycle
{
diff --git a/src/Kp2aKeyboardBinding/Kp2aKeyboardBinding.csproj b/src/Kp2aKeyboardBinding/Kp2aKeyboardBinding.csproj
index e21cd150..df9c7b3b 100644
--- a/src/Kp2aKeyboardBinding/Kp2aKeyboardBinding.csproj
+++ b/src/Kp2aKeyboardBinding/Kp2aKeyboardBinding.csproj
@@ -11,7 +11,7 @@
ResourcesKp2aKeyboardBindingTrue
- v7.1
+ v8.0True
diff --git a/src/PluginSdkBinding/PluginSdkBinding.csproj b/src/PluginSdkBinding/PluginSdkBinding.csproj
index d32a1b32..222df093 100644
--- a/src/PluginSdkBinding/PluginSdkBinding.csproj
+++ b/src/PluginSdkBinding/PluginSdkBinding.csproj
@@ -11,7 +11,7 @@
PluginSdkBinding512True
- v7.1
+ v8.0true
@@ -53,8 +53,8 @@
-
- Jars\app-debug.aar
+
+ Jars\app-release.aar
diff --git a/src/SamsungPass b/src/SamsungPass
index 79184ec7..c9dd9b21 160000
--- a/src/SamsungPass
+++ b/src/SamsungPass
@@ -1 +1 @@
-Subproject commit 79184ec7cd77d89602e8ea4d5f38f7e2631aceb1
+Subproject commit c9dd9b21a59eb7d1761ea99ba6a34ac8c5bdbf42
diff --git a/src/TwofishCipher/TwofishCipher.csproj b/src/TwofishCipher/TwofishCipher.csproj
index 35a72b44..2368da5f 100644
--- a/src/TwofishCipher/TwofishCipher.csproj
+++ b/src/TwofishCipher/TwofishCipher.csproj
@@ -13,7 +13,7 @@
Resources\Resource.Designer.csOffTrue
- v7.1
+ v8.0true
diff --git a/src/ZlibAndroid/ZlibAndroid.csproj b/src/ZlibAndroid/ZlibAndroid.csproj
index 295d16ac..76403f80 100644
--- a/src/ZlibAndroid/ZlibAndroid.csproj
+++ b/src/ZlibAndroid/ZlibAndroid.csproj
@@ -13,7 +13,7 @@
AssetsTrueZlibAndroid
- v7.1
+ v8.0true
diff --git a/src/java/JavaFileStorage/app/build.gradle b/src/java/JavaFileStorage/app/build.gradle
index 547c20c2..ba1bbfcf 100644
--- a/src/java/JavaFileStorage/app/build.gradle
+++ b/src/java/JavaFileStorage/app/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 25
- buildToolsVersion '25.0.3'
+ compileSdkVersion 26
+ buildToolsVersion '26.0.2'
defaultConfig {
minSdkVersion 15
targetSdkVersion 23
@@ -25,7 +25,7 @@ dependencies {
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.burgstaller:okhttp-digest:1.7'
compile 'com.google.android.gms:play-services:4.0.30'
- compile 'com.google.http-client:google-http-client-gson:1.16.0-rc'
+ compile 'com.google.http-client:google-http-client-gson:1.20.0'
compile('com.google.api-client:google-api-client-android:1.16.0-rc') {
exclude group: 'com.google.android.google-play-services'
}
diff --git a/src/java/JavaFileStorageTest-AS/app/build.gradle b/src/java/JavaFileStorageTest-AS/app/build.gradle
index 2531f272..2d8e6d03 100644
--- a/src/java/JavaFileStorageTest-AS/app/build.gradle
+++ b/src/java/JavaFileStorageTest-AS/app/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 25
- buildToolsVersion '25.0.3'
+ compileSdkVersion 26
+ buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.crocoapps.javafilestoragetest"
diff --git a/src/java/JavaFileStorageTest-AS/build.gradle b/src/java/JavaFileStorageTest-AS/build.gradle
index dc21c09e..0451ca17 100644
--- a/src/java/JavaFileStorageTest-AS/build.gradle
+++ b/src/java/JavaFileStorageTest-AS/build.gradle
@@ -3,9 +3,13 @@
buildscript {
repositories {
jcenter()
+ maven {
+ url 'https://maven.google.com/'
+ name 'Google'
+ }
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.2'
+ classpath 'com.android.tools.build:gradle:3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -17,6 +21,7 @@ buildscript {
allprojects {
repositories {
jcenter()
+ google()
}
}
diff --git a/src/java/JavaFileStorageTest-AS/gradle/wrapper/gradle-wrapper.properties b/src/java/JavaFileStorageTest-AS/gradle/wrapper/gradle-wrapper.properties
index 1ef1f1f2..10b45347 100644
--- a/src/java/JavaFileStorageTest-AS/gradle/wrapper/gradle-wrapper.properties
+++ b/src/java/JavaFileStorageTest-AS/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Mon May 22 10:43:15 CEST 2017
+#Mon Dec 18 11:13:13 CET 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
diff --git a/src/java/KP2ASoftkeyboard_AS/.idea/gradle.xml b/src/java/KP2ASoftkeyboard_AS/.idea/gradle.xml
index 9ab4ad8a..3efaea6d 100644
--- a/src/java/KP2ASoftkeyboard_AS/.idea/gradle.xml
+++ b/src/java/KP2ASoftkeyboard_AS/.idea/gradle.xml
@@ -3,7 +3,7 @@
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/src/java/KP2ASoftkeyboard_AS/app/build.gradle b/src/java/KP2ASoftkeyboard_AS/app/build.gradle
index e6718595..b5c94888 100644
--- a/src/java/KP2ASoftkeyboard_AS/app/build.gradle
+++ b/src/java/KP2ASoftkeyboard_AS/app/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
- buildToolsVersion '23.0.2'
+ buildToolsVersion '26.0.2'
defaultConfig {
minSdkVersion 18
diff --git a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java
index 9f042ee3..f83c425f 100644
--- a/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java
+++ b/src/java/KP2ASoftkeyboard_AS/app/src/main/java/keepass2android/softkeyboard/KP2AKeyboard.java
@@ -778,8 +778,8 @@ public class KP2AKeyboard extends InputMethodService
if ((editorInfo.imeOptions&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) == EditorInfo.IME_ACTION_NEXT)
{
- Log.d("KP2AK", "action is NEXT");
- getCurrentInputConnection().performEditorAction(editorInfo.actionId);
+ Log.d("KP2AK", "action is NEXT ");
+ getCurrentInputConnection().performEditorAction(EditorInfo.IME_ACTION_NEXT);
}
}
diff --git a/src/java/KP2ASoftkeyboard_AS/build.gradle b/src/java/KP2ASoftkeyboard_AS/build.gradle
index 88d246d4..1c2d0680 100644
--- a/src/java/KP2ASoftkeyboard_AS/build.gradle
+++ b/src/java/KP2ASoftkeyboard_AS/build.gradle
@@ -4,7 +4,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
+ classpath 'com.android.tools.build:gradle:2.3.1'
}
}
diff --git a/src/java/KP2ASoftkeyboard_AS/gradle/wrapper/gradle-wrapper.properties b/src/java/KP2ASoftkeyboard_AS/gradle/wrapper/gradle-wrapper.properties
index 0c71e760..f8ce26aa 100644
--- a/src/java/KP2ASoftkeyboard_AS/gradle/wrapper/gradle-wrapper.properties
+++ b/src/java/KP2ASoftkeyboard_AS/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Wed Apr 10 15:27:10 PDT 2013
+#Sat Dec 02 16:20:53 CET 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
diff --git a/src/java/Keepass2AndroidPluginSDK2/app/build.gradle b/src/java/Keepass2AndroidPluginSDK2/app/build.gradle
index c6a22a32..1e620b4c 100644
--- a/src/java/Keepass2AndroidPluginSDK2/app/build.gradle
+++ b/src/java/Keepass2AndroidPluginSDK2/app/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion 'Google Inc.:Google APIs:23'
- buildToolsVersion '23.0.1'
+ buildToolsVersion '26.0.2'
defaultConfig {
minSdkVersion 8
diff --git a/src/java/Keepass2AndroidPluginSDK2/app/src/main/AndroidManifest.xml b/src/java/Keepass2AndroidPluginSDK2/app/src/main/AndroidManifest.xml
index 91aef12e..1a0bef65 100644
--- a/src/java/Keepass2AndroidPluginSDK2/app/src/main/AndroidManifest.xml
+++ b/src/java/Keepass2AndroidPluginSDK2/app/src/main/AndroidManifest.xml
@@ -10,7 +10,6 @@
diff --git a/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-hdpi/ic_launcher.png b/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 96a442e5..00000000
Binary files a/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-mdpi/ic_launcher.png b/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index 359047df..00000000
Binary files a/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-xhdpi/ic_launcher.png b/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index 71c6d760..00000000
Binary files a/src/java/Keepass2AndroidPluginSDK2/app/src/main/res/drawable-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/java/Keepass2AndroidPluginSDK2/build.gradle b/src/java/Keepass2AndroidPluginSDK2/build.gradle
index 88d246d4..4f430187 100644
--- a/src/java/Keepass2AndroidPluginSDK2/build.gradle
+++ b/src/java/Keepass2AndroidPluginSDK2/build.gradle
@@ -4,7 +4,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
+ classpath 'com.android.tools.build:gradle:2.2.1'
}
}
diff --git a/src/java/Keepass2AndroidPluginSDK2/gradle/wrapper/gradle-wrapper.properties b/src/java/Keepass2AndroidPluginSDK2/gradle/wrapper/gradle-wrapper.properties
index 0c71e760..76a0a412 100644
--- a/src/java/Keepass2AndroidPluginSDK2/gradle/wrapper/gradle-wrapper.properties
+++ b/src/java/Keepass2AndroidPluginSDK2/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Wed Apr 10 15:27:10 PDT 2013
+#Mon Dec 18 11:08:40 CET 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/src/java/Kp2aAccServiceLib/app/build.gradle b/src/java/Kp2aAccServiceLib/app/build.gradle
deleted file mode 100644
index e6718595..00000000
--- a/src/java/Kp2aAccServiceLib/app/build.gradle
+++ /dev/null
@@ -1,20 +0,0 @@
-apply plugin: 'com.android.library'
-android {
- compileSdkVersion 23
- buildToolsVersion '23.0.2'
-
- defaultConfig {
- minSdkVersion 18
- targetSdkVersion 23
- }
-
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
- }
- }
-}
-
-dependencies {
-}
\ No newline at end of file
diff --git a/src/java/Kp2aAccServiceLib/app/src/main/AndroidManifest.xml b/src/java/Kp2aAccServiceLib/app/src/main/AndroidManifest.xml
deleted file mode 100644
index d30c3c69..00000000
--- a/src/java/Kp2aAccServiceLib/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/autofill/AutoFillService.java b/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/autofill/AutoFillService.java
deleted file mode 100644
index 074d37fb..00000000
--- a/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/autofill/AutoFillService.java
+++ /dev/null
@@ -1,442 +0,0 @@
-package keepass2android.autofill;
-
-import android.accessibilityservice.AccessibilityService;
-import android.annotation.TargetApi;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityNodeInfo;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-import keepass2android.kbbridge.KeyboardData;
-
-
-/**
- * Created by Philipp on 25.01.2016.
- */
-public class AutoFillService extends AccessibilityService {
-
-
- private static boolean _hasUsedData = true;
- private static String _lastSearchUrl;
- private static final String _logTag = "KP2AAF";
- private static boolean _isRunning;
-
- private final int autoFillNotificationId = 798810;
- private final String androidAppPrefix = "androidapp://";
-
- @Override
- public void onCreate() {
- super.onCreate();
- _isRunning = true;
- android.util.Log.d(_logTag, "OnCreate");
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- _isRunning = false;
- }
-
- interface NodeCondition
- {
- boolean check(AccessibilityNodeInfo n);
- }
-
- class WindowIdCondition implements NodeCondition
- {
- private int id;
-
- public WindowIdCondition(int id)
- {
- this.id = id;
- }
-
- @Override
- public boolean check(AccessibilityNodeInfo n) {
- return n.getWindowId() == id;
- }
- }
-
- boolean isLauncherPackage(CharSequence packageName)
- {
- return "com.android.systemui".equals(packageName)
- || "com.android.launcher3".equals(packageName);
- }
-
- @TargetApi(21)
- class SystemUiCondition implements NodeCondition
- {
- @Override
- public boolean check(AccessibilityNodeInfo n) {
- return (n.getViewIdResourceName() != null) && (
- (n.getViewIdResourceName().startsWith("com.android.systemui")) || (n.getViewIdResourceName().startsWith("com.android.launcher3")));
- }
- }
-
- private class PasswordFieldCondition implements NodeCondition {
- @Override
- public boolean check(AccessibilityNodeInfo n) {
- return n.isPassword();
- }
- }
-
- private class EditTextCondition implements NodeCondition {
- @Override
- public boolean check(AccessibilityNodeInfo n) {
- //it seems like n.Editable is not a good check as this is false for some fields which are actually editable, at least in tests with Chrome.
- return (n.getClassName() != null) && (n.getClassName().toString().toLowerCase().contains("edittext"));
- }
- }
-
-
- public static boolean isAvailable()
- {
- return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);
- }
-
- public static boolean isRunning()
- {
- return _isRunning;
- }
-
- @Override
- public void onAccessibilityEvent(AccessibilityEvent event) {
- android.util.Log.d(_logTag, "OnAccEvent");
-
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
- {
- android.util.Log.d(_logTag, "AndroidVersion not supported");
- return;
- }
-
- handleAccessibilityEvent(event);
-
- }
-
- @TargetApi(21)
- private void handleAccessibilityEvent(AccessibilityEvent event) {
- try
- {
- if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
- || event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)
- {
- CharSequence packageName = event.getPackageName();
- android.util.Log.d(_logTag, "event: " + event.getEventType() + ", package = " + packageName);
- if ( isLauncherPackage(event.getPackageName()) )
- {
- android.util.Log.d(_logTag, "return.");
- return; //avoid that the notification is cancelled when pulling down notif drawer
- }
- else
- {
- android.util.Log.d(_logTag, "event package is no launcher");
- }
-
- if ((packageName != null)
- && (packageName.toString().startsWith("keepass2android.")))
- {
- android.util.Log.d(_logTag, "don't autofill kp2a.");
- return;
- }
-
- AccessibilityNodeInfo root = getRootInActiveWindow();
-
- if ( isLauncherPackage(root.getPackageName()) )
- {
- android.util.Log.d(_logTag, "return, root is from launcher.");
- return; //avoid that the notification is cancelled when pulling down notif drawer
- }
- else
- {
- android.util.Log.d(_logTag, "root package is no launcher");
- }
-
- int eventWindowId = event.getWindowId();
- if ((ExistsNodeOrChildren(root, new WindowIdCondition(eventWindowId)) && !ExistsNodeOrChildren(root, new SystemUiCondition())))
- {
- boolean cancelNotification = true;
-
- String url = androidAppPrefix + root.getPackageName();
-
- if ( "com.android.chrome".equals(root.getPackageName()) )
- {
- List urlFields = root.findAccessibilityNodeInfosByViewId("com.android.chrome:id/url_bar");
- url = urlFromAddressFields(urlFields, url);
-
- }
- else if (packageName == "com.sec.android.app.sbrowser")
- {
- List urlFields = root.findAccessibilityNodeInfosByViewId("com.sec.android.app.sbrowser:id/location_bar_edit_text");
- url = urlFromAddressFields(urlFields, url);
- }
- else if ("com.android.browser".equals(root.getPackageName()))
- {
- List urlFields = root.findAccessibilityNodeInfosByViewId("com.android.browser:id/url");
- url = urlFromAddressFields(urlFields, url);
- }
-
- android.util.Log.d(_logTag, "URL=" + url);
-
- if (ExistsNodeOrChildren(root, new PasswordFieldCondition()))
- {
- if ((getLastReceivedCredentialsUser() != null) &&
- (!_hasUsedData) &&
- (Objects.equals(url, _lastSearchUrl)
- || isSame(getCredentialsField("URL"), url)))
- {
- android.util.Log.d(_logTag, "Filling credentials for " + url);
-
- List emptyPasswordFields = new ArrayList<>();
- GetNodeOrChildren(root, new PasswordFieldCondition(), emptyPasswordFields);
-
- List allEditTexts = new ArrayList<>();
- GetNodeOrChildren(root, new EditTextCondition(), allEditTexts);
-
- AccessibilityNodeInfo usernameEdit = null;
- for (int i=0;i passwordFields)
- {
- Log.d(_logTag, "_hasUsedData = " + _hasUsedData);
- if ((keepass2android.kbbridge.KeyboardData.hasData()) && (_hasUsedData == false))
- {
- fillDataInTextField(usernameEdit, getLastReceivedCredentialsUser());
- for (int i=0;i result) {
- if (n != null)
- {
- if (condition.check(n))
- result.add(n);
- for (int i = 0; i < n.getChildCount(); i++)
- {
- GetNodeOrChildren(n.getChild(i), condition, result);
- }
- }
- }
-
- private boolean ExistsNodeOrChildren(AccessibilityNodeInfo n, NodeCondition condition) {
- if (n == null) return false;
- if (condition.check(n))
- return true;
- for (int i = 0; i < n.getChildCount(); i++)
- {
- if (ExistsNodeOrChildren(n.getChild(i), condition))
- return true;
- }
- return false;
- }
-
- private String urlFromAddressFields(List urlFields, String url) {
- if (!urlFields.isEmpty())
- {
- AccessibilityNodeInfo addressField = urlFields.get(0);
- CharSequence text = addressField.getText();
- if (text != null)
- {
- url = text.toString();
- if (!url.contains("://"))
- url = "http://" + url;
- }
- }
- return url;
- }
-
- @Override
- public void onInterrupt() {
-
- }
-
- public static void NotifyNewData(String searchUrl)
- {
- _hasUsedData = false;
- _lastSearchUrl = searchUrl;
- android.util.Log.d(_logTag, "Notify new data: " + searchUrl);
- }
-
-}
diff --git a/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/KeyboardData.java b/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/KeyboardData.java
deleted file mode 100644
index c23169d1..00000000
--- a/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/KeyboardData.java
+++ /dev/null
@@ -1,24 +0,0 @@
-
-package keepass2android.kbbridge;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import android.text.TextUtils;
-public class KeyboardData
-{
- public static List availableFields = new ArrayList();
- public static String entryName;
- public static String entryId;
-
- public static boolean hasData()
- {
- return !TextUtils.isEmpty(entryId);
- }
-
- public static void clear()
- {
- availableFields.clear();
- entryName = entryId = "";
- }
-}
diff --git a/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/KeyboardDataBuilder.java b/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/KeyboardDataBuilder.java
deleted file mode 100644
index e2dee9f6..00000000
--- a/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/KeyboardDataBuilder.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package keepass2android.kbbridge;
-import java.util.ArrayList;
-import java.util.HashMap;
-public class KeyboardDataBuilder {
- private ArrayList availableFields = new ArrayList();
-
- public void addString(String key, String displayName, String valueToType)
- {
- StringForTyping stringToType = new StringForTyping();
- stringToType.key = key;
- stringToType.displayName = displayName;
- stringToType.value = valueToType;
- availableFields.add(stringToType);
- }
-
- public void commit()
- {
- KeyboardData.availableFields = this.availableFields;
- }
-}
diff --git a/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/StringForTyping.java b/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/StringForTyping.java
deleted file mode 100644
index 9348dad2..00000000
--- a/src/java/Kp2aAccServiceLib/app/src/main/java/keepass2android/kbbridge/StringForTyping.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package keepass2android.kbbridge;
-
-public class StringForTyping {
- public String key; //internal identifier (PwEntry string field key)
- public String displayName; //display name for displaying the key (might be translated)
- public String value;
-
- @Override
- public StringForTyping clone(){
-
- StringForTyping theClone = new StringForTyping();
- theClone.key = key;
- theClone.displayName = displayName;
- theClone.value = value;
-
- return theClone;
- }
-
-
-}
diff --git a/src/java/Kp2aAccServiceLib/app/src/main/res/drawable-xhdpi/ic_notify_autofill.png b/src/java/Kp2aAccServiceLib/app/src/main/res/drawable-xhdpi/ic_notify_autofill.png
deleted file mode 100644
index b7ffa486..00000000
Binary files a/src/java/Kp2aAccServiceLib/app/src/main/res/drawable-xhdpi/ic_notify_autofill.png and /dev/null differ
diff --git a/src/java/Kp2aAccServiceLib/app/src/main/res/values/strings_autofill.xml b/src/java/Kp2aAccServiceLib/app/src/main/res/values/strings_autofill.xml
deleted file mode 100644
index 146d6fa0..00000000
--- a/src/java/Kp2aAccServiceLib/app/src/main/res/values/strings_autofill.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
- Monitors apps and websites for password fields. Offers to look up credentials from Keepass2Android and auto-fill them into the forms.
-
- Look up credentials
- KP2A AutoFillPlugin
- Keepass2Android AutoFill
- AutoFill form for %1$s
-
-
\ No newline at end of file
diff --git a/src/java/Kp2aAccServiceLib/build.gradle b/src/java/Kp2aAccServiceLib/build.gradle
deleted file mode 100644
index 88d246d4..00000000
--- a/src/java/Kp2aAccServiceLib/build.gradle
+++ /dev/null
@@ -1,15 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
- }
-}
-
-allprojects {
- repositories {
- jcenter()
- }
-}
diff --git a/src/java/Kp2aAccServiceLib/gradle.properties b/src/java/Kp2aAccServiceLib/gradle.properties
deleted file mode 100644
index 0bb15d79..00000000
--- a/src/java/Kp2aAccServiceLib/gradle.properties
+++ /dev/null
@@ -1 +0,0 @@
-org.gradle.jvmargs=-Xmx1024m
\ No newline at end of file
diff --git a/src/java/Kp2aAccServiceLib/gradlew b/src/java/Kp2aAccServiceLib/gradlew
deleted file mode 100644
index 91a7e269..00000000
--- a/src/java/Kp2aAccServiceLib/gradlew
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched.
-if $cygwin ; then
- [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-fi
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >&-
-APP_HOME="`pwd -P`"
-cd "$SAVED" >&-
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/src/java/Kp2aAccServiceLib/gradlew.bat b/src/java/Kp2aAccServiceLib/gradlew.bat
deleted file mode 100644
index 8a0b282a..00000000
--- a/src/java/Kp2aAccServiceLib/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/src/java/Kp2aAccServiceLib/settings.gradle b/src/java/Kp2aAccServiceLib/settings.gradle
deleted file mode 100644
index 573abcb3..00000000
--- a/src/java/Kp2aAccServiceLib/settings.gradle
+++ /dev/null
@@ -1,2 +0,0 @@
-include ':app'
-
diff --git a/src/java/android-filechooser-AS/app/build.gradle b/src/java/android-filechooser-AS/app/build.gradle
index 5dc632e4..2b327ed9 100644
--- a/src/java/android-filechooser-AS/app/build.gradle
+++ b/src/java/android-filechooser-AS/app/build.gradle
@@ -1,8 +1,8 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 25
- buildToolsVersion '25.0.3'
+ compileSdkVersion 26
+ buildToolsVersion '26.0.2'
defaultConfig {
minSdkVersion 15
@@ -23,5 +23,5 @@ android {
}
dependencies {
- compile 'com.android.support:support-v4:23.0.0'
+ compile 'com.android.support:support-v4:26.1.0'
}
diff --git a/src/java/android-filechooser-AS/app/src/main/res/values-fi/strings.xml b/src/java/android-filechooser-AS/app/src/main/res/values-fi/strings.xml
index dc0f869b..9f15c1ea 100644
--- a/src/java/android-filechooser-AS/app/src/main/res/values-fi/strings.xml
+++ b/src/java/android-filechooser-AS/app/src/main/res/values-fi/strings.xml
@@ -54,7 +54,7 @@
NimiTallenna nimellä...Koko
- Järjestele…
+ Lajittele…EilenValitse kansio...
diff --git a/src/keepass2android/ChangeLog.cs b/src/keepass2android/ChangeLog.cs
index 70a7d0c8..197cbfa8 100644
--- a/src/keepass2android/ChangeLog.cs
+++ b/src/keepass2android/ChangeLog.cs
@@ -26,7 +26,9 @@ namespace keepass2android
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(ctx, Android.Resource.Style.ThemeHoloLightDialog));
builder.SetTitle(ctx.GetString(Resource.String.ChangeLog_title));
List changeLog = new List{
- ctx.GetString(Resource.String.ChangeLog_1_03),
+ ctx.GetString(Resource.String.ChangeLog_1_04b),
+ ctx.GetString(Resource.String.ChangeLog_1_04),
+ ctx.GetString(Resource.String.ChangeLog_1_03),
ctx.GetString(Resource.String.ChangeLog_1_02),
#if !NoNet
ctx.GetString(Resource.String.ChangeLog_1_01g),
diff --git a/src/keepass2android/GroupBaseActivity.cs b/src/keepass2android/GroupBaseActivity.cs
index 5a5a57e9..a187624e 100644
--- a/src/keepass2android/GroupBaseActivity.cs
+++ b/src/keepass2android/GroupBaseActivity.cs
@@ -34,7 +34,9 @@ using keepass2android.Io;
using keepass2android.database.edit;
using keepass2android.view;
using Android.Graphics.Drawables;
+using Android.Provider;
using Android.Support.V4.View;
+using Android.Views.Autofill;
using CursorAdapter = Android.Support.V4.Widget.CursorAdapter;
using Object = Java.Lang.Object;
@@ -46,6 +48,17 @@ namespace keepass2android
public const String KeyEntry = "entry";
public const String KeyMode = "mode";
+ static readonly Dictionary bottomBarElementsPriority = new Dictionary()
+ {
+ { Resource.Id.cancel_insert_element, 20 },
+ { Resource.Id.insert_element, 20 },
+ { Resource.Id.autofill_infotext, 10 },
+ { Resource.Id.select_other_entry, 20},
+ { Resource.Id.add_url_entry, 20},
+ };
+
+ private readonly HashSet showableBottomBarElements = new HashSet();
+
private ActivityDesign _design;
public virtual void LaunchActivityForEntry(PwEntry pwEntry, int pos)
@@ -87,14 +100,6 @@ namespace keepass2android
public void SetNormalButtonVisibility(bool showAddGroup, bool showAddEntry)
{
- //check for null in the following because the "empty" layouts may not have all views
-
- if (FindViewById(Resource.Id.bottom_bar) != null)
- FindViewById(Resource.Id.bottom_bar).Visibility = BottomBarAlwaysVisible ? ViewStates.Visible : ViewStates.Gone;
-
- if (FindViewById(Resource.Id.divider2) != null)
- FindViewById(Resource.Id.divider2).Visibility = BottomBarAlwaysVisible ? ViewStates.Visible : ViewStates.Gone;
-
if (FindViewById(Resource.Id.fabCancelAddNew) != null)
{
FindViewById(Resource.Id.fabCancelAddNew).Visibility = ViewStates.Gone;
@@ -104,16 +109,53 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNew).Visibility = (showAddGroup || showAddEntry) ? ViewStates.Visible : ViewStates.Gone;
}
+ UpdateBottomBarElementVisibility(Resource.Id.insert_element, false);
+ UpdateBottomBarElementVisibility(Resource.Id.cancel_insert_element, false);
- }
+ }
- public virtual bool BottomBarAlwaysVisible
- {
- get { return false; }
- }
+ void UpdateBottomBarVisibility()
+ {
+ var bottomBar = FindViewById(Resource.Id.bottom_bar);
+ //check for null because the "empty" layouts may not have all views
+ int highestPrio = -1;
+ HashSet highestPrioElements = new HashSet();
+ if (bottomBar != null)
+ {
+ for (int i = 0; i < bottomBar.ChildCount; i++)
+ {
+ int id = bottomBar.GetChildAt(i).Id;
+ if (!showableBottomBarElements.Contains(id))
+ continue;
+ int myPrio = bottomBarElementsPriority[id];
+
+ if (!highestPrioElements.Any() || highestPrio < myPrio)
+ {
+ highestPrioElements.Clear();
+ highestPrio = myPrio;
+ }
+ if (highestPrio == myPrio)
+ {
+ highestPrioElements.Add(id);
+ }
+ }
+
+ bottomBar.Visibility = highestPrioElements.Any() ? ViewStates.Visible : ViewStates.Gone;
+
+ for (int i = 0; i < bottomBar.ChildCount; i++)
+ {
+ int id = bottomBar.GetChildAt(i).Id;
+ bottomBar.GetChildAt(i).Visibility =
+ highestPrioElements.Contains(id) ? ViewStates.Visible : ViewStates.Gone;
+ }
+
+ if (FindViewById(Resource.Id.divider2) != null)
+ FindViewById(Resource.Id.divider2).Visibility = highestPrioElements.Any() ? ViewStates.Visible : ViewStates.Gone;
+ }
+ }
- protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
+ protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
@@ -194,7 +236,9 @@ namespace keepass2android
AppTask.StartInGroupActivity(this);
AppTask.SetupGroupBaseActivityButtons(this);
- RefreshIfDirty();
+ UpdateAutofillInfo();
+
+ RefreshIfDirty();
}
public override bool OnSearchRequested()
@@ -244,10 +288,36 @@ namespace keepass2android
_prefs = PreferenceManager.GetDefaultSharedPreferences(this);
+
+ SetContentView(ContentResourceId);
- SetContentView(ContentResourceId);
+ if (FindViewById(Resource.Id.enable_autofill) != null)
+ {
+ FindViewById(Resource.Id.enable_autofill).Click += (sender, args) =>
+ {
+ var intent = new Intent(Settings.ActionRequestSetAutofillService);
+ intent.SetData(Android.Net.Uri.Parse("package:" + PackageName));
+ try
+ {
+ StartActivity(intent);
+ }
+ catch (ActivityNotFoundException e)
+ {
+ //this exception was reported by many Huawei users
+ Kp2aLog.LogUnexpectedError(e);
+ new AlertDialog.Builder(this)
+ .SetTitle(Resource.String.autofill_enable)
+ .SetMessage(Resource.String.autofill_enable_failed)
+ .SetPositiveButton(Resource.String.ok, (o, eventArgs) => { })
+ .Show();
+ const string autofillservicewasenabled = "AutofillServiceWasEnabled";
+ _prefs.Edit().PutBoolean(autofillservicewasenabled, true).Commit();
+ UpdateBottomBarElementVisibility(Resource.Id.autofill_infotext, false);
+ }
+ };
+ }
- if (FindViewById(Resource.Id.fabCancelAddNew) != null)
+ if (FindViewById(Resource.Id.fabCancelAddNew) != null)
{
FindViewById(Resource.Id.fabAddNew).Click += (sender, args) =>
{
@@ -276,14 +346,55 @@ namespace keepass2android
Util.MoveBottomBarButtons(Resource.Id.cancel_insert_element, Resource.Id.insert_element, Resource.Id.bottom_bar, this);
}
+ if (FindViewById(Resource.Id.show_autofill_info) != null)
+ {
+ FindViewById(Resource.Id.show_autofill_info).Click += (sender, args) => Util.GotoUrl(this, "https://philippc.github.io/keepass2android/OreoAutoFill.html");
+ Util.MoveBottomBarButtons(Resource.Id.show_autofill_info, Resource.Id.enable_autofill, Resource.Id.autofill_buttons, this);
+ }
- SetResult(KeePass.ExitNormal);
+
+
+
+ SetResult(KeePass.ExitNormal);
}
- protected virtual int ContentResourceId
+ private void UpdateAutofillInfo()
+ {
+ bool canShowAutofillInfo = false;
+
+ if (!((Android.OS.Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.O) ||
+ !((AutofillManager) GetSystemService(Java.Lang.Class.FromType(typeof(AutofillManager))))
+ .IsAutofillSupported))
+ {
+ const string autofillservicewasenabled = "AutofillServiceWasEnabled";
+ if (!((AutofillManager) GetSystemService(Java.Lang.Class.FromType(typeof(AutofillManager))))
+ .HasEnabledAutofillServices)
+ {
+ if (!_prefs.GetBoolean(autofillservicewasenabled, false))
+ canShowAutofillInfo = true;
+ }
+ else
+ {
+ _prefs.Edit().PutBoolean(autofillservicewasenabled, true).Commit();
+
+ }
+ }
+ UpdateBottomBarElementVisibility(Resource.Id.autofill_infotext, canShowAutofillInfo);
+ }
+
+ protected void UpdateBottomBarElementVisibility(int resourceId, bool canShow)
+ {
+ if (canShow)
+ showableBottomBarElements.Add(resourceId);
+ else
+ showableBottomBarElements.Remove(resourceId);
+ UpdateBottomBarVisibility();
+ }
+
+ protected virtual int ContentResourceId
{
get { return Resource.Layout.group; }
}
@@ -732,8 +843,9 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewEntry).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = ViewStates.Gone;
- FindViewById(Resource.Id.bottom_bar).Visibility = ViewStates.Visible;
- FindViewById(Resource.Id.divider2).Visibility = ViewStates.Visible;
+ UpdateBottomBarElementVisibility(Resource.Id.insert_element, true);
+ UpdateBottomBarElementVisibility(Resource.Id.cancel_insert_element, true);
+
}
public void StopMovingElements()
diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs
index b48a03d2..187e777c 100644
--- a/src/keepass2android/PasswordActivity.cs
+++ b/src/keepass2android/PasswordActivity.cs
@@ -841,6 +841,8 @@ namespace keepass2android
behavior.OnNestedFling(FindViewById(Resource.Id.main_content), appbarLayout, null, 0, 200, true);
}
+
+
protected override void OnCreate(Bundle savedInstanceState)
{
_activityDesign.ApplyTheme();
@@ -1054,10 +1056,19 @@ namespace keepass2android
var btn = FindViewById(Resource.Id.fingerprintbtn);
btn.SetImageResource(Resource.Drawable.ic_fingerprint_success);
-
- var masterPassword = _fingerprintDec.DecryptStored(Database.GetFingerprintPrefKey(_ioConnection));
- _password = FindViewById(Resource.Id.password_edit).Text = masterPassword;
+ try
+ {
+ var masterPassword = _fingerprintDec.DecryptStored(Database.GetFingerprintPrefKey(_ioConnection));
+ _password = FindViewById(Resource.Id.password_edit).Text = masterPassword;
+
+ }
+ catch (Java.Security.GeneralSecurityException ex)
+ {
+ HandleFingerprintKeyInvalidated();
+ return;
+ }
+
btn.PostDelayed(() =>
{
//re-init fingerprint unlock in case something goes wrong with opening the database
@@ -1961,19 +1972,21 @@ namespace keepass2android
}
else
{
- //key invalidated permanently
- btn.SetImageResource(Resource.Drawable.ic_fingerprint_error);
- btn.Tag = GetString(Resource.String.fingerprint_unlock_failed);
- _fingerprintDec = null;
-
- ClearFingerprintUnlockData();
+ HandleFingerprintKeyInvalidated();
return false;
}
}
catch (Exception e)
{
+ //exception can happen here if the app was restored from Google Backup (including preferences) but no fingerprint data is there.
btn.SetImageResource(Resource.Drawable.ic_fingerprint_error);
- btn.Tag = "Error initializing Fingerprint Unlock: " + e;
+ Kp2aLog.Log("failed to init fingerprint unlock:" + e.ToString());
+ string error = GetString(Resource.String.FingerprintInitFailed) + " " +
+ GetString(Resource.String.fingerprint_reenable2);
+
+ btn.Tag = error;
+
+ Toast.MakeText(this, Resource.String.fingerprint_reenable2, ToastLength.Long).Show();
_fingerprintDec = null;
return false;
@@ -1982,6 +1995,17 @@ namespace keepass2android
}
+ private void HandleFingerprintKeyInvalidated()
+ {
+ var btn = FindViewById(Resource.Id.fingerprintbtn);
+//key invalidated permanently
+ btn.SetImageResource(Resource.Drawable.ic_fingerprint_error);
+ btn.Tag = GetString(Resource.String.fingerprint_unlock_failed) + " " + GetString(Resource.String.fingerprint_reenable2);
+ _fingerprintDec = null;
+
+ ClearFingerprintUnlockData();
+ }
+
private void InitializeOptionCheckboxes() {
CheckBox cbQuickUnlock = (CheckBox)FindViewById(Resource.Id.enable_quickunlock);
cbQuickUnlock.Checked = _prefs.GetBoolean(GetString(Resource.String.QuickUnlockDefaultEnabled_key), true);
@@ -2033,6 +2057,7 @@ namespace keepass2android
protected override void OnDestroy()
{
+ UnregisterReceiver(_intentReceiver);
base.OnDestroy();
if (_killOnDestroy)
Process.KillProcess(Process.MyPid());
@@ -2107,7 +2132,7 @@ namespace keepass2android
_act.ClearFingerprintUnlockData();
_act.InitFingerprintUnlock();
- Message = _act.GetString(Resource.String.fingerprint_disabled_wrong_masterkey);
+ Message = _act.GetString(Resource.String.fingerprint_disabled_wrong_masterkey) + " " + _act.GetString(Resource.String.fingerprint_reenable2);
}
else
{
diff --git a/src/keepass2android/Properties/AndroidManifest_debug.xml b/src/keepass2android/Properties/AndroidManifest_debug.xml
index fa4d8262..41eebd8e 100644
--- a/src/keepass2android/Properties/AndroidManifest_debug.xml
+++ b/src/keepass2android/Properties/AndroidManifest_debug.xml
@@ -1,8 +1,8 @@
-
+
diff --git a/src/keepass2android/Properties/AndroidManifest_net.xml b/src/keepass2android/Properties/AndroidManifest_net.xml
index a90903aa..9c3820a1 100644
--- a/src/keepass2android/Properties/AndroidManifest_net.xml
+++ b/src/keepass2android/Properties/AndroidManifest_net.xml
@@ -1,12 +1,12 @@
-
+
diff --git a/src/keepass2android/Properties/AndroidManifest_nonet.xml b/src/keepass2android/Properties/AndroidManifest_nonet.xml
index 0af968ef..7c1e37b3 100644
--- a/src/keepass2android/Properties/AndroidManifest_nonet.xml
+++ b/src/keepass2android/Properties/AndroidManifest_nonet.xml
@@ -6,6 +6,7 @@
android:installLocation="auto">
+
diff --git a/src/keepass2android/QuickUnlock.cs b/src/keepass2android/QuickUnlock.cs
index 8ba3d556..45000438 100644
--- a/src/keepass2android/QuickUnlock.cs
+++ b/src/keepass2android/QuickUnlock.cs
@@ -285,11 +285,7 @@ namespace keepass2android
else
{
Kp2aLog.Log("failed to initialize fingerprint.");
- //key invalidated permanently
- btn.SetImageResource(Resource.Drawable.ic_fingerprint_error);
- btn.Tag = GetString(Resource.String.fingerprint_unlock_failed);
- _fingerprintIdentifier = null;
-
+ HandleFingerprintKeyInvalidated();
}
}
catch (Exception e)
@@ -304,6 +300,15 @@ namespace keepass2android
}
+ private void HandleFingerprintKeyInvalidated()
+ {
+ var btn = FindViewById(Resource.Id.fingerprintbtn);
+//key invalidated permanently
+ btn.SetImageResource(Resource.Drawable.ic_fingerprint_error);
+ btn.Tag = GetString(Resource.String.fingerprint_unlock_failed) + " " + GetString(Resource.String.fingerprint_reenable2);
+ _fingerprintIdentifier = null;
+ }
+
private void ClearFingerprintUnlockData()
{
ISharedPreferencesEditor edit = PreferenceManager.GetDefaultSharedPreferences(this).Edit();
diff --git a/src/keepass2android/Resources/layout/QuickUnlock.xml b/src/keepass2android/Resources/layout/QuickUnlock.xml
index 5e38b63f..1bcb13a2 100644
--- a/src/keepass2android/Resources/layout/QuickUnlock.xml
+++ b/src/keepass2android/Resources/layout/QuickUnlock.xml
@@ -135,6 +135,8 @@ android:paddingRight="16dp"
android:ems="4"
android:layout_below="@id/QuickUnlock_label"
android:id="@+id/QuickUnlock_password"
+ android:singleLine="true"
+ android:fontFamily="sans-serif"
android:textSize="20sp"
android:focusable="true"
android:focusableInTouchMode="true" />
diff --git a/src/keepass2android/Resources/layout/autofill_service_list_item.xml b/src/keepass2android/Resources/layout/autofill_service_list_item.xml
new file mode 100644
index 00000000..44c1cd74
--- /dev/null
+++ b/src/keepass2android/Resources/layout/autofill_service_list_item.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/keepass2android/Resources/layout/group.xml b/src/keepass2android/Resources/layout/group.xml
index d2247feb..2a8a85a4 100644
--- a/src/keepass2android/Resources/layout/group.xml
+++ b/src/keepass2android/Resources/layout/group.xml
@@ -10,6 +10,7 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal" />
+
+
@@ -28,16 +31,62 @@
android:id="@+id/cancel_insert_element"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:visibility="gone"
android:layout_alignParentRight="true"
android:text="@string/cancel"
style="@style/BottomBarButton" />
+
+
+
+
+
+
+
+
+
+
+
+
-
+
تفعيل \"فتح القفل بالبصمة\" الكاملتفعيل \"فتح القفل بالبصمة\" لـ \"فتح القفل السريع\"إلمس الحساس لفتح قاعدة البيانات
- فشل \"فتح القفل بالبصمة\". مفتاح فك التشفير أُبطِل بواسطة نظام التشغيل. يحدث هذا عادة إذا سُجلت بصمة جديدة أو تم تغيير إعدادات الأمان. حاول مجدداً باستخدام كلمة المرور الخاصة بك ثم أعد تفعيل \"فتح الفقل بالبصمة\" من إعدادات قاعدة البيانات.
- فشل فتح قاعدة البيانات: تركيبة مفتاح المرور غير صالحة. تم تعطيل \"فتح القفل بالبصمة\" لأن كلمة السر الرئيسية المخزنة غير صالحة. يرجى الدخول باستخدام كلمة السر و من ثم اعادة تفعيل \"فتح القفل بالبصمة\" من إعدادات قاعدة البيانات.الرجاء إعادة تفعيل \"فتح القفل بالبصمة\" لكلمة المرور الرئيسية الجديدة.
هذا سيقوم بتخزين كلمة السر الرئيسية على هذا الجهاز،
diff --git a/src/keepass2android/Resources/values-bg-rBG/strings.xml b/src/keepass2android/Resources/values-bg-rBG/strings.xml
index 9531e8e3..3dcc2dc0 100644
--- a/src/keepass2android/Resources/values-bg-rBG/strings.xml
+++ b/src/keepass2android/Resources/values-bg-rBG/strings.xml
@@ -86,8 +86,6 @@
Разреши отключването с отпечатъкВключи Отключване с Пръстов Отпечатък при Бързо ОтключванеДокоснете сензора за отключване на базата данни
- Отключване с Пръстов Отпечатък се провали: Ключът беше отхвърлен от Андроид състемата. Това обикновено се случва когато нов пръстов отпечатък е добавен или има промняна в настройките. Моля отключете с вашата парола и след това включете Отключване с Пръстов Отпечатък отново през настройките за база данни.
- Отключването на базата данни е неуспешно: грешен композитен ключ. Отключването с пръстов отпечатък е изключено, понеже съхранената главна парола вече е не е валидна. Моля отключете с вашата парола и отново включете пръстовия отпечатък в настройките.Моля активирайте повторно отключването с пръстов отпечатък за новата главна парола.
Това ще запише вашата главна парола криптирана с Android Keystore и защитена с пръстовия ви отпечатък. Можете да отключите само с вашия отпечатък.
diff --git a/src/keepass2android/Resources/values-ca/strings.xml b/src/keepass2android/Resources/values-ca/strings.xml
index 9c9d9fe7..f6ee5170 100644
--- a/src/keepass2android/Resources/values-ca/strings.xml
+++ b/src/keepass2android/Resources/values-ca/strings.xml
@@ -87,8 +87,6 @@
Habilitar desbloqueig per empremta dactilarHabilitar desbloqueig per empremta dactilar per DesbloqueigRàpidTocar sensor per desbloquejar la base de dades
- Ha fallat el desbloqueig d\'empremta. La clau de desxifrat ha sigut invalidada per el SO Android. Normalment això passa si es va inscriure una empremta dactilar nova o la configuració de seguretat s\'ha canviat. Si us plau, obriu amb la contrasenya i després torneu a habilitar Desblocatge amb empremta en la configuració de la base de dades.
- Ha fallat el desbloqueig de la base de dades: clau composta no vàlida. El desbloqueig d\'empremta ha sigut desactivat perquè aparentment la contrasenya mestra emmagatzemada ja no és vàlida. Si us plau entreu amb la contrasenya i després torneu a habilitar Desblocatge amb empremta en la configuració de la base de dades.Si us plau, torneu a activar Desblocatge amb empremta per la nova contrasenya mestra.
Això emmagatzemarà la contrasenya mestra d\'aquest
diff --git a/src/keepass2android/Resources/values-cs/strings.xml b/src/keepass2android/Resources/values-cs/strings.xml
index 5e8f5d5d..db2b4bb0 100644
--- a/src/keepass2android/Resources/values-cs/strings.xml
+++ b/src/keepass2android/Resources/values-cs/strings.xml
@@ -87,8 +87,6 @@
Povolit úplné odemknutí otiskem prstuPovolit odemknutí otiskem prstu pro rychlé odemknutíDotkněte se snímače pro odemknutí databáze
- Odemknutí otiskem prstu selhalo. Dešifrovací klíč byl zneplatněn systémem Android. Toto se nejčastěji stává, pokud byl zaregistrovaný nový otisk prostu nebo bylo změněno nastavení zabezpečení. Prosím odemkněte pomocí svého hesla a potom znovu povolte odemknutí otiskem prstu v nastavení databáze.
- Odemknutí databáze se nezdařilo: neplatný složený klíč. Odemknutí otiskem prstu bylo zakázáno z důvodu pravděpodobného vypršení platnosti hlavního hesla. Prosím, odemkněte pomocí vašeho hesla a potom znovu povolte odemknutí otiskem prstu v nastavení databáze.Prosím, povolte znovu odemknutí otiskem prstu pro nové hlavní heslo.
Toto uloží vaše hlavní heslo na toto zařízení,
diff --git a/src/keepass2android/Resources/values-da/strings.xml b/src/keepass2android/Resources/values-da/strings.xml
index a88067c1..7a263c68 100644
--- a/src/keepass2android/Resources/values-da/strings.xml
+++ b/src/keepass2android/Resources/values-da/strings.xml
@@ -87,8 +87,6 @@ Gå venligst til systemindstillinger først.Slå fuld Fingeraftryksoplåsning tilSlå Fingeraftryksoplåsning til for hurtigoplåsningRør sensoren for at låse databasen op
- Fingerprint Unlock mislykkedes. Krypteringsnøglen blev ugyldiggjort af Android OS. Dette sker normalt, hvis et nyt fingeraftryk blev tilmeldt eller sikkerhedsindstillinger blev ændret. Venligst lås op med din adgangskode og derefter genaktivér Fingeraftryksoplåsning i databaseindstillingerne.
- Oplåsning af databasen mislykkedes: Ugyldig kombinationsnøgle. Fingeraftryksoplåsning blev deaktiveret, formodentligt fordi den lagrede hovedadgangskode ikke længere er gyldig. Lås venligst op med dit kodeord og genaktivér Fingeraftrykslås i databaseindstillingerne.Genaktiver venligst Fingeraftryksoplåsning for den nye hovedadgangskode.Dette gemmer din hovedadgangskode på denne enhed, krypteret med Android Keystore og beskyttet ved brug af fingeraftryksautentificering. Tillader kun at låse din database op med dit fingeraftryk.Tillader at bruge fingeraftryksgodkendelse i stedet for Hurtigoplåsningskoden. Gemmer ikke nogen information relateret til din hovedadgangskode.
diff --git a/src/keepass2android/Resources/values-de/strings.xml b/src/keepass2android/Resources/values-de/strings.xml
index 1f03612f..9af0bff7 100644
--- a/src/keepass2android/Resources/values-de/strings.xml
+++ b/src/keepass2android/Resources/values-de/strings.xml
@@ -8,7 +8,7 @@
Die Benutzeroberfläche basiert auf einem Port von Keepassdroid (entwickelt von Brian Pellin) nach Mono for Android. Der Code für die Datenbank-Operationen nutzt eine angepasste Version einer Bibliothek aus KeePass (entwickelt von Dominik Reichl).
Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die Google durchgeführt und zur Verfügung gestellt hat; er wird nach den Bedingungen der Creative Commons 3.0 Attribution License genutzt.SFTP-Unterstützung ist implementiert unter Nutzung der JSch-Bibliothek (BSD-Lizenz), erstellt durch JCraft, Inc.
- Das Hammer-Icon wurde von John Caserta aus dem Noun Project erstellt. Das Pinguin-Icon wurde von Adriano Emerick aus dem Noun Project erstellt. Das Feder-Icon wurde von Jon Testa aus dem Noun Project erstellt. Das Apfel-Icon wurde von Ava Rowell aus dem Noun Project erstellt. Das Bild-Icon stammt von https://icons8.com/icon/5570/Picture.
+ Das Hammer-Icon wurde von John Caserta (Noun Project) erstellt. Das Pinguin-Icon wurde von Adriano Emerick (Noun Project) erstellt. Das Feder-Icon wurde von Jon Testa (Noun Project) erstellt. Das Apfel-Icon wurde von Ava Rowell (Noun Project) erstellt. Das Bild-Icon stammt von https://icons8.com/icon/5570/Picture.AkzeptierenVerweigernEintrag hinzufügen
@@ -88,9 +88,11 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
Volles Entsperren mit Fingerabdruck aktivierenEntsperren mit Fingerabdruck für QuickUnlockSensor zum Entsperren berühren
- Entsperren mit Fingerabdruck fehlgeschlagen. Entschlüsselungsschlüssel wurde vom Android-System für ungültig erklärt. Das kommt üblicherweise vor, wenn ein neuer Fingerabdruck hinzugefügt wurde oder die Sicherheitseinstellungen geändert wurden. Bitte mit Passwort entsperren und anschließend in den Datenbankeinstellungen das Öffnen mit Fingerabdruck erneut aktivieren.
- Entsperren der Datenbank fehlgeschlagen: Ungültiger zusammengesetzter Schlüssel. Entsperren per Fingerabdruck wurde deaktiviert, da das gespeicherte Masterpasswort nicht länger gültig ist. Bitte mit Passwort entsperren und anschließend in den Datenbankeinstellungen das Entsperren per Fingerabdruck erneut aktivieren.
+ Entsperren mit Fingerabdruck fehlgeschlagen. Entschlüsselungsschlüssel wurde vom Android-System für ungültig erklärt. Das kommt üblicherweise vor, wenn ein neuer Fingerabdruck hinzugefügt wurde oder die Sicherheitseinstellungen geändert wurden.
+ Entsperren der Datenbank fehlgeschlagen: Ungültiger zusammengesetzter Schlüssel. Entsperren per Fingerabdruck wurde deaktiviert, da das gespeicherte Masterpasswort nicht länger gültig ist.Bitte Fingerabdruck für das neue Masterpasswort erneut aktivieren.
+ Bitte mit Passwort entsperren und anschließend in den Datenbankeinstellungen das Entsperren per Fingerabdruck erneut aktivieren.
+ Fehler beim Initialisieren des Fingerabdruck-Sensors.
Mit dieser Option wird das Masterpasswort verschlüsselt im Android-Keystore auf dem Gerät gespeichert, geschützt durch einen Fingerabdruck. Ermöglicht es, die Datenbank per Fingerabdruck zu entsperren.
@@ -289,7 +291,7 @@ Mit dieser Option wird das Masterpasswort verschlüsselt im Android-Keystore auf
Bitte wähle den Ort zum Speichern.Auf SD-Karte speichernIm Cache speichern und öffnen
- Mit internem Image-Viewer anzeigen
+ Mit internem Bildbetrachter anzeigenDatei unter %1$s gespeichert.Datei konnte nicht unter %1$s gespeichert werden.Suchtext merken?
@@ -308,7 +310,7 @@ Mit dieser Option wird das Masterpasswort verschlüsselt im Android-Keystore auf
Serverzugangsdaten eingebenDateitransaktionenDateitransaktionen beim Schreiben von Datenbank-Dateien verwenden
- Sperren bei Ausschalten
+ Sperren, wenn Bildschirm ausgeschaltetSperre die Datenbank wenn der Bildschirm ausgeschaltet wird.Eingegebenes Master-Passwort-Feld leerenLeere das Eingabefeld für das Master-Passwort, wenn der Passwort-Eingabebildschirm verlassen wird, ohne dass die Datenbank entsperrt wurde.
@@ -322,9 +324,9 @@ Mit dieser Option wird das Masterpasswort verschlüsselt im Android-Keystore auf
Datenbank-CachingSpeichere eine Kopie der Remote-Datenbank-Dateien im Cache-Verzeichnis der App. Das erlaubt die Nutzung von Remote-Datenbanken auch wenn du offline bist.SSL-Zertifikate
- Bestimme das Verhalten, wenn Zertifikate nicht validiert werden können. Hinweis: du kannst auf deinem Android-Gerät Root-Zertifikate installieren, damit die Validierung gelingt!
+ Bestimme das Verhalten, wenn Zertifikate nicht validiert werden können. Hinweis: du kannst auf deinem Android-Gerät Root-Zertifikate installieren, damit die Validierung gelingt!Cache löschen?
- Alle Datenbank-Dateien im Cache werden gelöscht. Änderungen, die du gemacht hast während du offline warst und die noch nicht synchronisiert wurden, werden verloren gehen! Fortfahren?
+ Alle Datenbank-Dateien im Cache werden gelöscht. Nicht synchronisierte Änderungen, die du offline gemacht hast, gehen verloren! Fortfahren?Auf Änderungen prüfenVor dem Speichern prüfen, ob die Datei von außerhalb geändert wurde.Prüfe auf doppelte UUIDs
@@ -334,6 +336,7 @@ Mit dieser Option wird das Masterpasswort verschlüsselt im Android-Keystore auf
Separate BenachrichtigungenZeige separate Benachrichtigungen zum Kopieren von Benutzername und Passwort in die Zwischenablage und zur Aktivierung der Eingabemethode.AutoFill Accessibility-Service
+ AutoFill-DienstKP2A-Tastatur BenachrichtigungKompletten Eintrag über die KP2A-Tastatur bereitstellen (empfohlen).Tastatur umschalten
@@ -494,6 +497,7 @@ Mit dieser Option wird das Masterpasswort verschlüsselt im Android-Keystore auf
deaktiviertPlugins online findenBereiche
+ nicht aktiviert%1$s fordert die Anmeldeinformationen für %2$s an.%1$s fordert Anmeldeinformationen an. Bitte Eintrag wählen.Aktiviert
@@ -571,6 +575,11 @@ Anbei einige Hinweise, die bei der Diagnose des Problems helfen können:\n
Nach Fehler fragenFehlerbericht sendenZeige Bildschirmtastatur zur Passworteingabe während Fingerabdruckerkennung aktiv ist.
+
+ Version 1.04\n
+ * Autofill-Dienst für Android 8.0 und höher implementiert.\n
+ * Bibliotheken und Build-Tools aktualisiert.\n
+
Version 1.03\n
* Accessibility-Service für AutoFill entfernt, da dies von Google gefordert wurde. Gehe in die Passwort-Zugriff-Einstellungen für einen Link zu einem Plugin, das die zuvor integrierte Funktionalität wieder bereitstellen kann.\n
@@ -863,4 +872,9 @@ Erstes öffentliches ReleaseBitte stelle sicher, dass dies auf deinem System funktioniert; falls nicht, nutze bitte die standard Tastatur.Vom Plugin gelieferte Beschreibung:
+ Keepass2Android unterstützt das Autofill-Feature von Android, aber du hast es anscheinend noch nicht aktiviert.
+ Autofill aktivieren
+ Autofill-Hilfe anzeigen
+ Mit Keepass2Android ausfüllen
+ Webdomain %1$s konnte nicht mit App %2$s in Verbindung gebracht werden
diff --git a/src/keepass2android/Resources/values-el/strings.xml b/src/keepass2android/Resources/values-el/strings.xml
index caa33a34..b388f719 100644
--- a/src/keepass2android/Resources/values-el/strings.xml
+++ b/src/keepass2android/Resources/values-el/strings.xml
@@ -87,8 +87,6 @@
Ενεργοποίηση ξεκλειδώματος με δακτυλικό αποτύπωμαΕνεργοποίηση ξεκλειδώματος με δακτυλικό αποτύπωμα για QuickUnlockΑγγίξτε αισθητήρα αφής για ξεκλείδωμα της βάσης δεδομένων
- Αποτυχία ξεκλειδώματος με δακτυλικό αποτύπωμα. Το κλειδί αποκρυπτογράφησης ακυρώθηκε από το Android. Αυτό συνήθως συμβαίνει αν καταχωρήθηκε νέο αποτύπωμα ή άλλαξαν οι ρυθμίσεις ασφαλείας. Ξεκλειδώστε με συνθηματικό και μετά επανενεργοποιήστε το ξεκλείδωμα με δακτυλικό αποτύπωμα στις ρυθμίσεις της βάσης δεδομένων.
- Αποτυχία ξεκλειδώματος βάσης δεδομένων: άκυρο σύνθετο κλειδί. Το ξεκλείδωμα δακτυλικού αποτυπώματος απενεργοποιήθηκε επειδή το αποθηκευμένο βασικό συνθηματικό δεν είναι πλέον έγκυρο. Ξεκλειδώστε με το συνθηματικό σας και μετά επανενεργοποιήστε το ξεκλείδωμα με δακτυλικό αποτύπωμα στις ρυθμίσεις βάσης δεδομένων.Επενενεργοποιήστε το ξεκλείδωμα με δακτυλικό αποτύπωμα για το νέο βασικό συνθηματικό.
Το βασικό συνθηματικό θα αποθηκευτεί σε αυτή τη συσκευή,
diff --git a/src/keepass2android/Resources/values-es/strings.xml b/src/keepass2android/Resources/values-es/strings.xml
index 21fd72df..247a60d8 100644
--- a/src/keepass2android/Resources/values-es/strings.xml
+++ b/src/keepass2android/Resources/values-es/strings.xml
@@ -69,7 +69,7 @@
Por favor habilita el teclado de Keepass2Android en la configuración del sistema.Creando clave de la base de datos…Grupo actual
- Grupo actual: Raíz
+ Grupo actual: RootBase de datosDígitosKeepass2Android NO TIENE TOTAL GARANTÍA; Este es software libre, y puedes redristribuirlo bajo las condiciones de la licencia GPL version 2 o posterior.
@@ -86,15 +86,15 @@
Desactivar desbloqueo con huella dactilarHabilitar desbloqueo completo con huella dactilarHabilitar desbloqueo con huella dactilar para QuickUnlock
- Sensor táctil para desbloqueo de base de datos
- El desbloqueo mediante huella dactilar ha fallado. La clave de descifrado fue invalidada por el sistema operativo Android. Esto suele pasar si se guardó una nueva huella o se cambió la configuración de seguridad. Por favor, desbloquee con contraseña y luego vuelva habilitar el desbloqueo con huella en la configuración de la base de datos.
- Fallo en el desbloqueo de la base de datos: clave compuesta no válida. Desbloqueo de huellas dactilares ha sido desactivado debido a que al parecer la contraseña maestra almacenada ya no es válida. Por favor desbloquee con la contraseña y luego vuelva a habilitar el desbloqueo con la huella dactilar en la configuración de la base de datos.
- Por favor, vuelva a activar el desbloqueo con la huella dactilar para la nueva contraseña maestra.
-
-Esto almacenará tu contraseña maestra en este dispositivo,
-cifrada con las claves de Android Keystore y protegidos
-mediante la autenticación de huellas dactilares. Esto permite desbloquear la base de datos solamente con su huella digital.
- Permite utilizar la autenticación de la huella digital en lugar del código de QuickUnlock. No requiere almacenar información relacionada con su contraseña maestra.
+ Utiliza el sensor táctil para desbloquear la base de datos
+ Falló el Desbloqueo con huella dactilar. La clave de descifrado fue invalidada por el SO Android. Esto sucede generalmente si se inscribió una nueva huella o se cambió la configuración de seguridad.
+ No se pudo desbloquear la base de datos: clave compuesta no válida. El Desbloqueo con huellas dactilares fue desactivado debido a que al parecer ya no es válida la contraseña maestra almacenada.
+ Por favor, vuelve a activar el desbloqueo con la huella dactilar para la nueva contraseña maestra.
+ Por favor, desbloquée con contraseña y luego vuelva a activar Desbloquear con huella en la configuración de la base de datos.
+ Error al inicializar el sensor de huellas dactilares.
+ Esto almacenará tu contraseña maestra en este dispositivo, cifrada con las claves de Android Keystore y protegidos
+mediante la autenticación de huellas dactilares. Esto permite desbloquear la base de datos solamente con la huella dactilar.
+ Permite utilizar la autenticación de la huella dactilar en lugar del código de QuickUnlock. No requiere almacenar ninguna información relacionada con la contraseña maestra.Introduzca el nombre del archivo de base de datosAccedidoCancelar
@@ -106,7 +106,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
CaducidadNombre del GrupoArchivo de clave (opcional)
- Archivo de la clave
+ Archivo de claveModificadoContraseñaGuardar
@@ -115,7 +115,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Nombre de usuarioCampos adicionalesArchivos adjuntos
- Keepass2Android no puede manejar este URL.
+ Keepass2Android no puede utilizar este URL.Error creando grupo.No pudo crearse el directorio padre.Este archivo ya existe.
@@ -126,7 +126,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Base de datos no válida.Ruta no válida.Se necesita un nombre.
- Se necesita una contraseña o un archivo de clave.
+ Se requiere una contraseña o un archivo de clave.Debe seleccionar al menos un tipo de generación de contraseñasLas contraseñas no coinciden.Pasadas debe de ser un número.
@@ -141,8 +141,8 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
confirmar contraseñacontraseña generadaNombre de grupo
- archivo clave
- longitud
+ archivo de clave
+ tamañocontraseñaContraseñanombre
@@ -154,7 +154,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Algoritmo no válido.Formato de base de datos no reconocido.El archivo clave no existe.
- Ningún archivo clave seleccionado.
+ Ningún archivo de clave seleccionado.El archivo clave está vacío.LongitudTamaño de la lista de Grupo
@@ -175,7 +175,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Crear duplicadoMover a otro grupoMover
- Desplazarse al grupo de padres
+ Navegar al grupo padreDonar una cerveza...EditarOcultar Contraseña
@@ -186,7 +186,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
BuscarBúsqueda AvanzadaIr a URL
- Cambiar base de datos…
+ Cambiar base de datosMostrar todos los camposMenosNunca
@@ -216,12 +216,12 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Memoria para Argon 2 (bytes)Paralelismo para Argon 2Nombre de la base de datos
- Nombre de usuario predeterminado para las nuevas entradas
+ Nombre de usuario predeterminado para nuevas entradasGuardando base de datos…Exportando base de datos…Base de datos exportada con éxito!Espacio
- Búsqueda
+ BuscarMostrar contraseñaOrdenado por...Ordenar por nombre
@@ -233,7 +233,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Resultados de búsquedaBuscar enSeleccione otra entrada
- Abrir el grupo deseado, luego presione \"%1$s\"!
+ Abre el grupo deseado y luego presiona \"%1$s\"!Insertar aquíTwofishSubrayar
@@ -247,7 +247,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Gracias a las contribuciones de código de %1$s.Gracias a las contribuciones de diseño del ícono y del diseño gráfico por %1$s.El Plugin de cifrado Twofish para Keepass fue desarrollado por Scott Greenberg y se incluye en KP2A.
- El selector de ficheros de Andorid ha sido desarrollado por Hai Bison
+ android-filechooser fue desarrollado por Hai BisonEl teclado de KP2A se basa en el teclado de Gingerbread de Android Open Source Project y utiliza el código del Administrador de Plugins del teclado hacker por Klaus Weidner.Tenga en cuentaColaboradores
@@ -275,7 +275,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Habilitar QuickUnlock por defectoDetermina si QuickUnlock está habilitado de forma predeterminada o no.Evitar visualización de la base de datos
- Si está activado no se permite realizar pantallazos y no se muestra la miniatura de la app en la lista de las applicaciones recientes.
+ Si se encuentra activado, no se permiten realizar tomas de plantallas y no se muestra el thumbnail de la app en la lista de applicaciones recientes.Ocultar el icono de QuickUnlockQuickUnlock lamentablemente no funciona sin mostrar un icono de notificación. Seleccione esta opción para utilizar un icono transparente.Ocultar icono de QuickUnlock
@@ -284,9 +284,9 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Número máximo de caracteres que se utiliza para la contraseña QuickUnlock.¡Error de QuickUnlock: contraseña incorrecta!Ubicación de archivos adjuntos
- Ubicación donde se guardan los archivos adjuntos.
+ Directorio en donde se guardan los archivos adjuntos.Guardar datos adjuntos
- Por favor seleccione dónde guardar el archivo adjunto.
+ Por favor selecciona la ubicacíon donde guardar el archivo adjunto.Guardar en la tarjeta SDGuardar en la caché y abrirMostrar con visor de imágenes interno
@@ -294,15 +294,15 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
No se puede guardar el archivo adjunto en %1$s.Recordar el texto de búsqueda?¿Quiere guardar el texto de buqueda \"%1$s\" en la entrada seleccionada para encontrarlo automáticamente la próxima vez?
- ¡Formato de fecha/hora no válida para establecer fecha de caducidad!
+ ¡Formato de fecha/hora inválida para establecer fecha de caducidad!Se requiere un nombre por cada entrada.Un nombre de campo no puede utilizarse dos veces (%1$s).Nombre del campoValor del campoCampo protegidoAgregar archivo adjunto...
- Agregar una cadena
- Eliminar cadena adicional
+ Agregar campo adicional
+ Eliminar campo adicional%1$s: bloqueado. QuickUnlock habilitado.%1$s: Desbloqueado.Escriba las credenciales de servidor
@@ -316,37 +316,38 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Bloquear base de datos al salir de la aplicación presionando el botón \"atrás\".Esconder opción de donaciónEste ajuste es para donantes. Está disponible después de usar Keepass2Android por un tiempo sólo.
- Sin donaciones, esta aplicación no existiría y no podría ser mejorada continuamente. Si usted aún no ha donado, por favor considere hacer una donación ahora.
+ Sin donaciones, esta aplicación no existiría y no podría ser mejorada continuamente. Si tu aún no has donado, por favor considera hacer una donación ahora.No solicitar nunca una donación
- No le voy a dar un céntimo o ya he donado. No solicite una donación, ni en el cumpleaños del autor.
+ No le voy a dar un céntimo o ya he donado. No solicitar una donación, ni en el cumpleaños del autor.Caché de base de datos
- Mantiene una copia de los archivos de base de datos remota en el directorio de caché de la aplicación. Esto permite utilizar bases de datos remotos fuera de línea.
+ Mantiene una copia de los archivos de base de datos remota en el directorio del caché de la aplicación. Esto permite utilizar bases de datos remotas sin conexión a internet.Certificados SSL
- Definir el comportamiento cuando falla la validación de un certificado. Nota: puede instalar certificados en su dispositivo si la validación falla!
+ Definir el comportamiento cuando falla la validación de un certificado. Nota: puedes instalar certificados en tu dispositivo si la validación falla!¿Limpiar Cache?Esto borrará todos los archivos de base de datos en caché. ¡Se perderán los cambios que hizo estando fuera de línea que todavía no se ha sincronizado! ¿Continuar?Comprobar modificacionesCompruebe si el archivo fue modificado externamente antes de guardar los cambios.Buscar UUIDs duplicados
- Verificar si el archivo con la base de datos esta corrupto por tener varias entradas con el mismo ID. Esto puede producir un comportamiento inesperado.
+ Verificar si el archivo con la base de datos está corrompido por tener multiples entradas con el mismo ID. Esto puede producir comportamientos inesperados.Notificaciones del portapapelesHacer accesible el nombre de usuario y contraseña a través de la barra de notificación y el portapapeles ¡Cuidado con los sniffers!
- notificaciones por separado
- Mostrar notificaciones separados para copiar el nombre del usuario y palabra clave al portapapeles y para activar el teclado.
+ Separar notificaciones
+ Mostrar notificaciones por separado para copiar el nombre del usuario y palabra clave al portapapeles y para activar el teclado.Servicio de accesibilidad AutoFill
+ Servicio de autocompletadoNotificación de teclado KP2AHacer toda la entrada accesible a través del teclado de KP2A (recomendado).Cambiar TecladoAbrir diálogo de selección de teclado cuando la entrada este disponible a través del teclado KP2A después de una búsqueda desde el navegador.
- Teclado Auto-intercambiable
- Automáticamente cambia al teclado de KP2A cuando una entrada esté disponible. Esto requiere del plugin KeyboardSwap o de un dispositivo con acceso Root y la app Secure Settings con System+.
+ Teclado auto-intercambiable
+ Automáticamente cambia al teclado de KP2A cuando una entrada está disponible. Esto requiere del plugin KeyboardSwap o de un dispositivo con acceso Root y la app Secure Settings con System+. Instalar el plugin KeyboardSwapEste plugin permite cambiar automáticamente al teclado de KP2A sin Root. Requiere ADB. Cambio automático solo después de busquedaSólo cambiar automáticamente al teclado de KP2A después de utilizar la función Compatir URL (pero no cuando abrir la introducción de datos de otra forma)Volver al teclado anteriorVolver al teclado anterior si no se abre ninguna introducción de datos.
- Icono de notificación mientras desbloqueado
+ Icono de notificación durante el desbloqueadoMostrar una notificación en curso mientras la base de datos está desbloqueada.Pre-cargar archivo de base de datosEmpezar a descargar del archivo de base de datos durante la entrada de contraseña.
@@ -356,7 +357,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
RenombrarError al agregar el archivo adjunto.Papelera de reciclaje
- ¿Desea eliminar esta entrada de forma permanente? Presione No para mover a la Papelera de reciclaje.
+ ¿Deseas eliminar esta entrada de forma permanente? Presiona No para mover a la Papelera de reciclaje.¿Desea eliminar este grupo de forma permanente? Presione No para reciclar.¿Desea eliminar permanentemente los elementos seleccionados? Presione No para reciclar.¿Desea eliminar esta entrada de forma permanente?
@@ -364,7 +365,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
¿Desea eliminar permanentemente los elementos seleccionados?¿Borrar permanentemente?¿Volver a cargar el archivo?
- El archivo que está actualmente abierto fue modificado por otro programa. ¿Desea la recarga?
+ El archivo que está actualmente abierto fue modificado por otro programa. ¿Deseas recargarlo?¿Realmente desea descartar los cambios realizados? (El botón Guardar se encuentra en la parte superior del formulario.)¿Descartar cambios?Sugerir o votar para mejoras
@@ -376,7 +377,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Eliminando grupo…Eliminando elementos…Estableciendo contraseña…
- Deshaciendo cambios…
+ Descartando cambios…Transformación de llave maestra…Decodificando base de datos…Análisis de base de datos…
@@ -387,15 +388,15 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
Si, combinarNo, sobreescribirTrabajar sin conexión
- Trabajar en línea
- Evitar cualquier tráfico de red usando la copia local del archivo. Los cambios se almacenan en la memoria local sólo y sólo se cargarán cuando se vuelva al modo en línea.
+ Trabajar con conexíon
+ Evitar cualquier tráfico de red usando la copia local del archivo. Los cambios se almacenan en la memoria local y se cargarán cuando se vuelva al modo con conexión.Trabajar sin conexión.Sincronización de base de datos en caché…Descargando archivo remoto…Cargando archivo…Restaurando archivo remoto…Los archivos están sincronizados.
- Base de datos sincronizada correctamente!
+ ¡Base de datos sincronizada correctamente!Comprobando la base de datos por si hay cambios…No se pudo salvar al remoto: %1$s. Guarde de nuevo o utilice el menú Sincronizar cuando conexión remota esté disponible de nuevo.No se pudo abrir del remoto: %1$s. Se ha cargado el archivo de la memoria caché local. Aun puede hacer cambios en la base de datos y sincronizarlos posteriormente.
@@ -494,6 +495,7 @@ mediante la autenticación de huellas dactilares. Esto permite desbloquear la ba
deshabilitadoEncontrar plug-ins en líneaámbitos
+ no habilitado%1$s está solicitando credenciales para %2$s.%1$s está solicitando credenciales. Por favor, seleccionar una entrada.Habilitado
@@ -837,7 +839,7 @@ Publicación inicialNunca
- Base de datos de KeePass 2 (.kdbx)
+ Base de datos KeePass 2 (.kdbx)KeePass 2 XML (no encriptado) (.xml)KeePass CSV (no encriptado) (.csv)
@@ -857,7 +859,7 @@ Publicación inicialCifrado explícito (FTP sobre TLS, FTPS)
- No recordar el nombre de usuario y contraseña
+ No recordaré nombre de usuario y contraseñaRecordar sólo el nombre de usuarioRecordar nombre de usuario y contraseña
@@ -876,4 +878,9 @@ Publicación inicialAsegúrese de que esto funciona en su dispositivo y si no es así, use el teclado incorporado.Descripción proporcionada por el plugin:
+ Keepass2Android soporta la función de Autocompletado de Android pero parece que no lo has habilitado aún.
+ Activar Autocompletado
+ Mostrar ayuda de Autocompletado
+ Completar con Keepass2Android
+ No se pudo asociar el dominio web %1$s con la app %2$s
diff --git a/src/keepass2android/Resources/values-fi/strings.xml b/src/keepass2android/Resources/values-fi/strings.xml
index 9236e735..a96045aa 100644
--- a/src/keepass2android/Resources/values-fi/strings.xml
+++ b/src/keepass2android/Resources/values-fi/strings.xml
@@ -7,13 +7,13 @@
Keepass2Android on salasanojen hallintaohjelma, jolla voit katsella ja muokata KeePass 2.x tietokantoja Androidilla.Käyttöliittymä perustuu Brian Pellinin kehittämään KeepassDroid-porttaukseen. Tietokantatoimintojen lähdekoodi perustuu Dominik Reichlin KeePass-sovellukseen. Android robot on kopioitu tai muokattu Googlen jakamista julkaisuista ja sitä käytetään Creative Commons 3.0 Attribution -lisenssissä kuvattujen ehtojen mukaisesti.SFTP-tuki on toteutettu käyttämällä JCraft, Inc.:in luomaa BSD-lisenssin alaista JSch-kirjastoa.
- Vasara kuvake jonka on luonut John Caserta Noun Projektista. Pingviini-kuvake jonka on luonut Adriano Emerick Noun Projektista. Sulka-kuvake jonka on luonut Jon Testa Noun Projektista. Apple-kuvake jonka on luonut Ava Rowell Noun Projektista. Kuva kuvake on
+ Vasara-kuvake jonka on luonut John Caserta, Noun Projektista. Pingviini-kuvake jonka on luonut Adriano Emerick, Noun Projektista. Sulka-kuvake jonka on luonut Jon Testa, Noun Projektista. Apple-kuvake jonka on luonut Ava Rowell, Noun Projektista. Kuva kuvakkeesta on
osoitteesta https://icons8.com/icon/5570/Picture.HyväksyÄlä hyväksyLisää merkintäMuokkaa merkintää
- Luo merkintä URL:lle
+ Luo URL-merkintäLisää ryhmäLisää ryhmäMuokkaa ryhmää
@@ -23,9 +23,9 @@ osoitteesta https://icons8.com/icon/5570/Picture.KP2AKeepass2Android OfflineKP2A Offline
- Aikakatkaisu
+ Sovelluksen aikakatkaisuAika, jonka jälkeen tietokanta lukkiutuu automaattisesti jos ohjelmaa ei käytetä.
- Tapa prosessi
+ Lopeta sovelluksen prosessiSulje-painikeNäytä painike \"Tapa prosessi\" (vainoharhaisille käyttäjille)Sovellus
@@ -62,8 +62,8 @@ osoitteesta https://icons8.com/icon/5570/Picture.Leikepöytä tyhjennetty.Leikepöydän aikakatkaisuViive ennen kopioidun käyttäjänimen tai salasanan poistamista leikepöydältä
- Valitse kopioidaksesi käyttäjänimen leikepöydälle
- Valitse kopioidaksesi salasanan leikepöydälle
+ Valitse kopioidaksesi käyttäjänimi leikepöydälle
+ Valitse ja kopioi salasana leikepöydälleMerkintä on saatavana KP2A näppäimistölläon saatavillaNäppäimistön valinta -ikkunaa ei voitu avata. Valitse näppäimistö manuaalisesti.
@@ -88,8 +88,6 @@ osoitteesta https://icons8.com/icon/5570/Picture.
Ota käyttöön täysi sormenjälkiavausOta käyttöön pika-avaus sormenjäljelläKosketa sormenjälkitunnistinta avataksesi tietokannan
- Sormenjälkiavaus epäonnistui. Android-käyttöjärjestelmä ei hyväksynyt sormenjälkeä. Tämä tapahtuu yleensä silloin, kun uusi sormenjälki on lisätty, tai turvallisuusasetuksia on muutettu. Ole hyvä ja avaa tietokanta salasanallasi, ja ota sormenjälkiavaus uudelleen käyttöön tietokanta-asetuksista.
- Tietokannan avaus epäonnistui: virheellinen yhdistelmäavain. Sormenjälkitunnistus on poisttettu, koska ilmeisesti tallennettu pääsalasana ei ole enää voimassa. Ole hyvä ja avaa tietokanta salasanallasi ja ota sormenjälkiavaus uudelleen käyttöön tietokanta-asetuksista.Ole hyvä ja ota sormenjälkitunnistus käyttöön uudelle pääsalasanalle.
Tämä tallentaa pääsalasanasi laitteeseen,
@@ -137,7 +135,7 @@ osoitteesta https://icons8.com/icon/5570/Picture.Kirjoita Pituus-kenttään positiivinen kokonaislukuTiedostoa ei löydy.Tiedostoselain
- Generoi salasana
+ Luo salasanaRyhmämuistiinpanotVahvista salasana
@@ -336,6 +334,7 @@ osoitteesta https://icons8.com/icon/5570/Picture.
Erilliset ilmoituksetNäytä erilliset ilmoitukset kun käyttäjätunnus ja salasana kopioidaan leikepöydälle ja aktivoitaessa näppäimistö.Automaattinen täyttö esteettömyyspalvelu
+ Automaattitäyttö-palveluKP2A-näppäimistön ilmoitusSalli koko merkinnän syöttäminen KP2A-näppäimistön kautta (suositus).Vaihda näppäimistö
@@ -497,6 +496,7 @@ osoitteesta https://icons8.com/icon/5570/Picture.
ei käytössäEtsi liitännäisiä verkostaKäyttöalueet
+ ei käytössä%1$s pyytää tunnuksia merkinnälle %2$s.%1$s pyytää tunnuksia. Valitse merkintä.Käytössä
@@ -863,4 +863,6 @@ Suojelee sinua Leikepöytään perustuvalta salasana sniffaukselta (Poista vanha
Varmista että tämä toimii järjestelmässäsi ja harkitse sisäänrakennetun näppäimistön käyttöä, jos se ei toimi.Laajennuksen antama kuvaus:
+ Ota automaattitäyttö käyttöön
+ Täytä Keepass2Androidilla
diff --git a/src/keepass2android/Resources/values-fr/strings.xml b/src/keepass2android/Resources/values-fr/strings.xml
index 6a78fb63..6cfaa562 100644
--- a/src/keepass2android/Resources/values-fr/strings.xml
+++ b/src/keepass2android/Resources/values-fr/strings.xml
@@ -87,8 +87,6 @@
Activer le déverrouillage par empreinte digitaleActiver le déverrouillage par empreinte digitale pour QuickUnlockCapteur tactile pour déverrouiller la base de données
- Le déverrouillage de l\'empreinte digitale a échoué. La clé de décryptage a été invalidée par Android OS. Cela se produit généralement si une nouvelle empreinte a été inscrit ou si les paramètres de sécurité ont été changés. S\'il vous plaît débloquer avec votre mot de passe, puis réactiver le déverrouillage d\'empreintes digitales dans les paramètres de base de données.
- La déverrouillage de la base de données a échoué : clé composite non valide. Le déverrouillage de l\'empreinte digitale a été désactivé car apparemment le mot de passe stocké n\'est plus valide. S\'il vous plaît débloquer avec votre mot de passe, puis réactiver le déverrouillage d\'empreintes digitales dans les paramètres de base de données.Veuillez ré-activer le déverrouillage d\'empreintes digitales pour le nouveau mot de passe maître.
Cela va stocker votre mot de passe maître sur cet appareil, chiffré avec Android Keystore et protégé à l\'aide de l\'authentification d\'empreintes digitales. Cela permet de déverrouiller votre base de données uniquement avec vos empreintes digitales.
diff --git a/src/keepass2android/Resources/values-gl-rES/strings.xml b/src/keepass2android/Resources/values-gl-rES/strings.xml
index a8c3a054..39111ba1 100644
--- a/src/keepass2android/Resources/values-gl-rES/strings.xml
+++ b/src/keepass2android/Resources/values-gl-rES/strings.xml
@@ -86,8 +86,6 @@
Habilitar desbloqueo completo con pegada dixitalHabilitar desbloqueo con pegada dixital para QuickUnlockToque o sensor para desbloquear a base de datos
- Fallou o desbloqueo por pegada dixital. A clave de descifrado foi invalidada por Android. Isto pode ocorrer se se rexistrou unha nova pegada ou se modificarou a configuración de seguridade. Desbloquee co seu contrasinal e volva a habilitar o desbloqueo por pegada dixital na configuración da base de datos.
- Fallou o desbloqueo da base de datos: clave composta non válida. O desbloqueo por pegada dixital foi deshabilitado, probablemente porque o contrasinal maestro xa non é válido. Desbloquee co seu contrasinal e volva a habilitar o desbloqueo por pegada dixital na configuración da base de datos.Volva a habilitar o desbloqueo por pegada dixital para o novo contrasinal mestre.Isto gardará o seu contrasinal mestre no dispositivo, encriptado co Android Keystore e protexido por autenticación de pegada dixital. Permítelle desbloquear a base de datos tan só ca súa pegada dixital.Permite o uso da autenticación con pegada dixital no canto do seu código QuickUnlock. Non require a almacenaxe de ningunha información relacionada co seu contrasinal mestre.
diff --git a/src/keepass2android/Resources/values-hr-rHR/strings.xml b/src/keepass2android/Resources/values-hr-rHR/strings.xml
index d99f2dd3..64611e64 100644
--- a/src/keepass2android/Resources/values-hr-rHR/strings.xml
+++ b/src/keepass2android/Resources/values-hr-rHR/strings.xml
@@ -87,9 +87,11 @@
Omogući potpuno otključavanje pomoću otiska prstaOtključaj s otiskom prsta za QuickUnlockDodirnite senzor otključavanja
- Otključavanje s otiskom prsta nije uspjelo. Android sustav je poništio ključ za dešifriranje. To se obično događa kada je dodan novi otisak prsta ili su promijenjene sigurnosne postavke. Otključajte lozinkom i ponovno uključite otvaranje otiska prsta u postavkama baze podataka.
- Otključavanje baze podataka nije uspjelo: nevažeći kompozitni ključ. Otključavanje otiskom prsta nije bilo omogućeno jer očigledno da pohranjena glavna lozinka više ne vrijedi. Otključajte lozinkom i ponovno omogućite otključavanje otiskom prsta u postavkama baze podataka.
+ Otključavanje otiskom prsta nije uspjelo. Android OS poništio je ključ za dešifriranje. To se obično događa ako je novi otisak prsta bio upisan ili su sigurnosne postavke promijenjene.
+ Otključavanje baze podataka nije uspjelo: nevažeći kompozitni ključ. Otključavanje otiskom prsta nije bilo omogućeno jer očigledno je da pohranjena glavna lozinka više ne vrijedi. Ponovno omogućite otključavanje otiskom prsta za novu glavnu lozinku.
+ Otključajte lozinkom i ponovno omogućite Otključavanje otiskom prsta u postavkama baze podataka.
+ Inicijaliziranje senzora otiska prsta nije uspjelo. To će pohraniti Vašu glavnu lozinku na ovom uređaju, šifrirano pomoću Android Keystore i zaštićena otiskom prsta. Omogućuje otključavanje baze podataka samo pomoću otiska prsta.Omogućuje upotrebu otiska prsta umjesto QuickUnlock koda. Ne pohranjuje nikakve informacije vezane uz glavnu lozinku.Unesite naziv datoteke baze podataka
@@ -331,6 +333,7 @@
Odvoji obavijestiPrikaži zasebne obavijesti za kopiranje korisničkog imena i zaporke u međuspremnik i aktiviranje tipkovnice.Usluga pristupačnosti za automatsko popunjavanje
+ Usluga automatskog popunjavanjaObavijest KP2A tipkovniceOmogući potpuni unos putem KP2A tipkovnice (preporučeno).Promjena tipkovnice
@@ -387,7 +390,7 @@
Radi na mrežiKoristite lokalnu kopiju baze podataka kako biste izbjegli mrežni promet. Promjene se spremaju lokalno i nisu prenesene dok se mrežni način ne aktivira.Izvanmrežni način.
- Usklađivanje baze podataka spremljene u memoriju…
+ Sinkronizacija baze podataka spremljene u memoriju…Preuzimanje udaljene datoteke…Prijenos datoteke…Vraćanje udaljene datoteke…
@@ -403,6 +406,56 @@
Nisu pronađene izmjene.Ažurirana pomoćna datoteka OTP spremljena u memoriji: brojač na poslužitelju bio je veći.Ažurirana daljinska pomoćna datoteka OTP: lokalni brojač bio je veći.
+ Sinkroniziranje OTP pomoćne datoteke…
+ datoteka baze podataka
+ OTP pomoćna datoteka
+ Dogodila se pogreška:
+ Baza podataka je oštećena: Pronađeni su duplikati ID-ova. (Jeste li spremili s Minikeepassom?) Molimo ponovno uvezite podatke u novu bazu pomoću Keepass 2 za PC i odaberite \'Kreiraj nove ID-eve\'.
+ Tu poruku o pogrešci možete onemogućiti u Postavke/Postavke aplikacija/Upravljanje datotekama/Provjeri duplikate UUID-ova. Imajte na umu da možete doživjeti neočekivano ponašanje. Preporuča se popravak baze podataka.
+ Sinkronizacija baze podataka…
+ Grupu nije moguće premjestiti u ovu grupu.
+ Danas je Oktoberfest! Ako vam se sviđa Keepass2Android: ne bi li danas bio dobar dan da me počastite pivom?
+ 10. svibnja? Moj je rođendan! Ako vam se sviđa ova aplikacija, zašto mi ne biste poslali rođendanske čestitke uz mali dar? To bi me doista usrećilo! :-)
+ O, propustili ste moj rođendan 10. svibnja! Ako vam se sviđa ova aplikacija, zašto mi ne biste poslali rođendanske čestitke i mali rođendanski poklon? Još nije prekasno da me usrećite! :-)
+ Reci mi više!
+ Ne, toliko mi se ne sviđa
+ Unesite podatke za prijavu na WebDav:
+ URL mape ili datoteke (npr: mycloud.me.com/webdav/)
+ Unesite podatke za prijavu OwnCloud:
+ OwnCloud URL (primjer: owncloud.me.com)
+ host (primjer: 192.168.0.1)
+ port
+ Inicijalni direktorij (opcionalno):
+ Unesite podatke za prijavu SFTP:
+ Unesite podatke za prijavu FTP:
+ Odaberite vrstu pohrane:
+ Lokalna datoteka
+ Preuzmite od aplikacije treće strane
+ Pošaljite aplikaciji treće strane
+ FTP
+ HTTP (WebDav)
+ HTTPS (WebDav)
+ OwnCloud
+ Dropbox
+ Dropbox (KP2A mapa)
+ Ako ne želite dati KP2A puni pristup svom Dropboxu, možete odabrati ovu opciju. Tražit će samo pristup mapi Apps/Keepass2Android. To je posebno pogodno prilikom izrade nove baze podataka. Ako već imate bazu podataka, kliknite ovu opciju za stvaranje mape, a zatim stavite datoteku unutar mape (s računala) te ponovo odaberite ovu opciju za otvaranje datoteke.
+ Google Drive
+ OneDrive
+ SFTP (SSH prijenos datoteka)
+ Birač datoteka sustava
+ Inicijalizacija pristupa datotekama
+ Lokacija baze podataka
+ Svoju bazu podataka možete pohraniti lokalno na uređaju sa sustavom Android ili u oblaku (inačica koja ima pristup mrežom). Keepass2Android omogućuje dostupnost baze podataka čak i ako ste izvan mreže. Budući da je baza podataka sigurno kodirana AES 256 bitnom enkripcijom, nitko neće moći pristupiti Vašim lozinkama osim vas. Preporučujemo odabir Dropboxa: dostupan je na svim vašim uređajima, pa čak i sigurnosne kopije prethodnih verzija datoteka.
+ Odaberite gdje želite pohraniti bazu podataka:
+ Promijeni lokaciju
+ Ako je omogućeno, Keepass2Android ostaje raditi u pozadini čak i kada je baza podataka zaključana. To omogućuje kasnije otključavanje baze podataka samo s kratkim dijelom glavne lozinke.
+ Glavna lozinka
+ Vaša baza podataka je šifrirana lozinkom koju unesete ovdje. Odaberite jaku lozinku kako bi baza podataka bila sigurna! Savjet: Izradite rečenicu ili dvije i upotrijebite prva slova riječi kao lozinku. Uključite interpunkcijske znakove.
+ Odaberite glavnu lozinku za zaštitu Vaše baze podataka:
+ Ključna datoteka
+ Ključna datoteka u osnovi je zaporka pohranjena u datoteci. Ključne datoteke obično su jače od glavnih zaporki, jer ključ može biti puno složeniji; ali ih je također teže čuvati u tajnosti. Ako pohranite svoju bazu podataka u oblaku, ne pohranjujte ključnu datoteku! To bi ga učinilo potpuno beskorisnim! Važno: Ne mijenjajte sadržaj ključne datoteke nakon stvaranja baze podataka!
+ Odaberite želite li upotrijebiti ključnu datoteku uz glavnu lozinku:
+ Koristi ključnu datotekuPogreška prilikom dodavanja ključne datoteke!Učitavanje pomoćne datoteke OTP…Unesite sljedeće jednokratne zaporke (OTPs). Prijeđite prstom po Yubikey NEO na stražnjoj strani uređaja da bi unijeli preko NFC-a.
@@ -421,6 +474,227 @@
Spremanje pomoćne OTP datoteke…Odgovor na izazov nije točan.Nije moguće učitati pomoćnu datoteku za izazov!
+ Koristite KeeChallenge dodatak u KeePass 2.x (PC) da biste konfigurirali svoju bazu podataka za upotrebu challenge-response!
+ Pogreška prilikom ažuriranja OTP pomoćne datoteke!
+ Naziv TOTP Seed polja
+ Ako koristite Keepass 2 dodatak \"TrayTotp\" s ne-zadanim postavkama, ovdje unesite ime seed polja prema postavkama na računalu.
+ Naziv TOTP polja postavki
+ Ovdje unesite ime polja za postavke TrayTotp.
+ TrayTotp
+ Zapisnik za uklanjanje pogrešaka
+ Upotrijebite datoteku zapisnika
+ Zapiši izlaz aplikacije u lokalnu datoteku zapisnika
+ Pošalji zapisnik o greškama...
+ Učitavanje…
+ Dodaci
+ Ime paketa:
+ Opis (nije potvrđen):
+ Autor (nije potvrđen):
+ omogućeno
+ onemogućeno
+ Pronađite dodatke online
+ Opsezi
+ nije omogućen
+ %1$s traži vjerodajnice za %2$s.
+ %1$s traži vjerodajnice. Molimo odaberite unos.
+ Omogućeno
+ Obavijesti o akcijama baze podataka
+ Dodatak će biti obaviješten kada se baza podataka otvori, zatvori ili spremi.
+ Trenutni podaci o unosu
+ Dodatak će primiti sve podatke o trenutnom unosu u bazu podataka i moći će ponuditi radnje i izmijeniti njegov prikaz.
+ Upitajte svoje vjerodajnice
+ Dodatku će biti dopušteno da upita vjerodajnice povezane s vlastitim programskim paketom.
+ Upitajte vjerodajnice
+ Dodatku će biti dopušteno tražiti vjerodajnice za namjerno odabrane web stranice ili aplikacije.
+ Dohvati više vrsta pohrane
+ Upozorenje: Provjera certifikata poslužitelja nije uspjela: %1$s. Instalirajte odgovarajući root certifikat na svoj uređaj ili pogledajte postavke!
+ Upozorenje: Provjera certifikata poslužitelja nije uspjela. Instalirajte odgovarajući root certifikat na svoj uređaj ili pogledajte postavke!
+ Odaberite format datoteke
+ Oprosti! Keepass2Android je ubio Android OS! Zbog sigurnosnih razloga, Keepass2Android nije zadržao odabrane vjerodajnice na disku pa morate ponovo otvoriti bazu podataka. Napomena: Ovo bi se trebalo dogoditi vrlo rijetko. Ako se dogodi, molim Vas, pošaljite poruku na crocoapps@gmail.com.
+ Datoteka je privremeno dostupna za Keepass2Android.
+ Odabrana datoteka je samo za čitanje.
+ Odabrana datoteka je samo za čitanje za Keepass2Android zbog ograničenja na Androidu 4.4+.
+ Da biste ju koristili, morate ju kopirati na drugo mjesto.
+ Da biste ju uređivali, morate ju kopirati na drugo mjesto.
+ Kliknite OK (U redu) da biste odabrali mjesto na kojem biste trebali kopirati datoteku.
+ Baza podataka je samo za čitanje
+ Keepass2Android otvorio je trenutnu bazu podataka u načinu rada samo za čitanje.
+ Izgleda da ste otvorili datoteku iz vanjske aplikacije. Taj način ne podržava uređivanje. Ako želite izmijeniti bazu podataka, zatvorite bazu podataka i odaberite Promijeni bazu podataka. Zatim otvorite datoteku s jedne od dostupnih opcija ako je moguće.
+ Datoteka je samo za čitanje. Uklonite navedeni atribut da biste unijeli izmjene u bazu podataka.
+ Uređivanje nije moguće zbog ograničenja uvedenih u Android KitKat. Ako želite izmijeniti bazu podataka, zatvorite bazu podataka i odaberite Promijeni bazu podataka. Zatim otvorite datoteku pomoću alata za odabir datoteka sustava.
+ Dodaj ikonu iz datoteke...
+ Kopiranje datoteke...
+ Kopiraj
+ Standardni unos
+ Predlošci
+ Identifikacijska kartica
+ Ime
+ Mjesto izdavanja
+ Datum izdavanja
+ E-pošta
+ Adresa e-pošte
+ Bežična mreža
+ Sigurna bilješka
+ SSID
+ Broj
+ CVV
+ PIN
+ Vlasnik kartice
+ Kreditna kartica
+ Članstvo
+ Popis promjena
+ Dodaj predloške?
+ Keepass2Android sadrži ulazne predloške za račune e-pošte, lozinke bežičnih mreža, sigurne bilješke i još mnogo toga. Želite li ih dodati u svoju bazu podataka? Ako odaberete Ne, možete ih kasnije dodati u postavkama baze podataka.
+ Dodaj predloške u bazu podataka
+ Imajte na umu! Ovo je verzija prije puštanja glavne i može sadržavati greške! Ako doživite nešto neočekivano, obavijestite me (na Google+ beta testerskoj grupi ili putem e-pošte).
+ Nastavi
+ URI koji ste unijeli ne izgleda kao naziv datoteke. Jeste li sigurni da je to važeća datoteka?
+ Nevažeći kompozitni ključ! Molim te pokušaj ponovno.
+ Nevažeći kompozitni ključ! Pokušajte sljedeće korake da biste otključali bazu podataka:\n
+
+• Provjerite jeste li unijeli ispravnu lozinku. Upotrijebite ikonu oka kako biste otkrili unesenu zaporku.\n
+• Provjerite jeste li odabrali ispravnu vrstu zaporke. Provjerite odgovara li tipu koji se koristio prilikom izrade baze podataka.\n
+• Provjerite jeste li odabrali ispravnu datoteku baze podataka.
+
+
+Datoteka je oštećena. \n
+Evo nekoliko savjeta koji bi Vam mogli pomoći u dijagnosticiranju problema:\n
+
+• Ako ste kopirali datoteku preko USB-a (MTP-način rada), pokušajte ponovno pomoću alata poput MyPhoneExplorer. MTP skraćuje datoteke u određenim slučajevima.\n
+• Ako ne možete otvoriti datoteku s istog mjesta na računalu, vrlo je vjerojatno da je datoteka doista oštećena. Upotrijebite sigurnosnu kopiju baze podataka. Ako pretpostavite da je Keepass2Android oštetio datoteku, kontaktirajte podršku.\n
+• Ako još uvijek možete otvoriti datoteku na računalu, obratite se službi za korisnike. Možete je pokušati spremiti s različitim postavkama (npr. nearhiviranu) na računalu i pokušajte ponovno otvoriti pomoću aplikacije Keepass2Android.
+ Keepass2Android: Došlo je do pogreške.
+ Došlo je do neočekivane pogreške prilikom pokretanja programa Keepass2Android. Pomozite nam da to riješimo dopuštajući aplikaciji slanje izvješća o pogrešci.
+ Izvješća o pogreškama nikada neće sadržavati sadržaj Vaše baze podataka ili glavne lozinke. Možete ih onemogućiti u postavkama aplikacije.
+ Omogući
+ Onemogući
+ Pitajte nakon pogreške
+ Pošalji izvješća o pogrešci
+ Prikaži softversku tipkovnicu za unos lozinke kada je skeniranje otiska prsta aktivno.
+
+Verzija 1.04\n
+* Dodana je usluga automatskog popunjavanja za Android 8.0 i novije.\n
+* Nadograđene biblioteke, alati za izradu alata i verzija ciljnog paketa SDK.\n
+
+Verzija 1.03\n
+* Uklonjena je usluga pristupačnosti za automatsko popunjavanje, na zahtjev Googlea. Pogledajte postavke pristupa zaporkama kako biste pronašli dodatak koji replicira prethodnu funkcionalnost.\n
+* Ponovo dodane aplikacije trećih strana kao opcije za pohranu\n
+* Integrirani preglednik slika za pregledavanje privitaka bez premještanja u druge aplikacije\n
+* Nadograđeni OkHttp za rješavanje problema s nekim vezama\n
+* Podrška za KeeTrayTOTP unose, sada podupiru Steam unose\n
+
+Verzija 1.02\n
+* Nekoliko sigurnosnih poboljšanja. Hvala puno za sigurnosno izvješće jean-baptiste.cayrou@thalesgroup.com i vincent.fargues@thalesgroup.com i za njihovu suradnju!\n
+* Podrška za KeyboardSwapPlugin (vidi opcije pristupa lozinki): omogućuje automatski prebacivanje načina unosa ne rootanim uređajima. Hvala Mishaal Rahmanu iz XDA-Developersa za omogućavanje navedenog.\n
+* Popravak usluge pristupačnosti s nedavnim verzijama Chromea\n
+* Popravak nepotrebnog brisanja podataka otiska prstiju\n
+* Popravak manjih rušenja aplikacije\n
+* Ažuriran SDK Dropboxa kako bi se osigurala buduća kompatibilnost\n
+* Uklonjeno je izvješćivanje o pogreškama kroz Xamarin Insights\n
+* Ažurirani alati za izgradnju\n
+
+Verzija 1.01-g\n
+* Popravak rušenja aplikacije prilikom pokušaja izvanmrežnog rada\n
+* Popravak za neispravno kodiranje FTP(S) vjerodajnica\n
+* Popravak rušenja prilikom korištenja OneDrive na starijim Android verzijama\n
+* Prikaz trenutnog vremena na zaslonu unosa\n
+
+Verzija 1.01-d\n
+* Popravak za prikaz OneDrive datoteka\n
+* Dopuštenje za zanemarivanje pogreški certifikata i kada ne uspije provjeru naziva glavnog računala (nije preporučljivo za upotrebu na produkcijskom okruženju)\n
+* Popravak za QuickUnlock kada ponekad ne uspije unatoč ispravnom kodu otključavanja\n
+
+Verzija 0.9.8c\n
+* Popravak za SSL ranjivost u usluzi Microsoft Live SDK (koristi se prilikom pristupa datotekama putem OneDrive-a)\n
+* Popravak bugova: prethodno izdanje sadrži dvije metode unosa (jedna uzrokuje pad sustava)\n
+
+Verzija 1.01\n
+* dodana je podrška za novi KDBX-4 format (kompatibilan s Keepassom 2.35), uključujući Argon2 deriviranje i ChaCha20 šifriranje.\n
+* Ponovno implementiran WebDav način pohrane datoteka, sada omogućuje pregled datoteka i podržava suvremenu enkripciju.\n
+* Ponovo implementiran FTP način pohrane datoteka, sada omogućava pregledavanje datoteka i podržava šifriranje (FTPS).\n
+* Ažuriran OneDrive SDK (prethodno upotrijebljeni Live SDK više nije ažuriran)\n
+* Ažurirana verzija Dropbox SDK-a na verziju 2 (prethodno korišten SDK verzije 1 je obustavljen).\n
+* Dodana je podrška za OwnCloud.\n
+* Zahtjev za dopuštenje za pohranu prije otvaranja lokalnih datoteka
+
+Verzija 1.0.0e\n
+* ispravak otključavanja otiskom prsta na starijim Samsung uređajima s Androidom 6\n
+* dodavanje izvorne podrške za x86 uređaje\n
+* omogućeno sakrivanje softverske tipkovnice tijekom skeniranja otiska prsta\n
+* definirano ažuriranje sustava
+
+Verzija 1.0.0\n
+* Otključavanje otiskom prsta (zahtijeva Android 6.0+ ili Samsung uređaj)\n
+* Dodana je usluga automatskog popunjavanja (zahtijeva Android 5.0 +)\n
+* Dodana je podrška za predloške za unos\n
+* Dodan je izvanmrežni način rada\n
+* Dopušteno kopiranje zapisa\n
+* Automatsko dovršavanje naziva polja\n
+* Dopušteno uklanjanje stavki iz popisa nedavnih datoteka\n
+* Zahtijevanje dozvola kod izvođenja u Androidu 6.0\n
+* Popravci programskih pogrešaka (u ugrađenoj tipkovnicu pri odabiru ikona)\n
+* Uključena opcija za slanje izvješća o pogreškama\n
+* Dodane poruke pomoći na nekoliko točaka\n
+
+Verzija 0.9.9\n
+* Dovršen redizajn korisničkog sučelja. Zahvaljujemo Stefanu Pignatarou (http://www.spstudio.at) za njegovu podršku!\n
+* Omogućeno dodavanje prilagođenih ikona\n
+* Podrška za način rada s više prozora na Samsungovim uređajima\n
+* Povećan zadani broj šifriranja za nove baze podataka\n
+* Provjerite duple ključeve dodatnih polja kako biste izbjegli gubitak podataka\n
+
+Verzija 0.9.9c\n
+* Tamna tema je vraćena\n
+* Možete instalirati druge pakete ikona (drevne ikone sustava Windows dostupne su u trgovini Play)\n
+* Dodano je pitanje potvrde prilikom brisanja elemenata bez koša za smeće\n
+* Popravci programskih pogrešaka(pogrešno prikazivanje OTP tajne, pogrešna ikona aplikacije na nekim mjestima)\n
+
+Verzija 0.9.8b\n
+* Ispravci programskih pogrešaka (spremanje nije uspjelo za neke baze podataka, izvoz na lokalni uređaj koji ne funkcionira, odabir nekih opcija postavljen je u sklopu aplikacije)\n
+
+Verzija 0.9.8\n
+* Podrška za Storage Access Framework (omogućava pisanje na SD karticu i Google disk u KP2A Offline)\n
+* Pokušajte otkriti pogrešan unos korisnika prilikom unosa WebDAV URL-ova (direktorij umjesto datoteke)\n
+* Promijenjen font zaporke\n
+* Dopuštenje za promjenu Dropbox računa\n
+* Ispravljena pogreška: Sada pamti OTP lozinku
+
+Version 0.9.7b\n
+* ažurirani prijevodi\n
+* ispravci grešaka: Font lozinke nedostaje u 0.9.7, sortiranje po imenu nije sortiralo grupe\n
+
+Verzija 0.9.7\n
+* podrška za baze podataka Keepass 1 (kdb) (beta!)\n
+* bolje prebacivanje na prethodnu tipkovnicu (također radi na uređajima koji nisu rootani)\n
+* podrška za KeeChallenge s promjenjivom dužinom izazova\n
+* sprječavanje uzimanja slike zaslona kod zaslona brzog otključavanja i zaslona lozinki\n
+* promijenjen redoslijed sortiranja za Datum promjene (sada silazni)\n
+* ispravci grešaka: Pregled bilješki sada ažuriran ispravno nakon izmjena, pogled Lozinki sada kriju lozinku ispravno (nadamo se) na svim uređajima, ispravljena greška koja je omogućavala dodavanje unosa dvaput, ispravljen problem s prikazivanjem upozorenja duplikata UUID čak i nakon popravljanja baze podataka\n
+
+Verzija 0.9.6\n
+* Omogućite uvoz ključne datoteke i/ili datoteke lokalne baze podataka u interni direktorij aplikacije (pogledajte postavke)\n
+* omogućite različite mogućnosti sortiranja\n
+* poboljšane postavke za automatsko prebacivanje tipkovnice\n
+* ažurirani logotip aplikacije i dizajn obavijesti, Stefan Pignataro (http://www.spstudio.at)\n
+* generator lozinke pamti zadnje postavke\n
+* postavke vidljivosti obavijesti za zaključavani zaslon na Android 5\n
+* sada se briše polje glavne lozinke kada se zatvori aplikacija bez klikanja OK\n
+* otklonjen problem s nedostajućim ulaznim jezicima u postavkama tipkovnice na nekim uređajima\n
+* otklonjen problem s automatskim prebacivanjem tipkovnice na rootanim uređajima\n
+* dodana provjera za korumpirane baze podataka (dvostruki UUID)\n
+* automatsko ponovno učitavanje baze podataka kada otkrije promjenu, rješava sigurnosnu zabrinutost otkrivanja glavne lozinke\n
+* poboljšani izgled male poljske tipkovnice, otklonjen problem teme tipkovnice (zahvaljujući Wiktor Ławski)\n
+
+ Verzija 0.9.5 b> \ n
+Verzija 0.9.5\n
+* Otklonjeni problemi s pregledavanjem datoteka (osobito na Androidu 4.4)\n
+* Otklonjeni problemi s učitavanjem .kdb datoteka (Keepass 1) na Nexusu 5 s Android Lollipopom\n
+* Dodana opcija za sprječavanje snimanja zaslona/prikazivanja aplikacije na popisu najnovijih aplikacija\n
+* Otklonjeni problemi s pohranom datoteka Google diska (redovito izdanje)\n
+* Dopusti ključne datoteke namjernog tipa pohrane (redovito izdanje)\n
+* Ažuriran Dropbox SDK za uključivanje službene sigurnosne zakrpe (redovito izdanje)\n
+* Ažurirani alati za izgradnju --> povećana veličina apk:-(\n
+Obećao sam neke promjene. Doći će s sljedećim izdanjem - ispričavam se. Htio sam objaviti ove bitne ispravke što je prije moguće.Verzija 0.9.4\n
* dodana podrška za dodatke: Pogledajte postavke za dobivanje dodataka!\n
@@ -440,6 +714,53 @@
* dodana opcija za onemogućavanje opcije \"doniraj\"\n
* ikona QuickUnlock sada je skrivena na uređajima Android 4.2+ po zadanim postavkama\n
+
+Verzija 0.9.3 r5\n
+* Uključeni popravci iz Xamarina: Keepass2Android sada je kompatibilan s ART-om na Androidu 4.4.2. Konačno!\n
+* Ispravci programskih pogrešaka: bugovi u sinkronizaciji (prikaz osvježavanja, ispravna provjera promjena na HTTP-u), bugovi na uređajima Android 2.x, bugovi u implementacijama Google diska i OneDrive pohrane, jasan međuspremnik na bliskoj bazi podataka, problemi s prikazom tipkovnice\n
+
+Verzija 0.9.3\n
+* Nova tipkovnica s brojnim poboljšanjima. Pogledajte postavke za prilagodbu.\n
+* Podrška za samo čitanje kdb (Keepass 1 datoteke). Eksperimentalno!\n
+* Dodana SFTP podrška\n
+* Dodano je zaobilazno rješenje za bug u ART-u (Android 4.4.2)\n
+* Ispravci programskih pogrešaka\n
+
+Verzija 0.9.2\n
+* Dodana OTP podrška (kompatibilna s OtpKeyProv dodatkom)\n
+* Integrirana NFC podrška za OTP-ove od YubiKey NEO\n
+* Nekoliko poboljšanja korisničkog sučelja\n
+* Integrirana Keepass 2.24 knjižnica\n
+* Dodana je opcija za ubijanje postupka aplikacije (pogledajte postavke)\n
+* Poboljšana potvrda SSL certifikata\n
+* Popravci programskih pogrešaka\n
+
+Verzija 0.9.1\n
+* Integrirana podrška za SkyDrive (samo za regularno izdanje Keepass2Android)\n
+* Otklonjeni problemi s integracijom Google diska\n
+* Dodana NTLM podrška
+
+Verzija 0.9\n
+* Integrirana podrška za Dropbox i Google disk (čitanje / pisanje baze podataka samo za regularno izdanje Keepass2Android)\n
+* Integrirani prilagođeni preglednik datoteka (temeljen na Androidovom pregledniku datoteka od strane HBA-a)\n
+* Poboljšano sučelje za kreiranje novih baza podataka\n
+* Priloženi prilagođeni font DejaVu Sans Mono za prikazivanje lozinke\n
+* Ispravke programskih pogrešaka
+
+Verzija 0.8.6\n
+* Podrška za Twofish šifru\n
+* Dopuštanje za uređivanja grupa\n
+* Dopusti pomicanje unosa i grupa\n
+* Ikona QuickUnlock može biti transparentna (vidi postavke)\n
+* Ispravke programskih pogrešaka
+
+Verzija 0.8.5\n
+* Daljinske datoteke pohranjuju se u predmemoriju lokalne aplikacije kako biste omogućili izvanmrežnu upotrebu (uključujući uređivanje i naknadnu sinkronizaciju). Pogledajte postavke.\n
+* Ikona obavijesti za vizualizaciju stanja zaključavanja baze podataka (vidi postavke)\n
+* Poboljšano određivanje stanja zaključavanja u nekim situacijama\n
+* Datoteke baze podataka učitavaju se u memoriju dok upisujete svoju lozinku za povećanu brzinu učitavanja (pogledajte postavke)\n
+* Unosi se mogu dodati u root grupu\n
+* Ispravci programskih pogrešaka (rješavanje referentnih polja, problemi s tipkovnicom na talijanskim i kineskim uređajima)Verzija 0.8.4\n
* Vanjske izmjene baza podataka otkrivene su i spojene prilikom spremanja\n
@@ -456,6 +777,26 @@
* Dijaloški odabir tipkovnice automatski se otvara nakon traženja URL-a (vidi postavke)\n
* Znakovi rezervnih polja zamjenjuju se prije kopiranja (podržana je većina rezerviranih mjesta)\n
* manji popravci bugova
+ Verzija 0.8.2\n
+* Podrška za Digest autentifikaciju u WebDAV-u\n
+* Ispravke pogrešaka (upravitelj datotekama, otvoreni URL)
+
+ Verzija 0.8.1\n
+* KP2A Offline i \"Online\" mogu se ponovno instalirati\n
+* Dodani novi prijevodi (hvala svim suradnicima!)
+
+ Verzija 0.8\n
+* Poboljšano korisničko sučelje posebno za Android 4.x uređaje\n
+* Dopusti određenim upraviteljima datoteka odabir postojećih datoteka\n
+* Dodan sigurniji način otvaranja privitaka (putem direktorija u predmemoriji)\n
+* fiksne greške u aktivnosti za uređivanje\n
+* vjerojatno pojava novih grešaka :-)
+
+ Proširena mogućnost za doniranje pive ili nešto drugo
+ Verzija 0.7\n
+* Povećana brzina učitavanja: ključne transformacije sada 10x brže!\n
+* Dodana softverska tipkovnica Keepass2Android: prebacite na ovu tipkovnicu za unos vjerodajnica. Štiti Vas od skeniranja zaporki temeljenih na međuspremnicima (onemogućite stare obavijesti međuspremnika u opcijama)\n
+* Dodana je opcija za darivanje piva ili nešto drugo (vidi izbornik)Verzija 0.6.2\n
* Integracija s uslugom Google Drive/Dropbox/...: upotrebljavajte službenu aplikaciju Google Drive ili Dropbox i otvorite bilo koju datoteku .kdbx. Ovo će sada otvoriti KP2A.\n
* Poboljšan dijalog pretraživanja\n
@@ -469,4 +810,59 @@
\n
Verzija 0.6 \n
Prvotna javna verzija
+
+ 30 sekundi
+ 1 minuta
+ 5 minuta
+ 10 minuta
+ 15 minuta
+ 30 minuta
+ 1 sat
+ Nikad
+
+
+ Baza podataka Keepass 2 (.kdbx)
+ Keepass 2 XML (ne-šifirano) (.xml)
+ Keepass CSV (ne-šifrirano) (.csv)
+
+
+ Mala
+ Srednja
+ Velika
+
+
+ Svjetlo
+ Tamno
+
+ Dizajn
+
+ Nema šifriranja (FTP)
+ Implicitno šifriranje (FTP putem TLS, FTPS)
+ Eksplicitno šifriranje (FTP putem TLS, FTPS)
+
+
+ Nemoj zapamtiti korisničko ime i lozinku
+ Zapamti samo korisničko ime
+ Zapamtite korisničko ime i lozinku
+
+
+ Samo lozinka
+ Lozinka + ključna datoteka
+ Lozinka + OTP
+ Lozinka + OTP tajna (način oporavka)
+ Lozinka + Challenge-Response
+ Lozinka + Challenge-Response tajna (način oporavka)
+
+
+ Zanemari pogreške potvrda certifikata
+ Upozori kada potvrda ne uspije
+ Nemoj prihvatiti nevažeće certifikate
+
+ Provjerite radi li na Vašem sustavu i razmislite o korištenju ugrađene tipkovnice ukoliko ne radi.
+ Opis dostupan pomoću dodatka:
+ Keepass2Android podržava Android značajku automatskog popunjavanja, ali izgleda da je još niste omogućili.
+ Omogući automatsko popunjavanje
+ Prikaži pomoć automatskog popunjavanja
+ Ispuni pomoću Keepass2Android
+ Nije moguće povezati web domenu %1$s s aplikacijom %2$s
diff --git a/src/keepass2android/Resources/values-hu/strings.xml b/src/keepass2android/Resources/values-hu/strings.xml
index 3b8494ea..7d9027dd 100644
--- a/src/keepass2android/Resources/values-hu/strings.xml
+++ b/src/keepass2android/Resources/values-hu/strings.xml
@@ -87,8 +87,6 @@
Ujjlenyomattal való feloldás engedélyezéseUjjlenyomat alapú GyorsFeloldás engedélyezéseÉrintse meg az érzékelőt az adatbázis feloldásához
- Ujjlenyomat feloldása nem sikerült. Visszafejtési kulcsot az operációs rendszer érvénytelenítette. Ez általában akkor történik, ha egy új ujjlenyomat lett regisztrálva vagy megváltoztatta biztonsági beállításokat. Kérjük nyissa meg az adatbázist jelszó segítségével, majd engedélyezze újra az ujjlenyomat alapú feloldást az adatbázisbeállításoknál.
- Az adatbázis feloldása nem sikerült: az összetett kulcs érvénytelen. Ujjlenyomat alapú feloldás le lett tiltva, mert a tárolt főkulcs (jelszó) a jelek szerint már nem érvényes. Használja a főkulcsot az adatbázis feloldásához, majd engedélyezze újra az ujjlenyomat alapú feloldást.Engedélyezze újra az ujjlenyomat alapú feloldást az új főkulccsal (jelszóval).
Ez a funkció le fogja tárolni a főkulcsot (jelszót) az
diff --git a/src/keepass2android/Resources/values-in/strings.xml b/src/keepass2android/Resources/values-in/strings.xml
index 049d81b7..72fbdd47 100644
--- a/src/keepass2android/Resources/values-in/strings.xml
+++ b/src/keepass2android/Resources/values-in/strings.xml
@@ -1,12 +1,11 @@
-
-
Umpan balikLamanKeepass2Android adalah pengatur password yang menyediakan akses membaca/menulis ke database KeePass 2.x pada Android.Antarmuka pengguna didasarkan pada KeepassDroid yang dikembangkan oleh Brian Pellin. Kode untuk operasi database didasarkan pada KeePass oleh Dominik Reichl. Robot android direproduksi atau dimodifikasi dari karya yang dibuat dan dibagi oleh Google dan digunakan sesuai dengan ketentuan yang dijelaskan dalam Lisensi Atribusi Creative Commons 3.0.Dukungan SFTP diimplementasikan menggunakan pustaka JSch di bawah lisensi BSD, dibuat oleh JCraft, Inc.
+ Ikon palu dibuat oleh John Caserta dari proyek kata benda. Ikon penguin adalah buatan dari Adriano Emeric dari sebuah proyek kata benda. Ikon bulu adalah buatan dari Jon Testa dari sebuah proyek kata benda. Ikon apel adalah buatan dari Ava Rowell dari sebuah proyek kata benda. picture ikon adalah dari https://icons8.com/icon/5570/Picture.MenerimaTolakMenambah entri
@@ -86,8 +85,6 @@
Mengaktifkan penuh pembuka sidik jariMengaktifkan pembuka sidik jari untuk PembukaCepatSensor Sentuh untuk membuka basis data
- Pembuka sidik jari gagal. Kunci dekripsi dibatalkan oleh OS Android. Hal ini biasanya terjadi jika sidik jari baru didaftarkan atau pengaturan keamanan berubah. Silahkan membuka dengan kata kunci Anda dan kemudian aktifkan kembali membuka sidik jari di pengaturan basis data.
- Membuka basis data gagal: kunci komposit tidak valid. Pembuka sidik jari dinonaktifkan karena tampaknya sandi tersimpan tidak lagi berlaku. Silahkan membuka dengan password Anda dan kemudian aktifkan kembali membuka sidik jari di pengaturan basis data.Silakan aktifkan kembali pembuka sidik jari untuk sandi utama yang baru. Ini akan menyimpan sandi utama Anda pada perangkat ini, dienkripsi dengan Android Keystore dan dilindungi menggunakan otentikasi sidik jari. Memungkinkan untuk membuka basis data Anda hanya dengan sidik jari. Memungkinkan untuk menggunakan otentikasi sidik jari dari pada kode PembukaCepat. Tidak membutuhkan untuk menyimpan informasi terkait dengan sandi utama Anda.
@@ -285,6 +282,7 @@
Silakan pilih tempat untuk menyimpan lampiran.Simpan ke kartu SDSimpan di tembolok dan buka
+ Tampilan dengan penampilan gambar internalSimpan file ke %1$s.Tidak bisa menyimpan lampiran ke %1$s.Ingat teks pencarian?
@@ -329,6 +327,9 @@
Hati-hati terhadap pengintip kata sandi!Pemberitahuan terpisahTampilkan pemberitahuan terpisah untuk menyalin nama pengguna dan kata sandi ke papan klip dan aktifkan papan ketik.
+ Otomatis mengisi Layanan-Aksesibilitas
+ KP2A pemberitahuan keyboard
+ Membuat entri dapat diakses penuh melalui keyboard KP2A (disarankan).Berpindah keyboardBuka dialog pemilih papan ketik saat isian tersedia melalui papan ketik KP2A setelah melakukan pencarian dari browser.Ganti papan kunci otomatis
@@ -443,4 +444,412 @@ Hati-hati terhadap pengintip kata sandi!
Rubah lokasiJika diaktifkan, Keepass2Android akan tetap berjalan di belakang layar bahkan ketika basis data terkunci. hal ini memungkinkan pembukaan basis data nanti hanya menggunakan bagian pendek dari password utama.Password utama
+ Database anda dienkripsi dengan password yang anda masukkan disini. pilih sebuah pasword yang kuat untuk menjaga Database tetap aman! Tip: memuat naik sebuah atau dua buah kalimat dan gunakan huruf pertama dari kata-kata sebagai kata sandi. Sertakan tanda baca.
+ Pilih kata sandi utama untuk melindungi database Anda:
+ Berkas kunci
+ Berkas kunci pada dasarnya adalah kata sandi yang tersimpan dalam sebuah berkas. berkas kunci adalah lebih kuat daripada kata sandi utama, karena kuncinya dapat menjadi jauh lebih rumit; namun itu juga sulit untuk menjaga rahasia mereka. jika anda menyimpan database anda di cloud, jangan menyimpan berkas kunci disana juga! ini akan membuat itu sama sekali tidak berguna! penting: jangan mengubah isi dari berkas kunci setelah membuat database!
+ Pilih apakah Anda ingin menggunakan berkas kunci selain kata sandi utama Anda:
+ Gunakan berkas kunci
+ Kesalahan saat menambahkan berkas kunci!
+ Memuat berkas bantu OTP…
+ Masukkan kata sandi One-time-password berikutnya (OTPs). Gesek NEO Yubikey Anda di bagian belakang perangkat Anda untuk masuk melalui NFC.
+ OTP%1$d
+ Tidak dapat menemukan aplikasi yang dapat menangani tantangan tersebut. Harap instal Yubichallenge dari Google Play.
+ Tidak bisa memuat file OTP tambahan!
+ Silakan gunakan plugin OtpKeyProv di KeePass 2.x (PC) untuk mengkonfigurasi database Anda untuk digunakan dengan OTPs!
+ Silahkan pilih database dulu. OTP dibuang karena alasan keamanan.
+ OTP discarded: All OTPs already entered!
+ Silahkan tutup database dulu. OTP dibuang.
+ (Satu atau beberapa OTP sudah tersedia)
+ Rahasia OTP (misal 01 23 ab cd...)
+ Kesalahan mengurai rahasia OTP!
+ Gagal membuat kunci OTP! Pastikan Anda telah memasukkan OTPs yang benar.
+ Kesalahan memperbarui file bantu OTP!
+ Menyimpan file OTP tambahan…
+ Respons tantangannya salah.
+ Tidak dapat memuat berkas tantangan tambahan!
+ Silakan gunakan plugin KeeChallenge di KeePass 2.x (PC) untuk mengkonfigurasi database Anda untuk digunakan dengan respon tantangan!
+ Kesalahan memperbarui berkas bantu OTP!
+ Nama bidang benih TOTP
+ Jika Anda menggunakan plugin Keepass 2 \"TrayTotp\" dengan pengaturan non-standar, masukkan nama berkas untuk bidang benih di sini sesuai dengan pengaturan pada PC.
+ Nama bidang TOTP pengaturan
+ Masukkan nama bidang bidang pengaturan untuk TrayTotp di sini.
+ TrayTotp
+ Log-File untuk Debugging
+ Gunakan berkas log
+ Tuliskan hasil aplikasi ke berkas log lokal
+ Kirim log debug...
+ Memuat…
+ Plug-ins
+ Nama paket:
+ Deskripsi (tidak diverifikasi):
+ Penulis (tidak diverifikasi):
+ diaktifkan
+ cacat
+ Temukan plug-in secara online
+ Lingkaran
+ %1$s meminta kredensial sebesar %2$s.
+ %1$s meminta kredensial. Silahkan pilih sebuah entri.
+ Diaktifkan
+ Notifikasi tindakan database
+ Plugin akan diberitahu saat database dibuka, ditutup atau disimpan.
+ Data entri saat ini
+ Plugin akan menerima semua data tentang entri database saat ini dan akan diizinkan untuk menawarkan tindakan dan memodifikasi tampilan itu.
+ Permintaan kredensial sendiri
+ Plugin akan diizinkan untuk menanyakan kredensial yang terkait dengan paket aplikasinya sendiri.
+ Kredensial permintaan
+ Plugin akan diizinkan untuk meminta kredensial untuk situs web atau aplikasi yang disengaja.
+ Dapatkan lebih banyak jenis penyimpanan
+ Peringatan: validasi sertifikat server gagal:%1$s. Instal sertifikat root yang sesuai pada perangkat Anda atau lihat pengaturan!
+ Kesalahan: validasi sertifikat server gagal! Instal sertifikat root yang sesuai pada perangkat Anda atau lihat pengaturan!
+ Pilih format berkas
+ Maaf! Keepass2Android mati oleh OS Android! Untuk alasan keamanan, Keepass2Android tidak mempertahankan kredensial pilihan Anda pada disk, jadi Anda perlu membuka kembali database Anda. Catatan: Hal ini harus terjadi sangat jarang. Jika ya, tolong kirimi saya pesan di crocoapps@gmail.com.
+ File ini hanya sementara tersedia untuk Keepass2Android.
+ Berkas yang Anda pilih hanya bisa dibaca.
+ Berkas yang Anda pilih hanya bisa dibaca untuk Keepass2Android karena pembatasan pada Android 4.4+.
+ Untuk menggunakannya, Anda harus menyalinnya ke lokasi lain.
+ Untuk mengeditnya, Anda harus menyalin berkas ke lokasi lain.
+ Klik OK untuk memilih lokasi dimana berkas tersebut harus disalin.
+ Database hanya bisa dibaca
+ Keepass2Android telah membuka database saat ini dalam mode read-only.
+ Sepertinya Anda membuka file dari aplikasi eksternal. Dengan cara ini tidak mendukung penulisan. Jika Anda ingin membuat perubahan pada database, tutup database dan pilih Change database. Kemudian buka file dari salah satu pilihan yang tersedia jika memungkinkan.
+ Flag read-only diset. Hapus bendera ini jika ingin melakukan perubahan pada database.
+ Menulis tidak mungkin karena pembatasan diperkenalkan di Android KitKat. Jika Anda ingin membuat perubahan pada database, tutup database dan pilih Change database. Kemudian buka file tersebut menggunakan System File Picker.
+ Tambahkan ikon dari berkas...
+ Menyalin berkas...
+ Salin
+ Entri standar
+ Templet
+ ID kartu
+ Nama
+ Tempat masalah
+ Tanggal pengeluaran
+ E-Mail
+ Alamat E-Mail
+ LAN nirkabel
+ Catatan aman
+ SSID
+ Nomor
+ CW
+ PIN
+ Pemegang kartu
+ Kartu kredit
+ Keanggotaan
+ Ubah log
+ Tambahkan templet?
+ Keepass2Android berisi template entri untuk akun E-Mail, kata sandi Wireless-LAN, catatan aman dan banyak lagi. Apakah Anda ingin menambahkan ini ke database Anda? Jika Anda memilih Tidak, Anda dapat menambahkannya nanti dalam pengaturan database.
+ Tambahkan template ke database
+ Tolong dicatat! Ini adalah rilis preview dan mungkin datang dengan beberapa kekurangan! Jika Anda mengalami * sesuatu yang tidak diharapkan, beri tahu saya (di grup penguji Google+ beta atau melalui email).
+ Terus
+ URI yang Anda masukkan tidak terlihat seperti nama berkas. Apakah Anda yakin ini adalah berkas yang valid?
+ Kunci komposit tidak lengkap Silahkan coba lagi.
+ Kunci komposit tidak valid Silakan coba langkah-langkah berikut untuk membuka basis data Anda: \n
+
+ • Pastikan Anda telah memasukkan kata sandi yang benar. Gunakan ikon mata untuk mengungkapkan kata sandi yang dimasukkan. \n
+ • Pastikan Anda telah memilih jenis kata sandi yang benar. Pastikan ini cocok dengan tipe yang digunakan saat membuat database. \n
+ • Pastikan Anda telah memilih file database yang benar.
+
+
+File rusak\n
+ Berikut adalah beberapa petunjuk yang mungkin membantu untuk mendiagnosis masalah ini:\n
+
+ • Jika Anda menyalin file melalui USB (MTP-Mode), coba lagi dengan alat seperti MyPhoneExplorer. MTP memotong file dalam kasus tertentu.\n
+ • Jika Anda tidak dapat membuka file dari lokasi yang sama di PC Anda, kemungkinan besar file tersebut benar-benar rusak. Silahkan gunakan backup database saja. Jika Anda menganggap bahwa Keepass2Android telah merusak file tersebut, hubungi dukungan.\n
+ • Jika Anda masih dapat membuka file di PC Anda, hubungi dukungan. Anda dapat mencoba menyimpannya dengan setelan yang berbeda (misalnya membuka ritsleting) pada PC dan mencoba lagi untuk membuka di Keepass2Android.
+ Keepass2Android: Terjadi kesalahan.
+ Terjadi kesalahan tak terduga saat menjalankan Keepass2Android. Tolong bantu kami memperbaikinya dengan mengizinkan aplikasi mengirim laporan kesalahan.
+ Laporan kesalahan tidak akan berisi isi database atau kata sandi utama Anda. Anda bisa menonaktifkannya di setting aplikasi.
+ Memungkinkan
+ Nonaktifkan
+ Tanyakan setelah kesalahan
+ Kirim laporan kesalahan
+ Tampilkan soft keyboard untuk input kata sandi saat pemindaian sidik jari aktif.
+
+Versi 1.03\n
+ * Layanan aksesibilitas yang telah dihapus untuk IsiOtomatis sesuai permintaan Google. Silakan lihat pengaturan akses kata sandi untuk menemukan plugin yang mereplikasi fungsi sebelumnya.\n
+ * Menambahkan aplikasi pihak ketiga sebagai opsi penyimpanan lagi\n
+ * Penampil gambar terpadu untuk melihat gambar terlampir tanpa mentransfernya ke aplikasi lain\n
+ * Upgrade OkHttp untuk memperbaiki masalah dengan beberapa koneksi\n
+ * Dukungan untuk entri KeeTrayTOTP, sekarang mendukung entri Uap\n
+
+Versi 1.02 \n
+ * Beberapa perbaikan keamanan. Terima kasih banyak atas laporan keamanan oleh jean-baptiste.cayrou@thalesgroup.com dan vincent.fargues@thalesgroup.com dan untuk kolaborasi mereka! \n
+ * Dukungan untuk KeyboardSwapPlugin (lihat opsi akses kata sandi): memungkinkan untuk mengubah metode input secara otomatis pada perangkat yang tidak berakar. Berkat Mishaal Rahman dari XDA-Developers untuk membuat ini mungkin. \n
+ * Perbaiki untuk Layanan Aksesibilitas dengan versi Chrome terbaru \n
+ * Perbaiki untuk pembersihan data sidik jari yang tidak perlu \n
+ * Perbaiki crash minor \n
+ * Diperbarui Dropbox SDK untuk memastikan kompatibilitas di masa depan \n
+ * Laporan kesalahan yang dihapus melalui Wawasan Xamarin \n
+ * Alat pembuatan yang diperbarui \n
+
+Versi 1.01-g \n
+ * Perbaiki untuk mogok saat mencoba bekerja secara offline \n
+ * Perbaiki untuk penyandian yang salah dari kredensial FTP (S) \n
+ * Perbaiki untuk mogok saat menggunakan OneDrive dan versi Android yang lebih tua \n
+ * Tampilan kali sebagai waktu setempat di layar masuk \n
+
+Versi 1.01-d \n
+ Perbaiki untuk daftar file OneDrive \n
+ * Izinkan untuk mengabaikan kesalahan sertifikat juga saat verifikasi nama host gagal (tidak disarankan untuk penggunaan produksi) \n
+ * Perbaiki untuk QuickUnlock terkadang gagal walaupun benar membuka kode \n
+
+Versi 0.9.8c \n
+ * Perbaiki kerentanan SSL di Microsoft Live SDK (digunakan saat mengakses file melalui OneDrive) \n
+ * Bug fix: Pelepasan sebelumnya berisi dua metode masukan (one crashing) \n
+
+Versi 1.01 \n
+ * Dukungan tambahan untuk KDBX-4-format baru (kompatibel dengan Keepass 2.35) termasuk derivasi kunci Argon2 dan enkripsi ChaCha20. \n
+ * Mengarsipkan penyimpanan file WebDav, sekarang memungkinkan file browsing dan mendukung enkripsi modern. \n
+ * Penyimpanan file FTP yang terisi penuh, sekarang memungkinkan file browsing dan mendukung enkripsi (FTPS). \n
+ * Diperbarui ke OneDrive SDK (sebelumnya digunakan Live SDK tidak lagi diperbarui) \n
+ * Diperbarui ke Dropbox SDK versi 2 (sebelumnya menggunakan versi 1 SDK sudah usang). \n
+ * Ditambahkan dukungan untuk OwnCloud. \n
+ * Meminta izin penyimpanan sebelum membuka file lokal
+
+Versi 1.0.0e \n
+ * Perbaiki untuk Unlock Sidik Jari pada perangkat Samsung yang lebih tua dengan Android 6 \n
+ * menambahkan dukungan asli untuk perangkat x86 \n
+ * Biarkan menyembunyikan softkeyboard selama pemindaian sidik jari \n
+ * membangun update sistem
+
+Versi 1.0.0 \n
+ * Sidik Jari (memerlukan perangkat Android 6.0+ atau perangkat Samsung) \n
+ * Ditambahkan layanan IsiOtomatis (memerlukan Android 5.0 +) \n
+ * Ditambahkan dukungan untuk template entri \n
+ * Ditambahkan mode \"bekerja offline\" \n
+ * Memungkinkan untuk menyalin entri \n
+ * Auto-complete mode untuk nama field \n
+ * Memungkinkan untuk menghapus item dari daftar file terakhir \n
+ * Meminta izin saat runtime di Android 6.0 \n
+ * Perbaikan bug (pada keyboard built-in, saat memilih ikon) \n
+ * Termasuk pilihan untuk mengirim laporan kesalahan \n
+ * Ditambahkan help messages di beberapa titik \n
+
+Versi 0.9.9 \n
+* Desain ulang UI lengkap. Terima kasih banyak kepada Stefano Pignataro (http://www.spstudio.at) atas dukungannya! \n
+ * Izinkan menambahkan ikon khusus \n
+ * Dukungan untuk mode Multi Window pada perangkat Samsung \n
+ * Menambah jumlah default putaran enkripsi untuk database baru \n
+ * Periksa kunci duplikat bidang tambahan agar tidak kehilangan data \n
+
+Versi 0.9.9c \n
+ * Tema gelap sudah kembali \n
+ * Anda dapat menginstal paket ikon lainnya (ikon bergaya Windows kuno tersedia di Play Store) \n
+ * Ditambahkan konfirmasi pertanyaan saat menghapus elemen tanpa recycle bin \n
+ * Perbaikan bug (salah tampilan encoding rahasia OTP, ikon aplikasi yang salah di beberapa tempat) \n
+
+Versi 0.9.8b \n
+* Perbaikan bug (Menyimpan gagal untuk beberapa database, mengekspor ke perangkat lokal yang tidak berfungsi, memilih beberapa opsi preferensi yang mogok aplikasi) \n
+
+Versi 0.9.8 \n
+* Dukungan untuk Storage Access Framework (memungkinkan menulis ke kartu SD dan Google Drive di KP2A Offline) \n
+* Cobalah untuk mendeteksi masukan pengguna yang salah saat memasukkan URL WebDAV (direktori dan bukan file) \n
+* Berubah font kata kunci \n
+* Izinkan untuk mengubah akun Dropbox \n
+* Fixed bug: Sekarang teringat password OTP
+
+Versi 0.9.7b \n
+* terjemahan yang diperbarui \n
+* Perbaikan bug: Font kata sandi hilang pada 0.9.7, urutkan menurut nama tidak mengelompokkan kelompok \n
+
+Versi 0.9.7 \n
+* tulis dukungan untuk database Keepass 1 (kdb) (beta!) \n
+* Lebih baik beralih kembali ke keyboard sebelumnya (juga bekerja pada perangkat yang tidak berakar) \n
+* Mendukung KeeChallenge dengan tantangan panjang variabel \n
+* mencegah pengambilan tangkapan layar dari layar QuickUnlock dan sandi \n
+* Urutan urutan terbalik untuk Sortir berdasarkan Tanggal Modifikasi (sekarang turun) \n
+* Perbaikan bug: Tampilan catatan sekarang diperbarui dengan benar setelah perubahan, Tampilan kata sandi sekarang menyembunyikan kata sandi dengan benar (semoga) semua perangkat, masalah tetap yang memungkinkan untuk menambahkan entri dua kali, masalah tetap dengan menunjukkan peringatan UUID Duplikat bahkan setelah memperbaiki database \n
+
+Versi 0.9.6 \n
+* Mengijinkan untuk mengimpor file utama dan / atau file database lokal ke direktori internal aplikasi (lihat pengaturan) \n
+* memungkinkan pilihan sortir yang berbeda \n
+* Peningkatan preferensi untuk penggantian keyboard otomatis \n
+* Logo aplikasi dan desain notifikasi yang diperbarui, disain oleh Stefano Pignataro (http://www.spstudio.at) \n
+* Generator kata sandi ingat pengaturan terakhir \n
+* menetapkan keterlihatan pemberitahuan untuk layar kunci Android 5 \n
+* Sekarang kliring field master password saat meninggalkan aplikasi tanpa mengklik OK \n
+* masalah tetap dengan bahasa input yang hilang dalam pengaturan keyboard pada beberapa perangkat \n
+* masalah tetap dengan keyboard otomatis yang beralih pada perangkat yang di-root \n
+* tambah cek untuk database yang korup (duplicate UUIDs) \n
+* Secara otomatis memuat ulang database saat perubahan terdeteksi, memecahkan kekhawatiran keamanan tentang mengungkapkan kata kunci utama \n
+* Perbaikan tata letak keyboard poles yang bagus, tema pengaturan keyboard tetap (berkat Wiktor Ławski) \n
+
+
+ChangeLog_0_9_6
+
+ Versi 0.9.5 \n
+* Masalah tetap dengan file browsing (terutama di Android 4.4) \n
+* Masalah tetap dengan file pemuatan .kdb (Keepass 1) di Nexus 5 dengan Android Lollipop \n
+* Ditambahkan pilihan untuk mencegah pengambilan tangkapan layar / menampilkan aplikasi di daftar aplikasi terbaru \n
+* Masalah tetap dengan penyimpanan file Google Drive (edisi reguler) \n
+* Izinkan file kunci pada jenis penyimpanan yang disengaja (edisi reguler) \n
+* Diperbarui Dropbox SDK untuk menyertakan patch keamanan resmi (regular edition) \n
+* Alat pembuatan yang diperbarui - & gt; ukuran apk meningkat: - (\n
+Saya telah berjanji beberapa perubahan lagi. Mereka akan datang dengan rilis berikutnya - maaf. Saya ingin mempublikasikan perbaikan panas ini sesegera mungkin.
+
+ Versi 0.9.4 \n
+* Dukungan plug-in yang ditambahkan: Lihat pengaturan cara mendapatkan plug-in! \n
+* Ditampilkan QR plug-in (memindai password, menampilkan password sebagai kode QR, mentransfer entri ke perangkat KP2A lainnya) \n
+* Publikasikan plugin InputStick (mentransfer kredensial ke PC Anda melalui bluetooth - memerlukan stik USB InputStick) \n
+* Aplikasi pihak ketiga sekarang dapat menerapkan kueri KP2A untuk kredensial. Apakah kamu seorang pengembang Harap tambahkan ini ke aplikasi Anda jika sesuai! \n
+* ditambahkan dukungan TOTP (kompatibel dengan KeeOTP dan TrayTotp) \n
+* Aplikasi seharusnya tidak lagi dibunuh oleh Android saat database terbuka \n
+* Database tidak lagi terkunci saat meninggalkan aplikasi dengan tombol kembali (lihat pengaturan) \n
+* tampilkan nama grup di tampilan hasil pencarian (*) \n
+* menu konteks ditambahkan di tampilan hasil pencarian termasuk \"Navigasikan ke induk\" pilihan (*) \n
+* opsi tambah untuk menampilkan nama grup di tampilan entri (*) \n
+* (*) berkat Matthieu untuk mengimplementasikan fitur ini! \n
+* Dukungan KeeChallenge (dengan Yubikey NEO). Berkat Ben Rush untuk mengimplementasikan konektornya! \n
+* peningkatan antarmuka pengguna \n
+* memperbaiki bug di antarmuka Google Drive \n
+* opsi tambahan untuk menonaktifkan opsi \"donate\" \n
+* Ikon QuickUnlock sekarang disembunyikan di perangkat Android 4.2+ secara default \n
+
+ Versi 0.9.3 r5 \n
+* Perbaikan yang dilakukan dari Xamarin: Keepass2Android sekarang kompatibel dengan ART di Android 4.4.2. Akhirnya! \n
+* Perbaikan bug: bug dalam sinkronisasi (tampilan refresh, periksa perubahan yang benar pada http), bug pada perangkat Android 2.x, bug pada implementasi penyimpanan Google Drive dan OneDrive, bersihkan clipboard pada database dekat, lampiran pembuka bug, masalah tampilan dengan keyboard \n
+
+ Versi 0.9.3 \n
+* Keyboard baru dengan banyak perbaikan. Lihat pengaturan untuk disesuaikan. \n
+* Read-only support untuk kdb (Keepass 1 files). Eksperimental! \n
+* Ditambahkan dukungan SFTP \n
+* Solusi tambahan untuk bug dalam ART (Android 4.4.2) \n
+* Perbaikan bug \n
+
+ Versi 0.9.2 \n
+* Dukungan OTP yang ditambahkan (kompatibel dengan plugin OtpKeyProv) \n
+* Dukungan NFC terintegrasi untuk OTPs dari YubiKey NEO \n
+* Beberapa peningkatan UI \n
+* Integrated Keepass 2.24 perpustakaan \n
+* Ditambahkan pilihan untuk membunuh proses aplikasi (lihat pengaturan) \n
+* Peningkatan validasi sertifikat SSL \n
+* Perbaikan bug \n
+
+ Versi 0.9.1 \n
+* Dukungan SkyDrive terintegrasi (hanya edisi reguler Keepass2Android) \n
+* Masalah tetap dengan integrasi Google Drive \n
+* Ditambahkan dukungan NTLM
+
+ Versi 0.9 \n
+* Dukungan Dropbox dan Google Drive terintegrasi (baca / tulis basis data; Keepass2Android edisi reguler saja) \n
+* Browser file kustom terintegrasi (berdasarkan android-filechooser oleh HBA) \n
+* Peningkatan antarmuka pengguna untuk membuat database baru \n
+* Termasuk font kustom DejaVu Sans Mono untuk menampilkan kata sandi \n
+* Perbaikan kerusakan
+
+Versi 0.8.6\n
+* Dukungan untuk Twofish cipher\n
+* Izinkan pengeditan kelompok\n
+* Izinkan pemindahan entri dan grup\n
+* Ikon QuickUnlock dapat dibuat transparan (lihat pengaturan)\n
+* Perbaikan kerusakan
+
+Versi 0.8.5\n
+* File jarak jauh disimpan di cache aplikasi lokal untuk memungkinkan penggunaan offline (termasuk pengeditan dan sinkronisasi nanti). Lihat pengaturan\n
+* Ikon notifikasi untuk memvisualisasikan status kunci database (lihat pengaturan)\n
+* Peningkatan penentuan lock-state dalam beberapa situasi\n
+* File database dimuat ke memori saat Anda mengetik kata sandi untuk meningkatkan kecepatan pemuatan (lihat pengaturan)\n
+* Entri dapat ditambahkan ke grup akar\n
+* Perbaikan bug (menyelesaikan bidang referensi, masalah dengan keyboard pada perangkat Cina Italia
+
+ Versi 0.8.4 \n
+* Perubahan database eksternal terdeteksi dan digabungkan saat menyimpan \n
+* Peningkatan kinerja pemuatan \n
+* Toolbar pencarian yang disempurnakan dengan saran \n
+* Logo Aplikasi Baru! \n
+* Ditambahkan dukungan untuk format .kdbp untuk pemuatan / penghematan lebih cepat \n
+* Peningkatan pengeditan string tambahan dan tampilan tersembunyi saat dilindungi \n
+Terima kasih kepada Alex Vallat atas kontribusi kode-nya! \n
+Terima kasih kepada Niki Hüttner (www.close-cut.de) untuk logo baru! \n
+ Versi 0.8.3\n
+* Nama pengguna/indeks TAN ditampilkan dalam daftar entri (lihat pengaturan)\n
+* Entri dapat dibuat jika pencarian dari browser tidak mengembalikan hasil\n
+* Keyboard KP2A menyediakan kemungkinan untuk mencari kredensial untuk aplikasi saat ini\n
+* Apl otomatis ditutup setelah memilih entri untuk digunakan di keyboard\n
+* Ikon pemilihan keyboard secara otomatis terbuka setelah mencari URL (lihat pengaturan)\n
+* Placeholders di bidang entri diganti sebelum menyalin (kebanyakan placeholder didukung)\n
+* perbaikan bug kecil
+ Versi 0.8.2\n
+* Dukungan untuk Digest Authentication in WebDAV\n
+* Bugfixes (OI File manager, Open URL)
+
+ Versi 0.8.1\n
+* KP2A Offline dan \"Online\" dapat diinstal lagi\n
+* Ditambahkan terjemahan baru (terima kasih kepada semua kontributor!)
+
+ Versi 0.8 \n
+* Peningkatan antarmuka pengguna terutama untuk perangkat Android 4.x\n
+* Izinkan menggunakan pengelola file yang disengaja untuk memilih file yang ada\n
+* Ditambahkan cara yang lebih aman untuk membuka lampiran (melalui direktori cache)\n
+* bug tetap dalam aktivitas Edit\n
+* Mungkin dikenalkan bug baru :-)
+
+ Diperluas kemungkinan untuk menyumbangkan bir atau sesuatu yang lain
+ Versi 0.7 \n
+* Peningkatan kecepatan pemuatan: transformasi kunci sekarang 10x lebih cepat! \n
+* Ditambahkan Keepass2Android soft-keyboard: Beralih ke keyboard ini untuk memasukkan kredensial. Melindungi Anda dari sniffer sandi clipboard (menonaktifkan notifikasi clipboard lama di opsi) \n
+* Ditambahkan pilihan untuk menyumbangkan bir atau yang lainnya (lihat menu)
+ Versi 0.6.2\n
+* Google Drive/Dropbox/... integrasi: Gunakan Aplikasi Google Drive atau Dropbox resmi dan buka file .kdbx. Ini sekarang akan menampilkan KP2A.\n
+* Dialog Pencarian yang Disempurnakan\n
+* Peningkatan hasil pencarian untuk Share URL dengan subdomain\n
+* Ditambahkan pilihan untuk memberi umpan balik, dan menilai dan menerjemahkan aplikasi di menu\n
+\n
+Versi 0.6.1\n
+* Mendeteksi saat perubahan database di latar belakang (yaitu karena aktivitas aplikasi sinkronisasi)\n
+* Peningkatan pencarian URL dari browser\n
+* Konfirmasikan dialog saat membuang perubahan\n
+\n
+Versi 0.6 \n
+Rilis publik awal
+
+ 30 detik
+ 1 menit
+ 5 menit
+ 10 menit
+ 15 menit
+ 30 menit
+ 1 jam
+ Tidak pernah
+
+
+ Keepass 2 database (.kdbx)
+ Keepass 2 XML (tidak terenkripsi) (.xml)
+ Keepass CSV (tidak terenkripsi) (.csv)
+
+
+ Kecil
+ Sedang
+ Besar
+
+
+ Terang
+ Gelap
+
+ Desain
+
+ Tidak ada enkripsi (FTP)
+ Implicit enkripsi (FTP over TLS, FTPS)
+ Eksplisit enkripsi (FTP over TLS, FTPS)
+
+
+ Tidak ingat nama pengguna atau kata sandi
+ Hanya ingat nama pengguna
+ Ingat nama pengguna dan kata sandi
+
+
+ Hanya kata sandi
+ Kata sandi + berkas kunci
+ Kata sandi + OTP
+ Kata sandi + OTP rahasia (mode pemulihan)
+ Kata sandi + Tantangan-Tanggapan
+ Kata sandi + Tantangan-Tanggapan rahasia (mode pemulihan)
+
+
+ Mengabaikan kegagalan validasi sertifikat
+ Memperingatkan saat validasi gagal
+ Jangan terima sertifikat yang tidak sah
+
+ Pastikan ini bekerja pada sistem anda dan pertimbangkan jika tidak untuk menggunakan built-in keyboard.
+ Deskripsi disediakan oleh plugin:
diff --git a/src/keepass2android/Resources/values-it/strings.xml b/src/keepass2android/Resources/values-it/strings.xml
index 6bf1f6c8..bed32e09 100644
--- a/src/keepass2android/Resources/values-it/strings.xml
+++ b/src/keepass2android/Resources/values-it/strings.xml
@@ -87,8 +87,6 @@
Abilita lo Sblocco totale con ImprontaAbilita lo sblocco con Impronta per QuickUnlockTocca il sensore per sbloccare il database
- Sblocco con Impronta digitali non riuscita. La chiave di decodifica è stata invalidata dal sistema operativo. Questo solitamente accade se una nuova impronta digitale è stata registrata o sono state modificate le impostazioni di protezione. Sblocca con la password e quindi riattiva lo sblocco con Impronta nelle impostazioni del database.
- Sblocco del database fallito: chiave composita non valida. Lo sblocco con Impronta è stato disabilitato perché sembra che la password principale memorizzata non sia più valida. Sblocca con la password e poi riattiva lo Sblocco con Impronta nelle impostazioni del database.Per favore riattiva lo Sblocco con Impronta per la nuova password principale.
Questo memorizzerà la password principale su questo dispositivo, cifrata con il Keystore Android e protetta tramite autenticazione con impronta digitale. Permette di sbloccare il database solo con l\'impronta digitale.
diff --git a/src/keepass2android/Resources/values-iw/strings.xml b/src/keepass2android/Resources/values-iw/strings.xml
index 1735d31a..59366065 100644
--- a/src/keepass2android/Resources/values-iw/strings.xml
+++ b/src/keepass2android/Resources/values-iw/strings.xml
@@ -5,4 +5,14 @@
משובעמוד הביתערוך רשומה
+ הוסף קבוצה
+ ערוך קבוצה
+ אלגוריתם
+ אלגוריתם
+ Keepass2Android
+ KP2A
+ Keepass2Android במצב לא מקוון
+ KP2A במצב לא מקוון
+ פג תוקפו של הישום
+ פרק זמן לפני נעילת מסד הנתונים כאשר היישום אינו פעיל.
diff --git a/src/keepass2android/Resources/values-ja/strings.xml b/src/keepass2android/Resources/values-ja/strings.xml
index 155e20de..fe67e6d4 100644
--- a/src/keepass2android/Resources/values-ja/strings.xml
+++ b/src/keepass2android/Resources/values-ja/strings.xml
@@ -87,9 +87,11 @@
指紋認証によるデータベースのロック解除を有効にする指紋認証によるクイック解除を有効にするロック解除のためにセンターにタッチしてください
- 指紋認証によるロック解除に失敗しました。Android OS によって復号化キーが無効化されました。これは通常、新しい指紋の登録時やセキュリティ設定の変更時に発生します。パスワードによってロックを解除し、データベースの設定から指紋認証によるロックを再度有効化してください。
- データベースのロック解除に失敗しました: 無効な複合キーです。端末に保存されたマスターパスワードが有効ではないと思われるため、指紋認証によるロック解除は無効化されました。パスワードによりロックを解除し、データベースの設定から再度指紋認証によるロック解除を有効にしてください。
+ 指紋認証のロック解除に失敗しました。Android OS によって復号鍵が無効にされました。これは通常、新しい指紋の登録、またはセキュリティ設定が変更された場合に発生します。
+ データベースのロックに失敗しました: 無効な複合鍵です。マスターパスワードが無効になったため、指紋認証のロック解除が無効にされたようです。 新しいパスワードのための指紋認証によるロック解除を再度有効にしてください。
+ パスワードでロックを解除して、データベースの設定でもう一度指紋認証のロック解除を有効にしてください。
+ 指紋センサーの初期化に失敗しました。
マスターパスワードを Android キーストアで暗号化した状態で端末に保存し、指紋認証で保護します。指紋認証のみで、データベースのロックを解除できるようになりますクイック解除のコードのかわりに指紋認証を利用するようにします。マスターパスワードに関連する情報を格納する必要はありません。
@@ -332,6 +334,7 @@
通知を分割するユーザー名やパスワードをクリップボードへコピーするための通知とキーボード変更のための通知を分割して表示します。オートフィル ユーザー補助サービス
+ オートフィル サービスKP2A キーボードの通知KP2Aのキーボードを介して全エントリにアクセスできるようにする (推奨)。キーボード切り替え
@@ -492,6 +495,7 @@
無効オンラインでプラグインを見つけるスコープ
+ 有効になっていません%1$s は、%2$s のアカウント情報を要求しています。%1$s は、アカウント情報を要求しています。エントリーを選択してください。有効
@@ -568,6 +572,11 @@
エラー発生時に確認するエラーレポートの送信指紋スキャンが有効な場合、パスワード入力用のソフト キーボードを表示します。
+
+ バージョン 1.04\n
+ * Android 8.0 以降でオートフィルサービスを追加しました。\n
+ * ライブラリー、ビルドツール、ターゲット SDK バージョンをアップグレードしました。\n
+
バージョン 1.03\n
* Googleからの要請により、オートフィルのためのアクセシビリティサービスを削除しました。パスワードアクセス設定から前の機能を再現するプラグインを見てみて下さい。.\n
@@ -856,4 +865,9 @@ Niki Hüttner (www.close-cut.de) の新しいロゴに感謝!\nお使いのシステムでこれが機能していることを確認してください。そうでない場合は、内蔵キーボードの使用を考慮してください。プラグインによって提供される説明:
+ Keepass2Android は Android のオートフィル機能をサポートしていますが、まだ有効にしていないようです。
+ オートフィルを有効にする
+ オートフィルのヘルプを表示
+ Keepass2Android で入力
+ ドメイン %1$s をアプリ %2$s と関連付けできません
diff --git a/src/keepass2android/Resources/values-ko/strings.xml b/src/keepass2android/Resources/values-ko/strings.xml
index b9d66da5..b9ed2fbd 100644
--- a/src/keepass2android/Resources/values-ko/strings.xml
+++ b/src/keepass2android/Resources/values-ko/strings.xml
@@ -77,7 +77,6 @@
지문 잠금 해제 사용안함빠른 잠금해제를 위해 지문인식 잠금해제 사용데이터베이스의 잠금을 해제하려면 센서에 접촉하십시오
- 지문 인식 잠금 해제에 실패했습니다. 안 드 로이드 OS에 의해 키 암호 해독이 무효화 됐습니다. 일반적으로 새로운 지문을 등록 했거나 보안 설정이 변경 된 경우 발생 합니다. 귀하의 비밀 번호로 잠금 해제를 한 후 데이터베이스 설정에서 다시 지문 인식 잠금 해제 설정에서 재활성화 하시기 바랍니다.데이터베이스 파일 이름을 입력하세요.접속됨최소
diff --git a/src/keepass2android/Resources/values-nb/strings.xml b/src/keepass2android/Resources/values-nb/strings.xml
index 9fe4204b..9d81f440 100644
--- a/src/keepass2android/Resources/values-nb/strings.xml
+++ b/src/keepass2android/Resources/values-nb/strings.xml
@@ -87,8 +87,6 @@
Aktiver fingeravtrykk opplåsningSlå på fingeravtrykk opplåsning i QuickUnlockTrykk på sensoren for å låse opp databasen
- Opplåsing ved fingeravtrykk feilet. Dekrypteringsnøkkelen ble avbrutt av Android OS. Dette skjer vansligvis hvis et nytt fingeravtrykk ble registrert eller sikkerhetsinstillingene ble endret. Venligst lås opp vha passord og reaktiver opplåsning med fingeravtrykk i database-instillingene.
- Opplåsning av databasen feilet: Ugyldig komposittnøkkel. Fingeravtrykksopplåsingen ble deaktivert fordi det lagrede hovedpassordet tilsynelatende ikke lenger er gyldig. Vennligst lås opp med passordet ditt og aktiver deretter fingeravtrykkslåsing i databasens innstillinger.Vennligst aktiver fingeravtrykk opplåsning for det nye master passordet.Angi filnavnet for databasenBrukt
diff --git a/src/keepass2android/Resources/values-nl/strings.xml b/src/keepass2android/Resources/values-nl/strings.xml
index 5cc383a7..2242cdb0 100644
--- a/src/keepass2android/Resources/values-nl/strings.xml
+++ b/src/keepass2android/Resources/values-nl/strings.xml
@@ -74,7 +74,7 @@
CijfersKeepass2Android biedt GEEN ENKELE GARANTIE; Dit is gratis software, u mag deze software verspreiden onder de voorwaarden van de GPL versie 2 of recenter.\u2026
- Kopieer_naar_klembord
+ Kopieer naar klembordSensorBevestig vingerafdruk om verder te gaanVingerafdrukontgrendeling kan niet worden ingesteld:
@@ -87,9 +87,11 @@
Vingerafdrukontgrendeling inschakelenVingerafdrukontgrendeling voor QuickUnlock inschakelenRaak de sensor aan om database te ontgrendelen
- Vingerafdruk-unlock is mislikt. Decryptie sleutel is niet geaccepteerd door het OS. Dit gebeurt meestal als u een nieuwe vingerprint hebt ingesteld. Heractiveer vingerafdruk-unlock alstublieft in de instellingen.
- Ontgrendelen van de database mislukt: Ongeldige sleutelcombinatie. Vingerafdruk-ontgrendelen is uitgeschakeld omdat het hoofdwachtwoord niet meer geldig is. Ontgrendel aub met uw wachtwoord en schakel daarna Vingerafdruk-ontgrendelen weer in. U vindt dit onder database-instellingen.
+ Ontgrendelen via vingerafdruk mislukt. De sleutel is door Android als ongeldig gemarkeerd. Dit is meestal het geval als er een nieuwe vingerafdruk is ingesteld of als de beveiligingsinstellingen zijn gewijzigd.
+ Ontgrendelen van de database mislukt: Ongeldige sleutel. Vingerafdruk-ontgrendeling is uitgeschakeld want het opgeslagen hoofdwachtwoord is niet meer geldig. Schakel aub vingerafdruk-ontgrendelen opnieuw in voor het nieuwe hoofdwachtwoord.
+ Ontgrendel aub met uw wachtwoord en schakel dan vingerafdruk-ontgrendeling weer in via de instellingen van de database.
+ Niet gelukt om de vingerafdruk-sensor te initialiseren.
Dit zal uw hoofdwachtwoord op dit apparaat opslaan. Het wordt versleuteld door de Android Keystore en beschermd door authenticatie met uw vingerafdruk. Dit geeft de mogelijkheid uw database enkel met uw vingerafdruk te ontgrendelen. Gebruik authenticatie dmv vingerafdruk in plaats van QuckUnlock. U hoeft geen informatie met betrekking tot uw hoofdwachtwoord op te slaan.
@@ -276,8 +278,8 @@ Dit zal uw hoofdwachtwoord op dit apparaat opslaan. Het wordt versleuteld door d
Wanneer ingeschakeld is het maken van screenshots niet toegestaan en zal geen miniatuur van de app worden weergegeven in de lijst met recente apps.QuickUnlock pictogram verbergenQuickUnlock helaas werkt niet zonder een notificatiepictogram weer te geven. Selecteer deze optie om een transparant pictogram te gebruiken.
- Verberg SnelOntlokken picto
- SnelOntlokken vereist een notificatie om goed te werken. Selecteer deze optie om de notificatie picto niet te tonen.
+ Verberg QuickUnlock pictogram
+ QuickUnlock vereist een notificatie om goed te werken. Selecteer deze optie om de notificatie pictogram niet te tonen.Lengte van QuickUnlock-sleutelMaximum aantal tekens gebruikt voor QuickUnlock wachtwoord.QuickUnlock is mislukt: verkeerd wachtwoord!
@@ -332,6 +334,7 @@ Dit zal uw hoofdwachtwoord op dit apparaat opslaan. Het wordt versleuteld door d
Afzonderlijke notificatiesToon afzonderlijke notificaties voor het kopiëren van gebruikersnaam en wachtwoord en voor het inschakelen van het toetsenbord.Toegankelijkheid service voor AutoFill
+ Service voor automatisch aanvullenKP2A toetsenbordmeldingMaak volledige invoer mogelijk via het toetsenbord van de KP2A (aanbevolen).Wissel toetsenbord
@@ -356,7 +359,7 @@ Dit zal uw hoofdwachtwoord op dit apparaat opslaan. Het wordt versleuteld door d
PrullenbakWilt u dit item permanent verwijderen? Druk op \"nee\" om te herstellen.Wilt u deze groep permanent verwijderen? Druk op \"nee\" om te recyclen.
- Wilt u de geselecteerde elementen permanent verwijderen? Druk op Neen om te behouden.
+ Wilt u de geselecteerde elementen permanent verwijderen? Druk op Nee om te behouden.Wilt u dit element permanent verwijderen?Wilt u deze groep permanent verwijderen?Wilt u de geselecteerde elementen permanent verwijderen?
@@ -492,6 +495,7 @@ Dit zal uw hoofdwachtwoord op dit apparaat opslaan. Het wordt versleuteld door d
uitgeschakeldZoek plug-ins onlineReikwijdte
+ niet ingeschakeld%1$s vraagt gegevens voor %2$s.%1$s vraagt om gegevens. Selecteer aub een invoer.Ingeschakeld
@@ -568,7 +572,12 @@ Dit zal uw hoofdwachtwoord op dit apparaat opslaan. Het wordt versleuteld door d
UitschakelenVragen na het optreden van een foutFoutrapporten verzenden
- Toon zacht toetsenbord voor wachtwoord invoer wanneer vingerafdruk scan actief is.
+ Toon het toetsenbord voor wachtwoord invoer wanneer vingerafdruk scan actief is.
+
+Versie 1.04\n
+ * Automatisch aanvullen toegevoegd voor Android 8.0 en hoger.\n
+ * Bibliotheken, gereedschap en SDK-versie bijgewerkt.\n
+
Versie 1.03\n
* Toegankelijkheid service voor AutoFill verwijderd zoals gevraagd door Google. Raadpleeg de wachtwoord toegangsinstellingen om een plugin te vinden die de vorige functionaliteit biedt.\n
@@ -868,4 +877,9 @@ Eerste publieke publicatie
Controleer of dit werkt op uw systeem. Zo niet, overweeg dan het gebruik van het ingebouwde toetsenbord.Beschrijving door de plugin:
+ Keepass2Android ondersteunt de functionaliteit voor automatisch aanvullen van Android, maar het lijkt er op dat u dit nog niet hebt ingeschakeld.
+ Automatisch aanvullen inschakelen
+ Toon help voor automatisch aanvullen
+ Vullen met Keepass2Android
+ Kon domein %1$s niet koppelen met app %2$s
diff --git a/src/keepass2android/Resources/values-pl/strings.xml b/src/keepass2android/Resources/values-pl/strings.xml
index 39a9e3b6..fa7ea47c 100644
--- a/src/keepass2android/Resources/values-pl/strings.xml
+++ b/src/keepass2android/Resources/values-pl/strings.xml
@@ -87,8 +87,6 @@
Włącz odblokowywanie odciskiem palcaWłącz odblokowywanie odciskiem palca dla QuickUnlockCzujnik dotykowy do odblokowania bazy danych
- Nie udało się odblokować odciskiem palca. Klucz odszyfrowujący został odrzucony przez system operacyjny Android. To się zazwyczaj zdarza, jeżeli został zapisany nowy odcisk palca lub ustawienia zabezpieczeń zostały zmienione. Proszę odblokować przy pomocy swojego hasła, a następnie ponownie aktywować odblokowywanie odciskiem palca w ustawieniach bazy danych.
- Nie udało się odblokować bazy danych: Nieprawidłowy klucz złożony. Odblokowywanie odciskiem palca zostało zablokowane, ponieważ prawdopodobnie zapisane hasło główne nie jest już ważne. Proszę odblokować przy pomocy swojego hasła, a następnie ponownie aktywować odblokowywanie przy pomocy odcisku palca w ustawieniach bazy danych.Proszę ponownie aktywować odblokowywanie przy pomocy odcisku palca dla nowego hasła głównego.
To zachowa twoje hasła główne na tym urządzeniu.
diff --git a/src/keepass2android/Resources/values-pt-rBR/strings.xml b/src/keepass2android/Resources/values-pt-rBR/strings.xml
index c32c06a5..2ebf6cb5 100644
--- a/src/keepass2android/Resources/values-pt-rBR/strings.xml
+++ b/src/keepass2android/Resources/values-pt-rBR/strings.xml
@@ -87,8 +87,6 @@
Ativar por completo o Desbloqueio de DigitalAtivar o Desbloqueio de Digital para o QuickUnlockSensor de toque para desbloquear a base de dados
- Falha ao desbloquear com impressão digital. A chave de decodificação foi invalidada pelo sistema operacional Android. Isso geralmente acontece se uma nova impressão digital foi registrada ou configurações de segurança alteradas. Por favor, desbloqueie com a sua senha e então reative o Desbloquear com Impressão Digital nas configurações da base de dados.
- Falha ao desbloquear a base de dados: Chave composta inválida. Desbloquear com Impressão Digital foi desativada porque, aparentemente, a senha mestre armazenada não é mais válida. Por favor, desbloqueie com a sua senha e então, reative o Desbloquear com Impressão Digital nas configurações da base de dados.Por favor, reative o Desbloquear com Impressão Digital para a nova senha mestre.
Isto armazenará a sua senha mestre neste dispositivo, criptografada com a Armazenagem
diff --git a/src/keepass2android/Resources/values-pt-rPT/strings.xml b/src/keepass2android/Resources/values-pt-rPT/strings.xml
index 84ae5a55..e35f27c1 100644
--- a/src/keepass2android/Resources/values-pt-rPT/strings.xml
+++ b/src/keepass2android/Resources/values-pt-rPT/strings.xml
@@ -85,12 +85,14 @@ Muito útil se existirem muitos resultados iguais.Hardware de impressão digital não detetado.Não existem impressões digitais registadas neste aparelho. Por favor dirija-se primeiro à definições.Desativar desbloquear através impressão digital
- Desativar desbloquear através impressão digital
+ Ativar desbloquear através impressão digitalPermitir utilizar impressão digital desbloquear para o Desbloqueio-rápidoToque no sensor para desbloquear a base de dados
- Destrancar com a Impressão digital falhou. Chave de desencriptação foi invalidada pelo sistema operativo Android. Isto geralmente acontece quando uma nova impressão digital foi registada ou definições de segurança foram alteradas. Por favor desbloqueie com a sua palavra-passe e então ligue novamente a opção de desbloquear com a impressão digital nas definições da base de dados.
- O destrancar da base de dados falhou: Chave composta inválida. O destrancar através de impressão digital foi desativado porque aparentemente a palavra-passe mestra armazenada já não é válida. Por favor destranque com a sua palavra-passe e então ligue novamente a opção de destrancar com a impressão digital nas definições da base de dados.
+ Desbloqueio por impressão digital falhou: Chave para desencriptação foi invalidada pelo sistema Android. Isto costuma acontecer se for adicionada uma nova impressão digital ao sistema ou se os parâmetros de segurança forem alterados.
+ Desbloqueio da base de dados falhado: Chave composta inválida. O desbloqueio por impressão digital foi desativado porque aparentemente a chave mestra arquivada não é válida.Por favor, ligue novamente o destrancar através de impressão digital para a nova palavra-passe mestra.
+ Por favor desbloquear com sua password e re-ativar desbloqueio por impressão digital nas configurações da base de dados.
+ Falha ao inicializar o sensor de impressão digital.Esta operação irá guardar a sua Palavra-passe Mestra neste aparelho, encriptada pela chave do Android e protegida por impressão digital. Isto permitirá que desbloqueie a sua base de dados com a sua impressão digital.Permite o uso da impressão digital em vez do código de Desbloqueio-Rápido. Não requer que seja guardada nenhuma informação sobre a sua palavra-passe mestra.Introduza o nome do ficheiro da base de dados
@@ -332,6 +334,7 @@ Muito útil se existirem muitos resultados iguais.Notificações separadasMostre notificações separadas para copiar o nome de utilizador e a palavra-passe para área de transferência, e ativar o teclado.Serviço de Acessibilidade para Preenchimento Automático
+ Serviço de auto preenchimentoNotificação do teclado KP2ATornar toda a entrada disponível através do teclado KP2A (recomendado).Trocar o teclado
@@ -492,6 +495,7 @@ Muito útil se existirem muitos resultados iguais.inativoEncontrar plug-ins on-lineContexto
+ desativado%1$s está a solicitar credenciais para %2$s.%1$s está a solicitar credenciais. Por favor, selecione uma entrada.Ativado
@@ -571,6 +575,10 @@ Muito útil se existirem muitos resultados iguais.
Perguntar depois do erroEnviar relatórios de erroMostrar teclado para inserção de palavra-passe quando a verificação de impressão digital estiver ativa.
+
+Versão 1.04\n
+ * Adicionado serviço de auto preenchimento para android 8.0 e posterior.\n
+ * Atualizadas librarias, ferramentas de construção e versão de SDK.\n
Versão 1.03\n
* Remoção do Serviço de Acessibilidade para Preenchimento Automático conforme requisitado pelo Google. Favor consultar as definições de acesso à palavra-passe para encontrar uma extensão que replica a funcionalidade anterior\n
@@ -870,4 +878,9 @@ Lançamento público inicial
Certifique-se de que isto funciona no seu sistema e considere usar o teclado embutido se não.Descrição fornecida pela extensão:
+ Keepass2Android suporta o Auto preenchimento do sistema Android mas parece que ainda não o ativou.
+ Ativar o auto preenchimento
+ Mostrar ajuda para auto preenchimento
+ Preencher com Keepass2Android
+ Não foi possível associar o domínio %1$s com a aplicação %2$s
diff --git a/src/keepass2android/Resources/values-ro/strings.xml b/src/keepass2android/Resources/values-ro/strings.xml
index 3e81ff3b..eb90c2ea 100644
--- a/src/keepass2android/Resources/values-ro/strings.xml
+++ b/src/keepass2android/Resources/values-ro/strings.xml
@@ -86,8 +86,6 @@
Activează deblocarea completă prin amprentăActiveaza deblocarea cu amprentă pentru Deblocare rapidaAtinge sensorul pentru a debloca baza de date
- Deblocarea cu amprentă nu a reuşit. Cheia de decriptare a fost infirmată de sistem de operare Android. Acest lucru se întâmplă de obicei în cazul în care o nouă amprentă a fost înregistrata sau setările de securitate s-au schimbat. Vă rugăm să deblocati cu parolă şi apoi să re-activati Deblocare cu amprenta in setarile pentru baza de date.
- Deblocarea bazei de date a eşuat: Cheie compozită invalida. Deblocarea cu amprentă a fost dezactivată, deoarece aparent parola principala nu mai este valabilă. Vă rugăm să deblocati cu parola şi apoi sa re-activati Deblocarea cu amprentă in setarile pentru baza de date.Vă rugăm să re-activati deblocarea cu amprenta pentru noua parola principala.
Aceasta va stoca parola principala pe acest aparat, criptata cu Android Keystore şi protejata utilizând autentificarea cu amprentă. Permite deblocarea bazei de date numai cu amprenta dvs.
diff --git a/src/keepass2android/Resources/values-ru/strings.xml b/src/keepass2android/Resources/values-ru/strings.xml
index e7fceb42..59c78bec 100644
--- a/src/keepass2android/Resources/values-ru/strings.xml
+++ b/src/keepass2android/Resources/values-ru/strings.xml
@@ -87,9 +87,11 @@
Включить полную разблокировку отпечатками пальцевВключить разблокировку отпечатками пальцев для БыстройРазблокировкиПрикоснуться к датчику, чтобы разблокировать базу данных
- Не удалось разблокировать отпечатками пальцев. Ключ расшифровки был отбракован системой Android. Это обычно происходит, если заменен отпечаток пальца новым или были изменены параметры безопасности. Пожалуйста разблокируйте вашим паролем и затем снова включите разблокировку отпечатками пальцев в настройках базы данных.
- Разблокировка базы данных не удалось: недопустимый составной ключ. Разблокировка отпечатками пальцев была отключена, поскольку сохраненный мастер-пароль больше не действует. Пожалуйста разблокируйте вашим паролем и затем снова включите разблокировку отпечатками пальцев в настройках базы данных.
+ Ошибка разблокировки отпечатком пальца. Ключ дешифрования был сброшен операционной системой. Это происходит, если был зарегистрирован новый отпечаток пальца или были изменены настройки безопасности.
+ Ошибка при разблокировании базы данных: неверный составной ключ. Разблокирование с помощью отпечатка пальца было отключено, так как хранящийся мастер-пароль больше не работает. Пожалуйста включите разблокировку отпечатками пальцев для нового мастер-пароля.
+ Пожалуйста, разблокируйте с помощью вашего пароля и затем заново включите функцию разблокирования с помощью отпечатка пальца в настройках базы данных.
+ Не получилось запустить сенсор отпечатков пальцев.
Это сохранит ваш мастер-пароль на этом устройстве,
зашифрует при помощи Android Keystore и защитит
@@ -335,6 +337,7 @@
Раздельные уведомленияПоказывать отдельное уведомление для копирования в буфер обмена имени пользователя и пароля и для активации клавиатуры.Специальная служба автозаполнения
+ Функция автозаполненияУведомления клавиатуры KP2AСделать всю запись доступной через клавиатуру KP2A (рекомендуется).Переключить клавиатуру
@@ -495,6 +498,7 @@
отключеноНайти плагины онлайнОбласти
+ не включено%1$s запрашивает учетные данные для %2$s.%1$s запрашивает учетные данные. Пожалуйста, выберите запись.Включено
@@ -573,6 +577,8 @@
Спросить после ошибкиОтправить отчёт об ошибкеПоказывать клавиатуру для ввода пароля, если сканер отпечатка пальца включен.
+
+Версия 1.04\n * Добавлена функция автоматического ввода для Андроида версий 8.0 и выше.\n * Обновлены библиотеки, инструменты создания и Target SDK версия.\n
Версия 1.03\n
* Удалена спец. служба для автозаполнения в связи с запросом Google. Пожалуйста, просмотрите настройки доступа к паролю, чтобы найти плагин, воспроизводящий предыдущие функции.\n
@@ -860,4 +866,9 @@
Убедитесь, что это работает на вашей системе и используйте встроенную клавиатуру, если нет.Описание предоставлено плагином:
+ Keepass2Android поддерживает функцию автоматического ввода, но, вероятно, вы ещё не включили её.
+ Включить Автоввод
+ Показать помощь по автоматическому вводу
+ Вставить с Keepass2Android
+ Не получается ассоциировать домен %1$s с приложением %2$s
diff --git a/src/keepass2android/Resources/values-sk/strings.xml b/src/keepass2android/Resources/values-sk/strings.xml
index de3532be..3d88aa2e 100644
--- a/src/keepass2android/Resources/values-sk/strings.xml
+++ b/src/keepass2android/Resources/values-sk/strings.xml
@@ -87,8 +87,6 @@
Zapnúť úplné odomknutie odtlačkomZapnúť odomykanie odtlačkom pre rýchle odomknutieDotykový senzor pre odomknutie databázy
- Odomknutie pomocou odtlačku bolo neúspešné. Dešifrovací kľúč bol zneplatnený systémom Android. To sa stáva väčšinou pri zápise nového odtlačku alebo zmene nastavení zabezpečenia. Prosím odomknite pomocou hesla a potom opätovne zapnite odomknutie odtlačkom. Môžete to urobiť v nastaveniach databázy.
- Odomykanie databázy bolo neúspešné: kompozitný kľúč nie je platný. Odomknutie odtlačkom bolo zablokované pretože zrejme nie je už platné uložené primárne heslo. Prosím odomknite pomocou hesla a potom opäť zapnite odomknutie odtlačkom. Môžete to urobiť v nastaveniach databázy.Prosím zapnite Odomknutie odtlačkom pre nové primárne heslo.
Týmto uložíte vaše primárne heslo na tomto zariadení,
diff --git a/src/keepass2android/Resources/values-sl/strings.xml b/src/keepass2android/Resources/values-sl/strings.xml
index 215f8f6f..36aeaf82 100644
--- a/src/keepass2android/Resources/values-sl/strings.xml
+++ b/src/keepass2android/Resources/values-sl/strings.xml
@@ -86,8 +86,6 @@
Omogoči popolno odklepanje s prstnim odtisomOmogoči odklepanje s prstnim odtisom za Hitro odklepanjeTipalo dotika za odklepanje podatkovne zbirke
- Odklepanje s prstnim odtisom je spodletelo. OS Android je razveljavil odšifrirni ključ. To se običajno zgodi, če vpišete nov prstni odtis ali spremenite varnostne nastavitve. Odklenite z geslom in ponovno omogočite odklepanje s prtnim odtisom v nastavitvah podatkovne zbirke.
- Odklepanje podatkovne zbirke je spodletelo: neveljaven sestavljen ključ. Odklepanje s prstnim odtisom je bilo onemogočeno, ker je očitno shranjeno glavno geslo neveljavno. Odklenite s svojim geslom in ponovno omogočite odklepanje s prstnim odtisom v nastavitvah podatkovne zbirke.Ponovno omogočite odklepanje s prstnim odtisom za novo glavno geslo.
To bo shranilo glavno geslo na tej napravi, ki bo
diff --git a/src/keepass2android/Resources/values-sr/strings.xml b/src/keepass2android/Resources/values-sr/strings.xml
index a8ea1134..eea40d89 100644
--- a/src/keepass2android/Resources/values-sr/strings.xml
+++ b/src/keepass2android/Resources/values-sr/strings.xml
@@ -86,8 +86,6 @@
Омогући потпуно Откључавање Отисака прстијуОмогући Откључавање Отисака прстију за Брзо откључавањеДодирни сензор за откључавање базе података
- Откључавање Отисака прстију није успело. Кључ за дешифровање је поништен од Android OS. Ово се обично дешава ако је нови отисак прста био уписан или поставке безбедности промењене. Молимо откључајте са лозинком и омогућите поново Откључавање помоћу отиска прстију у поставкама базе података.
- Откључавање базе података неуспешно: неважећи сложени кључ. Откључавање отиском прста је онемогућено јер главној лозинки је истекао рок важења. Молимо откључајте са вашом лозинком, а затим поново омогућите Откључавање Отисцима прстију у поставкама базе података.Молимо омогућите поново Откључавање Отисцима прстију за нову главну лозинку.
Ово ће ускладиштити вашу главну лозинку на овом уређају, шифровано са Android Keystore и заштићено провером отиском прста, Дозвољава откључавање ваше базе података само са отиском вашег прста.
diff --git a/src/keepass2android/Resources/values-sv/strings.xml b/src/keepass2android/Resources/values-sv/strings.xml
index 22469722..30592225 100644
--- a/src/keepass2android/Resources/values-sv/strings.xml
+++ b/src/keepass2android/Resources/values-sv/strings.xml
@@ -60,7 +60,7 @@
AvbrytUrklippshanteraren rensad.Tidsgräns för urklipp
- Tiden innan användarnamn och lösenord rensas från urklipp
+ Tid innan urklipp rensas efter att användarnamn eller lösenord har kopieratsKopiera användarnamnet till urklippKopiera lösenordet till urklippPosten är tillgänglig via KP2A tangentbord
@@ -87,9 +87,11 @@
Aktivera full fingeravtrycksupplåsningAktivera fingeravtrycksupplåsning för SnabbupplåsningVidrör sensor för att låsa upp databasen
- Fingeravtrycksupplåsning misslyckades. Dekrypteringsnyckeln ogiltligförklarades av Android OS. Detta händer vanligtvis om ett nytt fingeravtryck registrerats eller om säkerhetsinställningarna ändrats. Var god lås upp med ditt lösenord och återaktivera sedan fingeravtrycksupplåsning i databasinställningarna.
- Upplåsning av databasen misslyckades: ogiltig nyckel. Fingeravtrycksupplåsning inaktiverades eftersom det lagrade huvudlösenordet är inte längre giltigt. Vänligen lås upp med ditt lösenord och sedan aktivera fingeravtrycksupplåsning i databasinställningarna.
+ Fingeravtrycksupplåsning misslyckades. Dekrypteringsnyckeln blev ogiltigförklarad av Android. Det händer ofta om ett nytt fingeravtryck har blivit tillagt eller om säkerhetsinställningar har ändrats.
+ Upplåsning av databas misslyckades: felaktig nyckel. Fingeravtrycksupplåsning inaktiverades eftersom att det lagrade huvudlösenordet inte längre är giltigt. Vänligen återaktivera fingeravtrycksupplåsning för det nya huvudlösenordet.
+ Vänligen lås upp med ditt lösenord och återaktivera sedan fingeravtrycksupplåsning i databasinställningarna.
+ Misslyckades att initiera fingeravtrycksavläsare.
Detta kommer att spara ditt huvudlösenord på denna enhet, krypterat med Androids nyckelförvaring och skyddat med fingeravtrycksautenticering. Gör det möjligt att låsa upp din databas endast med ditt fingeravtryck. Tillåter att använda fingeravtrycksautenticering istället för snabbupplåsningskod. Lagrar inte någon information relaterat till ditt huvudlösenord.
@@ -332,6 +334,7 @@ Detta kommer att spara ditt huvudlösenord på denna enhet, krypterat med Androi
Separera aviseringarVisa separata aviseringar för att kopiera användarnamn och lösenord till urklipp och aktivera tangentbordet.Autofyll tillgänglighetstjänst
+ Autofyll-tjänstKP2A tangentbordsaviseringGör hela posten tillgänglig genom KP2A-tangentbordet(rekommenderas).Byt tangentbord
@@ -492,6 +495,7 @@ Detta kommer att spara ditt huvudlösenord på denna enhet, krypterat med Androi
inaktiveradHitta pluginer onlineRättighetsnivåer
+ ej aktiverad%1$s begär autentiseringsuppgifter för %2$s.%1$s begär autentiseringsuppgifter. Vänligen välj en post.Aktiverad
@@ -559,6 +563,10 @@ Filen är skadad. \n Här är några tips som kan hjälpa till att diagnostisera
Fråga efter felSkicka felrapporterVisa Skärmtangentbordet för lösenordsindata när fingeravtrycks-scan är aktiv.
+
+ Version 1.04\n
+ * Lade till Autofyll-service for Android 8.0 and senare.\n
+ * Uppgraderade bibliotek, byggverktyg och mål-SDK-version.\n
Version 1.03
* Tog bort tillgänglighetsservicess för Autofyll vilket var efterfrågat av Google. Var god se lösenordstillgänglighetsinställningen för att hitta ett plugin som återskapar den tidigare funktionen.
@@ -680,4 +688,9 @@ Version 0.9.6\n * Tillåt att importera nyckelfil och/eller lokala databasfil ti
Se till att detta fungerar på ditt system och överväg att använda det inbyggda tangentbordet om inte.Beskrivning av plugin:
+ Keepass2Android stödjer Androids Autofyll-funktion men det ser ut som du inte har aktiverat det ännu.
+ Aktivera Autofyll
+ Visa Autofyll-hjälp
+ Fyll med Keepass2Android
+ Kunde inte associera webbdomän %1$s med app %2$s
diff --git a/src/keepass2android/Resources/values-tr/strings.xml b/src/keepass2android/Resources/values-tr/strings.xml
index e4f8bb56..257b9768 100644
--- a/src/keepass2android/Resources/values-tr/strings.xml
+++ b/src/keepass2android/Resources/values-tr/strings.xml
@@ -7,6 +7,7 @@
Keepass2Android Android üzerinde KeePass 2.x veritabanları için okuma/yazma erişimi sağlayan bir şifre yöneticisidir.Kullanıcı ara yüzü Brian Pellin tarafından geliştirilen KeepasDroid\'e dayanmaktadır. Veritabanı işlemleri Dominik Reichl tarafından geliştirilen KeePass\'a dayanmaktadır. Google tarafından üretilen ve paylaşılan Android robot \"Creative Commons 3.0 Attribution Licence\" kurallarına göre yeniden üretilmiş yada değiştirilmiştir.SFTP desteği BSD lisanslıdır, JCraft, Inc. tarafından oluşturulmuştur.
+ Çekiç simgesi Noun Project sitesinden John Caserta tarafından oluşturuldu. Penguen simgesi Noun Project sitesinden Adriano Emerick tarafından oluşturuldu. Tüy simgesi Noun Project sitesinden Jon Testa tarafından oluşturuldu. Elma simgesi Noun Project sitesinden Ava Rowell tarafından oluşturuldu. Resim simgesi https://icons8.com/icon/5570/Picture adresinden alınmıştır.Kabul etReddetKayıt ekle
@@ -86,9 +87,11 @@
Parmak iziyle açma etkinHızlı açma için parmak izi etkinVeritabanını açmak için dokunmatik sensör
- Parmak iziyle açma başarısız oldu. Şifre çözme anahtarı Android tarafından iptal edildi. Bu genellikle yeni bir parmak izi alındığında veya güvenlik ayarları değiştirildiğinde olur. Lütfen kilidi parolanızla açın ve veritabanı ayarlarından parmak iziyle açmayı yeniden etkinleştirin.
- Veritabanı açma başarısız oldu: Geçersiz bileşik anahtar. Ana parola artık geçerli olmadığından parmak iziyle açma devre dışı bıraklıdı. Lütfen kilidi parolanızla açın ve veritabanı ayarlarından parmak iziyle açmayı yeniden etkinleştirin.
+ Parmak izi kilidi açma işlemi başarısız oldu. Şifre çözme anahtarı Android OS tarafından geçersiz kılınmıştır. Bu genellikle yeni bir parmak izinin kaydedilmesi veya güvenlik ayarlarının değiştirilmesi durumunda olur.
+ Veritabanının kilidini açma başarısız oldu: Geçersiz bileşik anahtar. Görünen olarak saklanan ana parola artık geçerli olmadığından, Parmak İzi Anahtarı kilidi devre dışı bırakıldı. Yeni ana parola için parmak izi kilidini yeniden etkinleştirin.
+ Lütfen şifrenizin kilidini açın ve ardından veritabanı ayarlarında Parmak İzi Anahtarı\'nı tekrar etkinleştirin.
+ Parmak izi sensörünü başlatamadı.
Bu seçenek, ana parolanızı Android Keystore ile şifreler ve parmak iziyle korunacak şekilde saklar. Veritabanınızı sadece parmak izi ile açmanıza izin verir. Çabuk Açma kodu yerine parmak izi doğrulamasına izin verir. Ana parolanız ile ilgili hiçbir verinin depolanmasını gerektirmez.
@@ -286,6 +289,7 @@ Bu seçenek, ana parolanızı Android Keystore ile şifreler ve parmak iziyle k
Ek dosyayı kaydedecek konumu seç.Ek dosyayı SD karta kaydedinEk dosyayı önbelleke kaydet ve aç
+ Dahili resim görüntüleyici ile gösterEk dosya %1$s \'e kaydedildi.Ek dosya %1$s konumuna kaydedilemedi.Arama metni hatırlansınmı?
@@ -329,6 +333,10 @@ Bu seçenek, ana parolanızı Android Keystore ile şifreler ve parmak iziyle k
Kullanıcı adı ve parola bildirim çubuğu ve Pano üzerinden erişilebilir hale getirir. Parola algılayıcılara dikkat edin!BildirimlerKullanıcı adıyla parolayı panoya kopyalamak ve klavyeyi etkinleştirmek için bildirimleri göster.
+ Otomatik Doldur Erişilebilirlik Hizmeti
+ Otomatik Doldurma Hizmeti
+ KP2A klavye bildirimi
+ Tam girişi KP2A klavyesinden erişilebilir yapın (önerilir).Klavyeyi değiştirTarayıcıdan arama yaptıktan sonra KP2A klavyesinden giriş mümkünse klavye seçim iletişim kutusunu açın.Klavyeyi otomatik değiştir
@@ -474,6 +482,10 @@ Bu seçenek, ana parolanızı Android Keystore ile şifreler ve parmak iziyle k
TOTP ayarları alan adıTrayTotp için ayarlar alanının adını buraya girin.TrayTotp
+ Hata ayıklama günlük dosyası
+ Günlük dosyası kullan
+ Uygulama çıktısını yerel bir günlük dosyasına yazın
+ Hata ayıklama günlüğü gönder...Yükleniyor…EklentilerPaket adı:
@@ -483,6 +495,7 @@ Bu seçenek, ana parolanızı Android Keystore ile şifreler ve parmak iziyle k
devre dışıEklentileri online bulKapsam
+ etkin değil%1$s %2$s için kimlik bilgileri talep ediyor.%1$s kimlik bilgileri talep ediyor. Lütfen bir kaydı seçin.Etkin
@@ -562,6 +575,20 @@ Bu seçenek, ana parolanızı Android Keystore ile şifreler ve parmak iziyle k
Hatadan sonra sorHata raporlarını gönderParmak izi tarama etkin olduğunda parola girişi için yazılım klavyesini göster.
+
+Sürüm 1.04 \ n
+ * Android 8.0 ve sonrası için Otomatik Doldurma hizmeti eklendi. \ n
+ * Yükseltilmiş kütüphaneler, araçlar oluşturun ve Target SDK sürümü. \ n
+
+
+
+Sürüm 1.03 \ n
+ * Otomatik Doldurma için Google tarafından istenen erişilebilirlik hizmetini kaldırdı. Önceki işlevleri çoğaltan bir eklenti bulmak için lütfen şifre erişim ayarlarına bakın. \ n
+ * Tekrar depolama seçeneği olarak üçüncü taraf uygulamaları eklendi \ n
+ * Ekli resimleri başka uygulamalara aktarmadan görüntüleyebilmek için tümleşik resim görüntüleyici \ n
+ * Bazı bağlantılarla sorunları düzeltmek için OkHttp\'yi geliştirildi \ n
+ * Buhar girişlerini destekleyen KeeTrayTOTP girdileri için destek \ n
+
Sürüm 1.02\n
* Birkaç güvenlik iyileştirmesi. jean-baptiste.cayrou@thalesgroup.com ve vincent.fargues@thalesgroup.com tarafından hazırlanan güvenlik raporu ve işbirliği için teşekkürler!\n
@@ -865,4 +892,9 @@ Initial public release
Bunun sisteminizde çalıştığından emin olun, eğer çalışmıyorsa yerleşik klavyeyi kullanın.Eklenti tarafından sağlanan açıklama:
+ Keepass2Android, Android\'in Otomatik Doldurma özelliğini destekliyor ancak henüz etkinleştirilmemişe benziyor.
+ Otomatik Doldurmayı Etkinleştir
+ Otomatik doldurma yardımını göster
+ Keepass2Android ile doldurun
+ Web alanı ilişkilendirmek Could %1$s uygulaması ile %2$s
diff --git a/src/keepass2android/Resources/values-uk/strings.xml b/src/keepass2android/Resources/values-uk/strings.xml
index e383e742..c1000cc4 100644
--- a/src/keepass2android/Resources/values-uk/strings.xml
+++ b/src/keepass2android/Resources/values-uk/strings.xml
@@ -87,8 +87,6 @@
Увімкнути повне розблокування відбитками пальцівУвімкнути розблокування відбитками пальців для QuickUnlockТоркніться датчика, щоб розблокувати базу даних
- Не вдалося розблокувати за відбитком пальця. Система Android визнала ключ дешифрування недійсним. Зазвичай це трапляється, коли було зареєстровано новий відбиток пальця, або змінено налаштування безпеки. Будь ласка, розблокуйте за допомогою свого пароля, після чого повторно активуйте розблокування за відбитком пальця в налаштуваннях бази паролів.
- Не вдалося розблокувати базу паролів: Недійсний комбінований ключ. Розблокування за відбитком пальця було вимкнено, тому що схоже, що збережений головний пароль більше не дійсний. Будь ласка, розблокуйте за допомогою свого пароля, після чого повторно активуйте розблокування за відбитком пальця в налаштуваннях бази паролів.Будь ласка, повторно увімкніть розблокування за відбитком пальця для нового головного пароля.
Це збереже ваш головний пароль на цьому пристрої,
diff --git a/src/keepass2android/Resources/values-vi/strings.xml b/src/keepass2android/Resources/values-vi/strings.xml
index b35fd384..83ad54cd 100644
--- a/src/keepass2android/Resources/values-vi/strings.xml
+++ b/src/keepass2android/Resources/values-vi/strings.xml
@@ -7,14 +7,15 @@
Keepass2Android là một ứng dụng quản lý mật khẩu cung cấp quyền truy cập đọc/ghi vào cơ sở dữ liệu KeePass 2.x trên Android.Giao diện người dùng dựa trên một bản chuyển thể từ ứng dụng KeepassDroid phát triển bởi Brian Pellin. Mã cho các thao tác cơ sở dữ liệu dựa trên KeePass bởi Dominik Reichl. Các người máy Android được sao chép hoặc sửa đổi từ công việc tạo ra và chia sẻ của Google và được sử dụng theo điều khoản được mô tả trong Giấy phép Creative Commons Attribution 3.0.Hỗ trợ SFTP được thực hiện bằng cách sử dụng thư viện JSch theo giấy phép BSD, tạo ra bởi JCraft, Inc.
+ Biểu tượng búa được tạo ra bởi John Caserta từ dự án Noun. Biểu tượng chim cánh cụt được tạo ra bởi Adriano Emerick từ dự án Noun. Biểu tượng lông vũ được tạo ra bởi Jon Testa từ dự án Noun. Biểu tượng Apple được tạo ra bởi Ava Rowell từ dự án Noun.Đồng ýTừ chốiThêm mục nhậpSửa mụcTạo mục cho liên kết URLThêm nhóm
- Thêm Nhóm
- Sửa Nhóm
+ Thêm nhóm
+ Sửa nhómThuật toánThuật toánKeepass2Android
@@ -86,8 +87,6 @@
Bật Mở khoá vân tay đầy đủBật Mở khoá vân tay cho Mở khoá nhanhChạm vào cảm biến để mở khoá cơ sở dữ liệu
- Mở khóa vân tay thất bại. Mật khẩu giải mã bị vô hiệu bởi hệ điều hành Android. Điều này thường xảy ra nếu một dấu vân tay mới được đăng ký hoặc cài đặt bảo mật đã được thay đổi. Xin vui lòng mở khóa bằng mật khẩu của bạn và sau đó bật lại mở khóa bằng vân tay trong cài đặt cơ sở dữ liệu.
- Mở khóa cơ sở dữ liệu không thành công: khóa tổng hợp không hợp lệ. Mở khóa vân tay bị vô hiệu hóa vì dường như mật khẩu chủ được lưu trữ không còn hợp lệ. Xin vui lòng mở khóa bằng mật khẩu của bạn và sau đó bật lại dấu vân tay mở khóa trong các cài đặt cơ sở dữ liệu.Xin vui lòng kích hoạt lại mở khóa vân tay cho mật khẩu chủ mới.
Điều này sẽ lưu trữ mật khẩu chủ của bạn trên thiết bị này,
@@ -209,9 +208,11 @@
Loại bỏRijndael (AES)Thư mục gốc
+ Hàm dẫn xuất khóaSố lần lặp mã hóasố lần lặp mã hóa cao cung cấp thêm bảo vệ chống lại cuộc tấn công bạo lực, nhưng có thể làm chậm quá trình tải và lưu.số lần lặp
+ Bộ nhớ cho Argon 2 (bytes)Tên cơ sở dữ liệuTên người dùng mặc định cho các mục mớiĐang lưu cơ sở dữ liệu…
@@ -242,6 +243,7 @@
Lịch sử các phiên bảnKeepass2Android được phát triển bởi Philipp Crocoll.Cám ơn những đóng góp của %1$s.
+ Cảm ơn những sự đóp góp biểu tượng và thiết kế bố cục bởi %1$s.Thư viện mã hóa Twofish cho Keepass được phát triển bởi Scott Greenberg và có sẵn trong KP2A.android-filechooser được phát triển bởi Hai BisonBàn phím KP2A dựa trên bàn phím Gingerbread của Dự án mã nguồn mở Android và sử dụng mã Plugin Manager từ bàn phím của Hacker bởi Klaus Weidner.
@@ -270,6 +272,7 @@
Đóng cơ sở dữ liệuBật QuickUnlock theo mặc địnhTùy chọn để QuickUnlock được kích hoạt theo mặc định hay không.
+ Bảo vệ hiển thị tập tin dữ liệuKhi bật, chụp màn hình sẽ bị vô hiệu hoá và ứng dụng không xuất hiện trong danh sách Ứng dụng gần đây.Dấu biểu tượng QuickUnlockTiếc là QuickUnlock không làm việc mà không hiển thị biểu tượng thông báo. Chọn tùy chọn này để sử dụng một biểu tượng trong suốt.
@@ -284,6 +287,7 @@
Xin vui lòng chọn nơi lưu tập tin đính kèm.Lưu vô thẻ nhớ SDLưu vô bộ nhớ đệm và mở ra
+ Mở bằng trình xem ảnh sẵn có trong ứng dụngĐã lưu tập tin vô %1$s.Không thể lưu tập tin đính kèm vô %1$s.Nhớ văn bản tìm kiếm?
@@ -304,11 +308,15 @@
Sử dụng giao dịch đồng bộ khi ghi cơ sở dữ liệuKhóa khi tắt màn hìnhKhóa cơ sở dữ liệu khi tắt màn hình.
+ Xóa mật khẩu chủ đã nhập
+ Xóa mật khẩu chủ đã nhập khi rời màn hình mà không mở tập tin dữ liệu.Khóa khi thoát ứng dụngKhóa cơ sở dữ liệu khi thoát ứng dụng bằng cách nhấn nút quay lại.Dấu tùy chọn quyên gópThiết lập này dành cho các nhà tài trợ. Nó được bật lên sau khi sử dụng Keepass2Android trong một thời gian ngắn.Nếu không có quyên góp, ứng dụng này sẽ không tồn tại và sẽ không được cải thiện liên tục! Nếu bạn chưa quyên góp, xin vui lòng xem xét làm điều đó bây giờ.
+ Không bao giờ yêu cầu quyên góp
+ Tôi sẽ không cho bạn một xu nào hoặc tôi đã tặng. Đừng yêu cầu đóng góp, ngay cả trong ngày sinh nhật của tác giả.Bộ nhớ đệm cho cơ sở dữ liệuGiữ một bản sao của tập tin cơ sở dữ liệu từ xa trong thư mục bộ nhớ đệm của ứng dụng. Điều này cho phép sử dụng cơ sở dữ liệu từ xa trong trường hợp không có kết nối mạng.Giấy chứng nhận SSL
@@ -323,8 +331,19 @@
Cho phép tên người dùng và mật mã có thể truy cập thông qua thanh thông báo và bộ nhớ nháp. Hãy cẩn thận với kỹ thuật nghe lén mật mã!Thông báo riêngHiện thông báo riêng cho việc sao chép tên người dùng và mật khẩu vào clipboard và bật bàn phím.
+ Dịch vụ Trợ năng tự động điền
+ Thông báo của bàn phím KP2A
+ Cho phép các mục nhập có thể truy cập hoàn toàn thông qua bàn phím KP2A (khuyến khích).Chuyển đổi bàn phímMở hộp thoại lựa chọn bàn phím khi mục có sẵn thông qua bàn phím KP2A sau khi tìm kiếm từ trình duyệt hoặc từ bàn phím.
+ Tự động chuyển đổi bàn phím
+ Chuyển sang bàn phím KP2A một cách tự động khi một tài khoản được chọn. Yêu cầu thiết lập trước KeyboardSwap Plugin một cách chính xác hoặc một thiết bị với quyền root và ứng dụng Secure Settings được thiết lập System+.
+ Cài đặt KeybaordSwap Plugin
+ Plugin này cho phép chuyển đổi sang bàn phím KP2A mà không cần quyền root. Yêu cầu cần có ADB.
+ Tự động chuyển chỉ sau khi tìm kiếm
+ Chỉ chuyển sang bàn phím KP2A một cách tự động sau khi sử dụng phương pháp Chia sẻ đường link URL (nhưng không chuyển khi xem một mục theo bất kỳ cách nào khác)
+ Chuyển lại bàn phím
+ Chuyển lại bàn phím trước đó khi không có mục nào được mở.Biểu tượng của thông báo khi mở khóaHiển thị một thông báo đang diễn ra trong khi cơ sở dữ liệu được mở khóa.Tải tập tin cơ sở dữ liệu trước
@@ -337,6 +356,7 @@
Thùng rácBạn có muốn xóa mục này vĩnh viễn không? Bấm Không để tái chế.Bạn có muốn xóa nhóm này vĩnh viễn không? Bấm Không để tái chế.
+ Bạn có muốn xóa những phần tử này vĩnh viễn không? Bấm Không để đưa vào thùng rác.Bạn có muốn xoá vĩnh viễn mục này không?Bạn có muốn xoá vĩnh viễn nhóm này không?Bạn có muốn xoá vĩnh viễn các mục đã chọn không?
@@ -459,6 +479,10 @@
Tên cài đặt của mục gốc TOTPNhập tên của mục cài đặt cho TrayTotp ở đây.TrayTotp
+ Tập tin log để debug
+ Dùng tập tin log
+ Viết đầu ra của ứng dụng vào một tệp nhật ký cục bộ
+ Gửi nhật ký gỡ lỗi...Đang tải…Các tiện ích bổ sungTên kiện hàng:
@@ -467,6 +491,7 @@
đã kích hoạtkhông kích hoạtTìm các công cụ trực tuyến
+ Phạm vi%1$s đang yêu cầu thông tin đăng nhập cho %2$s.%1$s đang yêu cầu thông tin đăng nhập. Vui lòng chọn một mục.Đã kích hoạt
@@ -483,17 +508,87 @@
Lỗi: Chứng chỉ máy chủ xác nhận không thành công! Hãy cài đặt chứng chỉ gốc phù hợp lên thiết bị của bạn hoặc xem cài đặt!Chọn định dạng tập tinXin lỗi! Keepass2Android đã bị tắt bởi hệ điều hành Android! Vì lý do an ninh, Keepass2Android đã không lưu thông tin đăng nhập bạn đã chọn trên thiết bị, do đó bạn cần phải mở lại cơ sở dữ liệu của bạn. Lưu ý: Chuyện này rất ít khi xảy ra. Nếu có, xin vui lòng gởi cho tôi một tin nhắn tại crocoapps@gmail.com.
+ Tập tin này chỉ tạm thời khả dụng cho Keepass2Android.Tập tin bạn đã chọn chỉ có thể đọc.Tập tin bạn chọn đang ở chế độ chỉ đọc cho Keepass2Android do các giới hạn của hệ điều hành Android 4.4 trở lên.Để sử dụng nó, bạn phải sao chép sang vị trí khác.Để sửa nó, bạn phải sao chép sang vị trí khác.Nhấn OK để chọn nơi sao chép tập tin.Cơ sở dữ liệu chỉ có thể đọc
+ Keepass2Android đã mở dữ liệu trong chế độ chỉ đọc.
+ Có vẻ như bạn đã mở tệp từ ứng dụng bên ngoài. Bằng cách này không hỗ trợ ghi. Nếu bạn muốn thay đổi cơ sở dữ liệu, vui lòng đóng cơ sở dữ liệu và chọn Thay đổi cơ sở dữ liệu. Sau đó, mở tập tin từ một trong những tuỳ chọn có sẵn nếu có thể.
+ Cờ chỉ đọc được đặt. Xóa cờ này nếu bạn muốn sửa cơ sở dữ liệu.
+ Không thể ghi được vì giới hạn được giới thiệu trong Android KitKat. Nếu bạn muốn chỉnh sửa cơ sở dữ liệu, hãy đóng cơ sở dữ liệu và chọn Thay đổi cơ sở dữ liệu. Sau đó, mở tập tin bằng cách sử dụng Lựa chọn tập tin hệ thống.Thêm biểu tượng từ tập tin...Đang sao chép tập tin...
+ Bản sao
+ Mục tiêu chuẩn
+ Mẫu
+ Thẻ căn cước
+ Tên
+ Nơi cấp
+ Ngày cấp
+ E-mail
+ Địa chỉ e-mail
+ Wi-Fi
+ Ghi chú bảo mật
+ SSID
+ Số
+ CVV
+ PIN
+ Chủ thẻ
+ Thẻ tín dụng
+ Thành viênNhật ký các thay đổi
+ Thêm những mẫu?
+ Keepass2Android chứa các mẫu nhập cho tài khoản E-Mail, mật khẩu không dây-LAN, ghi chú bảo mật và hơn thế nữa. Bạn có muốn thêm vào tập tin dữ liệu của bạn? Nếu bạn chọn Không, bạn có thể thêm chúng vào cài đặt cơ sở dữ liệu sau.
+ Thêm các mẫu vào tập tin dữ liệu
+ Xin lưu ý! Đây là bản phát hành bản xem trước và có thể có một số lỗi! Nếu bạn gặp *bất cứ điều gì* không mong đợi, vui lòng cho tôi biết (trong nhóm thử nghiệm beta trên Google+ hoặc qua email).Tiếp tụcURI bạn đã nhập không có dạng tên tập tin. Bạn có chắc chắn đây là tập tin hợp lệ không?
+ Khoá hỗn hợp không hợp lệ. Xin thử lại.
+ Khóa hỗn hợp không hợp lệ! Vui lòng thử các bước sau để mở khóa cơ sở dữ liệu của bạn:\n
+
+ • Đảm bảo bạn đã nhập đúng mật khẩu. Sử dụng biểu tượng mắt để hiển thị mật khẩu đã nhập.\n
+ • Đảm bảo bạn đã chọn đúng loại mật khẩu. Đảm bảo khớp với loại được sử dụng khi tạo tập tin dữ liệu.\n
+ • Đảm bảo bạn đã chọn đúng tệp tập tin dữ liệu.
+
+
+ Tập tin bị hỏng. \n
+ Dưới đây là một số gợi ý có thể giúp chẩn đoán vấn đề:\n
+
+ • Nếu bạn đã sao chép tệp trên USB (Chế độ MTP), vui lòng thử lại với các công cụ như MyPhoneExplorer. MTP cắt bớt các tập tin trong trường hợp nhất định.\n
+ • Nếu bạn không thể mở tệp từ cùng một vị trí trên máy tính của bạn, rất có thể tệp đó thực sự bị hỏng. Hãy sử dụng một bản sao lưu cơ sở dữ liệu sau đó. Nếu bạn cho rằng Keepass2Android đã làm hỏng tệp, hãy liên hệ với bộ phận hỗ trợ.\n
+ • Nếu bạn vẫn có thể mở tệp trên máy tính của mình, vui lòng liên hệ với bộ phận hỗ trợ. Bạn có thể thử lưu nó bằng các cài đặt khác nhau (ví dụ như chưa giải nén) trên máy tính cá nhân và thử mở lại trong Keepass2Android.
+
+
+ Keepass2Android: Đã xảy ra lỗi.
+ Đã xảy ra lỗi không mong muốn trong khi chạy Keepass2Android. Vui lòng giúp chúng tôi khắc phục sự cố này bằng cách cho phép ứng dụng gửi báo cáo lỗi.
+ Các báo cáo lỗi sẽ không bao giờ chứa bất kỳ nội dung nào của cơ sở dữ liệu hoặc mật khẩu chủ. Bạn có thể tắt chúng trong cài đặt ứng dụng.
+ Bật
+ Tắt
+ Hỏi sau khi gặp lỗi
+ Gửi báo cáo lỗi
+ Hiển thị bàn phím ảo để nhập mật khẩu khi quét vân tay đang hoạt động.
+
+ Phiên bản1.03\n
+ * Đã xóa dịch vụ trợ năng cho Tự động điền theo yêu cầu của Google. Vui lòng xem các cài đặt truy cập mật khẩu để tìm một plugin sao chép các chức năng trước đó.\n
+ * Đã thêm ứng dụng của bên thứ ba làm tuỳ chọn lưu trữ một lần nữa\n
+ * Trình xem ảnh tích hợp để xem các hình ảnh đính kèm mà không chuyển chúng sang các ứng dụng khác\n
+ * Nâng cấp OkHttp để khắc phục sự cố với một số kết nối\n
+ * Hỗ trợ cho các mục KeeTrayTOTP, hiện đang hỗ trợ các mục Steam\n
+
+
+ Phiên bản 1.02\n
+ * Một số cải tiến về bảo mật. Cảm ơn rất nhiều về báo cáo bảo mật của jean-baptiste.cayrou@thalesgroup.com và vincent.fargues@thalesgroup.com và về sự hợp tác của họ!\n
+ * Hỗ trợ KeyboardSwapPlugin (xem các tùy chọn truy cập mật khẩu): cho phép tự động chuyển đổi phương thức nhập vào các thiết bị không được root. Cảm ơn Mishaal Rahman từ XDA-Developers để làm điều này có thể thực hiện được.\n
+ * Khắc phục sự cố với Dịch vụ Truy cập với các phiên bản Chrome gần đây\n
+ * Khắc phục sự xóa dữ liệu vân tay không cần thiết\n
+ * Sửa lỗi nhỏ\n
+ * Cập nhật Dropbox SDK để đảm bảo tính tương thích trong tương lai\n
+ * Xóa báo cáo lỗi thông qua Xamarin Insights\n
+ * Cập nhật Công cụ xây dựng\n
+ Phiên bản 0.9.4\n
* thêm hỗ trợ cho công cụ gắn rời: Xem cài đặt để biết cách tải các công cụ!\n
@@ -630,7 +725,16 @@ Bản phát hành chính thức đầu tiênTrung bìnhLớn
+
+ Sáng
+ Tối
+ Thiết kế
+
+ Không mã hoá (FTP)
+ Mã hoá ngầm (FTP qua TLS, FTPS)
+ Mã hoá rõ ràng (FTP qua TLS, FTPS)
+ Không nhớ tên người dùng và mật mãChỉ nhớ tên người dùng thôi
diff --git a/src/keepass2android/Resources/values-zh-rCN/strings.xml b/src/keepass2android/Resources/values-zh-rCN/strings.xml
index df1a7b35..9db3c82e 100644
--- a/src/keepass2android/Resources/values-zh-rCN/strings.xml
+++ b/src/keepass2android/Resources/values-zh-rCN/strings.xml
@@ -11,7 +11,7 @@
拒绝添加条目编辑项目
- 为 URL 创建条目
+ 创建URL条目添加群组添加群组编辑群组
@@ -20,7 +20,7 @@
Keepass2AndroidKP2AKeepass2Android 离线版
- KP2A 离线版
+ KP2A 离线应用程序超时应用程序处于非活动时锁定数据库。结束应用程序进程
@@ -86,8 +86,6 @@
启用完整的指纹解锁对快速解锁启用指纹解锁触摸感应解锁数据库
- 指纹解锁失败.解锁密钥无法通过android操作系统.这一情况通常是在一个新的指纹被设入系统或者在修改过安全设置后产生.请使用你的密码解锁然后在数据库的设置处重新启动指纹解锁.
- 解锁数据库失败:无效的复合密钥.因为很明显主密码已经不再有效了,指纹解锁已被禁用.请用你的密码解锁然后去数据库设置去重新启用指纹解锁.请为这个新的主密码重新启用指纹解锁.这将保存你的主密码在这台设备上.
使用android密码存储库来解密和保护
@@ -109,7 +107,7 @@
密码保存名称
- 链接地址
+ 网址:用户名额外的字符串字段文件附件
@@ -190,7 +188,7 @@
从不是否
- 数据库或群组中无条目。
+ 数据库或群组中无条目无匹配结果没有处理这个链接地址的程序。打开最近数据库(点击打开)
diff --git a/src/keepass2android/Resources/values-zh-rTW/strings.xml b/src/keepass2android/Resources/values-zh-rTW/strings.xml
index e36babe5..d0f7f015 100644
--- a/src/keepass2android/Resources/values-zh-rTW/strings.xml
+++ b/src/keepass2android/Resources/values-zh-rTW/strings.xml
@@ -86,8 +86,6 @@
啟用完整指紋解鎖啟用指紋解鎖進行快速解鎖觸碰指紋感應器以解鎖資料庫
- 指紋解鎖失敗。解密金鑰已被 Android 系統無效化。這通常是因為有新的指紋被加入或是安全性設定被變更了。請以密碼解鎖並於資料庫設定中重新啟用指紋解鎖。
- 資料庫解鎖失敗:無效的金鑰組合。指紋解鎖已被關閉,因為先前所存的主密碼已失效。請以密碼解鎖並於資料庫設定中重新啟用指紋解鎖。請重新為新的主密碼啟用指紋解鎖
這將把主密碼存在你裝置上,
diff --git a/src/keepass2android/Resources/values/config.xml b/src/keepass2android/Resources/values/config.xml
index f2351554..86b60f8c 100644
--- a/src/keepass2android/Resources/values/config.xml
+++ b/src/keepass2android/Resources/values/config.xml
@@ -43,8 +43,8 @@
https://github.com/PhilippC/keepass2android/issuesmarket://details?id=org.openintents.filemanagerhttps://openintents.googlecode.com/files/FileManager-2.0.2.apk
- KP2A Internal File Browsing PermissionKP2A Search
+ KP2A Choose autofill dataset
@@ -96,6 +96,8 @@
QuickUnlock_prefs_keyFileHandling_prefs_keykeyboardswitch_prefs_key
+ AutoFill_prefs_key
+
OfflineMode_key
diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml
index e0b6fb9b..6cca8edc 100644
--- a/src/keepass2android/Resources/values/strings.xml
+++ b/src/keepass2android/Resources/values/strings.xml
@@ -95,9 +95,12 @@
Enable full Fingerprint UnlockEnable Fingerprint Unlock for QuickUnlockTouch sensor to unlock database
- Fingerprint Unlock failed. Decryption key was invalidated by Android OS. This usually happens if a new fingerprint was enrolled or security settings were changed. Please unlock with your password and then re-enabled Fingerprint Unlock in the database settings.
- Unlocking the database failed: Invalid composite key. Fingerprint Unlock was disabled because apparently the stored master password is no longer valid. Please unlock with your password and then re-enabled Fingerprint Unlock in the database settings.
+ Fingerprint Unlock failed. Decryption key was invalidated by Android OS. This usually happens if a new fingerprint was enrolled or security settings were changed.
+ Unlocking the database failed: Invalid composite key. Fingerprint Unlock was disabled because apparently the stored master password is no longer valid. Please re-enable Fingerprint Unlock for the new master password.
+ Please unlock with your password and then re-enable Fingerprint Unlock in the database settings.
+ Failed to initialize fingerprint sensor.
+
This will store your master password on this device, encrypted with the Android Keystore and protected using fingerprint authentication. Allows to unlock your database only with your fingerprint.Allows to use fingerprint authentication instead of the QuickUnlock code. Does not store any information related to your master password.
@@ -368,6 +371,7 @@
Show separate notifications for copying username and password to clipboard and activating the keyboard.AutoFill Accessibility-Service
+ AutoFill ServiceKP2A keyboard notificationMake full entry accessible through the KP2A keyboard (recommended).
@@ -573,6 +577,9 @@
disabledFind plug-ins onlineScopes
+
+
+ not enabled%1$s is requesting credentials for %2$s.%1$s is requesting credentials. Please select an entry.
@@ -685,7 +692,20 @@
Show soft keyboard for password input when fingerprint scan is active.
-
+
+
+ Version 1.04b\n
+ * Avoid crash when user tries to enable Autofill on Huawei devices.\n
+
+
+ Version 1.04\n
+ * Added Autofill service for Android 8.0 and later.\n
+ * Upgraded libraries, build tools and Target SDK version.\n
+
+
+
+
+
Version 1.03\n
* Removed accessibility service for AutoFill as requested by Google. Please see password access settings to find a plugin replicating the previous functionality.\n
* Added third party apps as storage option again\n
@@ -1027,4 +1047,11 @@ Initial public release
Make sure this works on your system and consider using the built-in keyboard if not.Description provided by the plugin:
+ Keepass2Android supports Android\'s Autofill feature but it looks like you haven\'t enabled it yet.
+ Enable Autofill
+ Sorry, it looks like your device does not support opening the settings from inside the app. Please go manually to the system settings for AutoFill to enable the service.
+ Show Autofill help
+ Fill with Keepass2Android
+ Could not associate web domain %1$s with app %2$s
+
diff --git a/src/keepass2android/Resources/xml/autofillservice.xml b/src/keepass2android/Resources/xml/autofillservice.xml
new file mode 100644
index 00000000..f47169a1
--- /dev/null
+++ b/src/keepass2android/Resources/xml/autofillservice.xml
@@ -0,0 +1,4 @@
+
+
diff --git a/src/keepass2android/Resources/xml/preferences.xml b/src/keepass2android/Resources/xml/preferences.xml
index 72c4e1ab..5ab3772e 100644
--- a/src/keepass2android/Resources/xml/preferences.xml
+++ b/src/keepass2android/Resources/xml/preferences.xml
@@ -380,6 +380,12 @@
android:data="https://philippc.github.io/keepass2android/AccServiceAutoFill.html" />
+
+
+
+
(Resource.Id.list_fragment).ListAdapter = new PwGroupListAdapter(this, Group);
View selectOtherEntry = FindViewById (Resource.Id.select_other_entry);
- selectOtherEntry.Click += (sender, e) => {
- GroupActivity.Launch (this, new SelectEntryForUrlTask(url));
+
+ var newTask = new SelectEntryForUrlTask(url);
+ if (AppTask is SelectEntryTask currentSelectTask)
+ newTask.ShowUserNotifications = currentSelectTask.ShowUserNotifications;
+
+ selectOtherEntry.Click += (sender, e) => {
+ GroupActivity.Launch (this, newTask);
};
@@ -154,7 +168,7 @@ namespace keepass2android
createUrlEntry.Visibility = ViewStates.Visible;
createUrlEntry.Click += (sender, e) =>
{
- GroupActivity.Launch(this, new CreateEntryThenCloseTask { Url = url });
+ GroupActivity.Launch(this, new CreateEntryThenCloseTask { Url = url, ShowUserNotifications = (AppTask as SelectEntryTask)?.ShowUserNotifications ?? true });
Toast.MakeText(this, GetString(Resource.String.select_group_then_add, new Java.Lang.Object[] { GetString(Resource.String.add_entry) }), ToastLength.Long).Show();
};
}
@@ -175,11 +189,6 @@ namespace keepass2android
return true;
}
- public override bool BottomBarAlwaysVisible
- {
- get { return true; }
- }
-
protected override int ContentResourceId
{
get { return Resource.Layout.searchurlresults; }
diff --git a/src/keepass2android/app/App.cs b/src/keepass2android/app/App.cs
index 656ac04c..fc859254 100644
--- a/src/keepass2android/app/App.cs
+++ b/src/keepass2android/app/App.cs
@@ -69,15 +69,16 @@ namespace keepass2android
{
#if DEBUG
public const string AppName = "@string/app_name_debug";
+ public const int AppNameResource = Resource.String.app_name_debug;
#else
public const string AppName = "@string/app_name";
+ public const int AppNameResource = Resource.String.app_name;
#endif
- public const int AppNameResource = Resource.String.app_name;
- public const string AppNameShort = "@string/short_app_name" + "DBG";
- public const string AppLauncherTitle = "@string/app_name" + " Debug";
+
+
#if DEBUG
- public const string PackagePart = "keepass2android_debug";
+ public const string PackagePart = "keepass2android_debug";
public const string Searchable = "@xml/searchable_debug";
#else
public const string PackagePart = "keepass2android";
diff --git a/src/keepass2android/app/AppTask.cs b/src/keepass2android/app/AppTask.cs
index d868344c..2b12a81f 100644
--- a/src/keepass2android/app/AppTask.cs
+++ b/src/keepass2android/app/AppTask.cs
@@ -349,7 +349,12 @@ namespace keepass2android
/// ExitAfterTaskComplete. This also allows te specify the flag if we need to display the user notifications.
public class SearchUrlTask: SelectEntryTask
{
- public const String UrlToSearchKey = "UrlToSearch";
+ public SearchUrlTask()
+ {
+ AutoReturnFromQuery = true;
+ }
+
+ public const String UrlToSearchKey = "UrlToSearch";
public string UrlToSearchFor
{
@@ -361,6 +366,7 @@ namespace keepass2android
{
base.Setup(b);
UrlToSearchFor = b.GetString(UrlToSearchKey);
+ AutoReturnFromQuery = b.GetBoolean(AutoReturnFromQueryKey, true);
}
public override IEnumerable Extras
{
@@ -369,9 +375,15 @@ namespace keepass2android
foreach (IExtra e in base.Extras)
yield return e;
yield return new StringExtra { Key=UrlToSearchKey, Value = UrlToSearchFor };
- }
+ yield return new BoolExtra { Key = AutoReturnFromQueryKey, Value = AutoReturnFromQuery };
+ }
}
- public override void AfterUnlockDatabase(PasswordActivity act)
+
+ public const String AutoReturnFromQueryKey = "AutoReturnFromQuery";
+
+ public bool AutoReturnFromQuery { get; set; }
+
+ public override void AfterUnlockDatabase(PasswordActivity act)
{
if (String.IsNullOrEmpty(UrlToSearchFor))
{
@@ -403,6 +415,12 @@ namespace keepass2android
base.PopulatePasswordAccessServiceIntent(intent);
intent.PutExtra(UrlToSearchKey, UrlToSearchFor);
}
+
+ public override void CompleteOnCreateEntryActivity(EntryActivity activity)
+ {
+ App.Kp2a.GetDb().LastOpenedEntry.SearchUrl = UrlToSearchFor;
+ base.CompleteOnCreateEntryActivity(activity);
+ }
}
@@ -516,15 +534,18 @@ namespace keepass2android
public override void CompleteOnCreateEntryActivity(EntryActivity activity)
{
- //if the database is readonly (or no URL exists), don't offer to modify the URL
- if ((App.Kp2a.GetDb().CanWrite == false) || (String.IsNullOrEmpty(UrlToSearchFor)))
+ App.Kp2a.GetDb().LastOpenedEntry.SearchUrl = UrlToSearchFor;
+
+ //if the database is readonly (or no URL exists), don't offer to modify the URL
+ if ((App.Kp2a.GetDb().CanWrite == false) || (String.IsNullOrEmpty(UrlToSearchFor)))
{
base.CompleteOnCreateEntryActivity(activity);
return;
}
+
- AskAddUrlThenCompleteCreate(activity, UrlToSearchFor);
+ AskAddUrlThenCompleteCreate(activity, UrlToSearchFor);
}
diff --git a/src/keepass2android/fileselect/FileDbHelper.cs b/src/keepass2android/fileselect/FileDbHelper.cs
index 3ef3deb1..7e01e3d5 100644
--- a/src/keepass2android/fileselect/FileDbHelper.cs
+++ b/src/keepass2android/fileselect/FileDbHelper.cs
@@ -36,7 +36,7 @@ namespace keepass2android
private const String FileTable = "files";
private const int DatabaseVersion = 1;
- private const int MaxFiles = 5;
+ private const int MaxFiles = 15;
public const String KeyFileId = "_id";
public const String KeyFileFilename = "fileName";
@@ -142,7 +142,7 @@ namespace keepass2android
result = mDb.Insert(FileTable, null, vals);
}
- // Delete all but the last five records
+ // Delete all but the last X records
try {
DeleteAllBut(MaxFiles);
} catch (Exception ex) {
diff --git a/src/keepass2android/keepass2android.csproj b/src/keepass2android/keepass2android.csproj
index 707835cd..6e8e8c6c 100644
--- a/src/keepass2android/keepass2android.csproj
+++ b/src/keepass2android/keepass2android.csproj
@@ -1,5 +1,6 @@
+ DebugAnyCPU
@@ -15,11 +16,12 @@
keepass2androidOnLoadProperties\AndroidManifest.xml
- v7.1
+ v8.01G
- true
- 9e78b013
+ false
+
+ True
@@ -41,10 +43,12 @@
armeabi,armeabi-v7a,x86falseSdkOnly
- False
+ falseFalse
- False
+ falsetrue
+ false
+ falsefull
@@ -65,11 +69,11 @@
System.Core%3bTrueSdkOnly
- False
+ falseFalseXamarin
- False
- False
+ false
+ falseFalsetrueFalse
@@ -101,17 +105,56 @@
-
- ..\packages\Xamarin.Android.Support.v7.MediaRouter.21.0.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.MediaRouter.dll
+
+ ..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\lib\MonoAndroid80\Xamarin.Android.Arch.Core.Common.dll
-
- ..\packages\Xamarin.Android.Support.v4.22.2.1.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
+
+ ..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\lib\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.dll
-
- ..\packages\Xamarin.Android.Support.v7.AppCompat.22.2.1.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll
+
+ ..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\lib\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.dll
-
- ..\packages\Xamarin.Android.Support.Design.22.2.1.0\lib\MonoAndroid403\Xamarin.Android.Support.Design.dll
+
+ ..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Animated.Vector.Drawable.dll
+
+
+ ..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Annotations.dll
+
+
+ ..\packages\Xamarin.Android.Support.Compat.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Compat.dll
+
+
+ ..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Core.UI.dll
+
+
+ ..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Core.Utils.dll
+
+
+ ..\packages\Xamarin.Android.Support.Design.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Design.dll
+
+
+ ..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Fragment.dll
+
+
+ ..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Media.Compat.dll
+
+
+ ..\packages\Xamarin.Android.Support.Transition.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Transition.dll
+
+
+ ..\packages\Xamarin.Android.Support.v13.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v13.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.RecyclerView.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v7.RecyclerView.dll
+
+
+ ..\packages\Xamarin.Android.Support.Vector.Drawable.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Vector.Drawable.dll
@@ -173,6 +216,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -197,7 +255,6 @@
-
@@ -872,12 +929,6 @@
Designer
-
-
- 22.2.0.0
- False
-
-
@@ -1703,10 +1754,72 @@
+
+
+
+
+
+
+
+
+ False
+ 25.1.1.0
+
+
+ False
+ 25.1.1.0
+
+
+ False
+ 25.1.1.0
+
+
+
+
+ Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/keepass2android/packages.config b/src/keepass2android/packages.config
index 1a50c8bb..fefffd38 100644
--- a/src/keepass2android/packages.config
+++ b/src/keepass2android/packages.config
@@ -3,11 +3,25 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/keepass2android/search/SearchResults.cs b/src/keepass2android/search/SearchResults.cs
index d45dcf77..48042ad9 100644
--- a/src/keepass2android/search/SearchResults.cs
+++ b/src/keepass2android/search/SearchResults.cs
@@ -50,8 +50,8 @@ namespace keepass2android.search
if ( IsFinishing ) {
return;
}
-
- SetResult(KeePass.ExitNormal);
+
+ SetResult(KeePass.ExitNormal);
ProcessIntent(Intent);
}
diff --git a/src/keepass2android/services/AutofillBase/AutofillFieldMetadata.cs b/src/keepass2android/services/AutofillBase/AutofillFieldMetadata.cs
new file mode 100644
index 00000000..28c19adc
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/AutofillFieldMetadata.cs
@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Android.App.Assist;
+using Android.Service.Autofill;
+using Android.Views;
+using Android.Views.Autofill;
+
+namespace keepass2android.services.AutofillBase
+{
+ ///
+ /// A stripped down version of a {@link ViewNode} that contains only autofill-relevant metadata. It
+ /// also contains a {@code mSaveType} flag that is calculated based on the {@link ViewNode}]'s
+ /// autofill hints.
+ ///
+ public class AutofillFieldMetadata
+ {
+ public SaveDataType SaveType { get; set; }
+
+ public string[] AutofillCanonicalHints { get; set; }
+
+ public AutofillId AutofillId { get; }
+ public AutofillType AutofillType { get; }
+ string[] AutofillOptions { get; }
+ public bool Focused { get; }
+
+ public AutofillFieldMetadata(AssistStructure.ViewNode view)
+ : this(view, view.GetAutofillHints())
+ {
+
+ }
+
+
+ public AutofillFieldMetadata(AssistStructure.ViewNode view, string[] autofillHints)
+ {
+ AutofillId = view.AutofillId;
+ AutofillType = view.AutofillType;
+ AutofillOptions = view.GetAutofillOptions();
+ Focused = view.IsFocused;
+ var supportedHints = AutofillHintsHelper.FilterForSupportedHints(autofillHints);
+ var canonicalHints = AutofillHintsHelper.ConvertToCanonicalHints(supportedHints);
+ SetHints(canonicalHints.ToArray());
+
+ }
+
+ void SetHints(string[] value)
+ {
+ AutofillCanonicalHints = value;
+ UpdateSaveTypeFromHints();
+ }
+
+ ///
+ /// When the ViewNode is a list that the user needs to choose a string from (i.e. a
+ /// spinner), this is called to return the index of a specific item in the list.
+ ///
+ /// The autofill option index.
+ /// Value.
+ public int GetAutofillOptionIndex(String value)
+ {
+ for (int i = 0; i < AutofillOptions.Length; i++)
+ {
+ if (AutofillOptions[i].Equals(value))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ static readonly HashSet _creditCardHints = new HashSet(StringComparer.OrdinalIgnoreCase)
+ {
+ View.AutofillHintCreditCardExpirationDate,
+ View.AutofillHintCreditCardExpirationDay,
+ View.AutofillHintCreditCardExpirationMonth,
+ View.AutofillHintCreditCardExpirationYear,
+ View.AutofillHintCreditCardNumber,
+ View.AutofillHintCreditCardSecurityCode
+ };
+
+ static readonly HashSet _addressHints = new HashSet(StringComparer.OrdinalIgnoreCase)
+ {
+ View.AutofillHintPostalAddress,
+ View.AutofillHintPostalCode
+ };
+
+ void UpdateSaveTypeFromHints()
+ {
+ SaveType = 0;
+ if (AutofillCanonicalHints == null)
+ {
+ return;
+ }
+ if (AutofillCanonicalHints.Any(h => _creditCardHints.Contains(h)))
+ {
+ SaveType |= SaveDataType.CreditCard;
+ }
+ if (AutofillCanonicalHints.Any(h => h.Equals(View.AutofillHintEmailAddress, StringComparison.OrdinalIgnoreCase)))
+ SaveType |= SaveDataType.EmailAddress;
+ if (AutofillCanonicalHints.Any(h => _addressHints.Contains(h)))
+ {
+ SaveType |= SaveDataType.Address;
+ }
+ if (AutofillCanonicalHints.Any(h => h.Equals(View.AutofillHintUsername, StringComparison.OrdinalIgnoreCase)))
+ SaveType |= SaveDataType.Username;
+
+ if (AutofillCanonicalHints.Any(h => h.Equals(View.AutofillHintPassword, StringComparison.OrdinalIgnoreCase)))
+ {
+ SaveType |= SaveDataType.Password;
+ SaveType &= ~SaveDataType.EmailAddress;
+ SaveType &= ~SaveDataType.Username;
+ }
+ }
+ }
+}
diff --git a/src/keepass2android/services/AutofillBase/AutofillFieldMetadataCollection.cs b/src/keepass2android/services/AutofillBase/AutofillFieldMetadataCollection.cs
new file mode 100644
index 00000000..30b44756
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/AutofillFieldMetadataCollection.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Android.Service.Autofill;
+using Android.Views.Autofill;
+
+namespace keepass2android.services.AutofillBase
+{
+ ///
+ /// Data structure that stores a collection of AutofillFieldMetadatas. Contains all of the
+ /// client's View hierarchy autofill-relevant metadata.
+ ///
+ public class AutofillFieldMetadataCollection
+ {
+ readonly List AutofillIds = new List();
+
+ readonly Dictionary> AutofillCanonicalHintsToFieldsMap = new Dictionary>();
+
+ public List AllAutofillCanonicalHints { get; }
+ public List FocusedAutofillCanonicalHints { get; }
+ int Size = 0;
+ public SaveDataType SaveType { get; set; }
+
+ public bool Empty
+ {
+ get { return Size == 0; }
+ }
+
+ public AutofillFieldMetadataCollection()
+ {
+ SaveType = 0;
+ FocusedAutofillCanonicalHints = new List();
+ AllAutofillCanonicalHints = new List();
+ }
+
+ public void Add(AutofillFieldMetadata autofillFieldMetadata)
+ {
+ var hintsList = autofillFieldMetadata.AutofillCanonicalHints;
+ if (!hintsList.Any())
+ return;
+ if (AutofillIds.Contains(autofillFieldMetadata.AutofillId))
+ return;
+ SaveType |= autofillFieldMetadata.SaveType;
+ Size++;
+ AutofillIds.Add(autofillFieldMetadata.AutofillId);
+
+ AllAutofillCanonicalHints.AddRange(hintsList);
+ if (autofillFieldMetadata.Focused)
+ {
+ FocusedAutofillCanonicalHints.AddRange(hintsList);
+ }
+ foreach (var hint in hintsList)
+ {
+ if (!AutofillCanonicalHintsToFieldsMap.ContainsKey(hint))
+ {
+ AutofillCanonicalHintsToFieldsMap.Add(hint, new List());
+ }
+ AutofillCanonicalHintsToFieldsMap[hint].Add(autofillFieldMetadata);
+ }
+ }
+
+ public AutofillId[] GetAutofillIds()
+ {
+ return AutofillIds.ToArray();
+ }
+
+ ///
+ /// returns the fields for the given hint or an empty list.
+ ///
+ public List GetFieldsForHint(String canonicalHint)
+ {
+ List result;
+ if (!AutofillCanonicalHintsToFieldsMap.TryGetValue(canonicalHint, out result))
+ {
+ result = new List();
+ }
+ return result;
+ }
+
+
+ }
+}
diff --git a/src/keepass2android/services/AutofillBase/AutofillHelper.cs b/src/keepass2android/services/AutofillBase/AutofillHelper.cs
new file mode 100644
index 00000000..003677ff
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/AutofillHelper.cs
@@ -0,0 +1,49 @@
+using System;
+using Android.Content;
+using Android.Service.Autofill;
+using Android.Util;
+using Android.Views;
+using Android.Widget;
+using FilledAutofillFieldCollection = keepass2android.services.AutofillBase.model.FilledAutofillFieldCollection;
+
+namespace keepass2android.services.AutofillBase
+{
+ ///
+ /// This is a class containing helper methods for building Autofill Datasets and Responses.
+ ///
+ public class AutofillHelper
+ {
+ ///
+ /// Wraps autofill data in a LoginCredential Dataset object which can then be sent back to the
+ /// client View.
+ ///
+ /// The dataset.
+ /// Context.
+ /// Autofill fields.
+ /// Filled autofill field collection.
+ public static Dataset NewDataset(Context context,
+ AutofillFieldMetadataCollection autofillFields, FilledAutofillFieldCollection filledAutofillFieldCollection, IAutofillIntentBuilder intentBuilder)
+ {
+ var datasetName = filledAutofillFieldCollection.DatasetName;
+ if (datasetName != null)
+ {
+ var datasetBuilder = new Dataset.Builder(NewRemoteViews(context.PackageName, datasetName, intentBuilder.AppIconResource));
+
+ var setValueAtLeastOnce = filledAutofillFieldCollection.ApplyToFields(autofillFields, datasetBuilder);
+ if (setValueAtLeastOnce)
+ {
+ return datasetBuilder.Build();
+ }
+ }
+ return null;
+ }
+
+ public static RemoteViews NewRemoteViews(string packageName, string remoteViewsText,int drawableId)
+ {
+ RemoteViews presentation = new RemoteViews(packageName, Resource.Layout.autofill_service_list_item);
+ presentation.SetTextViewText(Resource.Id.text, remoteViewsText);
+ presentation.SetImageViewResource(Resource.Id.icon, drawableId);
+ return presentation;
+ }
+ }
+}
diff --git a/src/keepass2android/services/AutofillBase/AutofillHintsHelper.cs b/src/keepass2android/services/AutofillBase/AutofillHintsHelper.cs
new file mode 100644
index 00000000..b0536bf4
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/AutofillHintsHelper.cs
@@ -0,0 +1,256 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Android.App;
+using Android.Content;
+using Android.OS;
+using Android.Runtime;
+using Android.Util;
+using Android.Views;
+using Android.Widget;
+using keepass2android.services.AutofillBase.model;
+
+namespace keepass2android.services.AutofillBase
+{
+ class AutofillHintsHelper
+ {
+ private static readonly HashSet _allSupportedHints = new HashSet(StringComparer.OrdinalIgnoreCase)
+ {
+ View.AutofillHintCreditCardExpirationDate,
+ View.AutofillHintCreditCardExpirationDay,
+ View.AutofillHintCreditCardExpirationMonth,
+ View.AutofillHintCreditCardExpirationYear,
+ View.AutofillHintCreditCardNumber,
+ View.AutofillHintCreditCardSecurityCode,
+ View.AutofillHintEmailAddress,
+ View.AutofillHintPhone,
+ View.AutofillHintName,
+ View.AutofillHintPassword,
+ View.AutofillHintPostalAddress,
+ View.AutofillHintPostalCode,
+ View.AutofillHintUsername,
+ W3cHints.HONORIFIC_PREFIX,
+ W3cHints.NAME,
+ W3cHints.GIVEN_NAME,
+ W3cHints.ADDITIONAL_NAME,
+ W3cHints.FAMILY_NAME,
+ W3cHints.HONORIFIC_SUFFIX,
+ W3cHints.USERNAME,
+ W3cHints.NEW_PASSWORD,
+ W3cHints.CURRENT_PASSWORD,
+ W3cHints.ORGANIZATION_TITLE,
+ W3cHints.ORGANIZATION,
+ W3cHints.STREET_ADDRESS,
+ W3cHints.ADDRESS_LINE1,
+ W3cHints.ADDRESS_LINE2,
+ W3cHints.ADDRESS_LINE3,
+ W3cHints.ADDRESS_LEVEL4,
+ W3cHints.ADDRESS_LEVEL3,
+ W3cHints.ADDRESS_LEVEL2,
+ W3cHints.ADDRESS_LEVEL1,
+ W3cHints.COUNTRY,
+ W3cHints.COUNTRY_NAME,
+ W3cHints.POSTAL_CODE,
+ W3cHints.CC_NAME,
+ W3cHints.CC_GIVEN_NAME,
+ W3cHints.CC_ADDITIONAL_NAME,
+ W3cHints.CC_FAMILY_NAME,
+ W3cHints.CC_NUMBER,
+ W3cHints.CC_EXPIRATION,
+ W3cHints.CC_EXPIRATION_MONTH,
+ W3cHints.CC_EXPIRATION_YEAR,
+ W3cHints.CC_CSC,
+ W3cHints.CC_TYPE,
+ W3cHints.TRANSACTION_CURRENCY,
+ W3cHints.TRANSACTION_AMOUNT,
+ W3cHints.LANGUAGE,
+ W3cHints.BDAY,
+ W3cHints.BDAY_DAY,
+ W3cHints.BDAY_MONTH,
+ W3cHints.BDAY_YEAR,
+ W3cHints.SEX,
+ W3cHints.URL,
+ W3cHints.PHOTO,
+ W3cHints.TEL,
+ W3cHints.TEL_COUNTRY_CODE,
+ W3cHints.TEL_NATIONAL,
+ W3cHints.TEL_AREA_CODE,
+ W3cHints.TEL_LOCAL,
+ W3cHints.TEL_LOCAL_PREFIX,
+ W3cHints.TEL_LOCAL_SUFFIX,
+ W3cHints.TEL_EXTENSION,
+ W3cHints.EMAIL,
+ W3cHints.IMPP,
+ };
+
+ private static readonly List> partitionsOfCanonicalHints = new List>()
+ {
+
+ new HashSet(StringComparer.OrdinalIgnoreCase)
+ {
+ View.AutofillHintEmailAddress,
+ View.AutofillHintPhone,
+ View.AutofillHintName,
+ View.AutofillHintPassword,
+ View.AutofillHintUsername,
+ W3cHints.HONORIFIC_PREFIX,
+ W3cHints.NAME,
+ W3cHints.GIVEN_NAME,
+ W3cHints.ADDITIONAL_NAME,
+ W3cHints.FAMILY_NAME,
+ W3cHints.HONORIFIC_SUFFIX,
+ W3cHints.ORGANIZATION_TITLE,
+ W3cHints.ORGANIZATION,
+ W3cHints.LANGUAGE,
+ W3cHints.BDAY,
+ W3cHints.BDAY_DAY,
+ W3cHints.BDAY_MONTH,
+ W3cHints.BDAY_YEAR,
+ W3cHints.SEX,
+ W3cHints.URL,
+ W3cHints.PHOTO,
+ W3cHints.TEL,
+ W3cHints.TEL_COUNTRY_CODE,
+ W3cHints.TEL_NATIONAL,
+ W3cHints.TEL_AREA_CODE,
+ W3cHints.TEL_LOCAL,
+ W3cHints.TEL_LOCAL_PREFIX,
+ W3cHints.TEL_LOCAL_SUFFIX,
+ W3cHints.TEL_EXTENSION,
+ W3cHints.IMPP,
+ },
+ new HashSet(StringComparer.OrdinalIgnoreCase)
+ {
+ View.AutofillHintPostalAddress,
+ View.AutofillHintPostalCode,
+
+ W3cHints.STREET_ADDRESS,
+ W3cHints.ADDRESS_LINE1,
+ W3cHints.ADDRESS_LINE2,
+ W3cHints.ADDRESS_LINE3,
+ W3cHints.ADDRESS_LEVEL4,
+ W3cHints.ADDRESS_LEVEL3,
+ W3cHints.ADDRESS_LEVEL2,
+ W3cHints.ADDRESS_LEVEL1,
+ W3cHints.COUNTRY,
+ W3cHints.COUNTRY_NAME
+ },
+ new HashSet(StringComparer.OrdinalIgnoreCase)
+ {
+ View.AutofillHintCreditCardExpirationDate,
+ View.AutofillHintCreditCardExpirationDay,
+ View.AutofillHintCreditCardExpirationMonth,
+ View.AutofillHintCreditCardExpirationYear,
+ View.AutofillHintCreditCardNumber,
+ View.AutofillHintCreditCardSecurityCode,
+
+ W3cHints.CC_NAME,
+ W3cHints.CC_GIVEN_NAME,
+ W3cHints.CC_ADDITIONAL_NAME,
+ W3cHints.CC_FAMILY_NAME,
+ W3cHints.CC_TYPE,
+ W3cHints.TRANSACTION_CURRENCY,
+ W3cHints.TRANSACTION_AMOUNT,
+ },
+
+ };
+
+ private static readonly Dictionary hintToCanonicalReplacement= new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ {W3cHints.EMAIL, View.AutofillHintEmailAddress},
+ {W3cHints.USERNAME, View.AutofillHintUsername},
+ {W3cHints.CURRENT_PASSWORD, View.AutofillHintPassword},
+ {W3cHints.NEW_PASSWORD, View.AutofillHintPassword},
+ {W3cHints.CC_EXPIRATION_MONTH, View.AutofillHintCreditCardExpirationMonth },
+ {W3cHints.CC_EXPIRATION_YEAR, View.AutofillHintCreditCardExpirationYear },
+ {W3cHints.CC_EXPIRATION, View.AutofillHintCreditCardExpirationDate },
+ {W3cHints.CC_NUMBER, View.AutofillHintCreditCardNumber },
+ {W3cHints.CC_CSC, View.AutofillHintCreditCardSecurityCode },
+ {W3cHints.POSTAL_CODE, View.AutofillHintPostalCode },
+
+
+ };
+
+ public static bool IsSupportedHint(string hint)
+ {
+ return _allSupportedHints.Contains(hint);
+ }
+
+
+ public static string[] FilterForSupportedHints(string[] hints)
+ {
+ var filteredHints = new string[hints.Length];
+ int i = 0;
+ foreach (var hint in hints)
+ {
+ if (IsSupportedHint(hint))
+ {
+ filteredHints[i++] = hint;
+ }
+ else
+ {
+ CommonUtil.logd("Invalid autofill hint: " + hint);
+ }
+ }
+ var finalFilteredHints = new string[i];
+ Array.Copy(filteredHints, 0, finalFilteredHints, 0, i);
+ return finalFilteredHints;
+ }
+
+
+
+ ///
+ /// transforms hints by replacing some W3cHints by their Android counterparts and transforming everything to lowercase
+ ///
+ public static List ConvertToCanonicalHints(string[] supportedHints)
+ {
+ List result = new List();
+ foreach (string hint in supportedHints)
+ {
+ string canonicalHint;
+ if (!hintToCanonicalReplacement.TryGetValue(hint, out canonicalHint))
+ canonicalHint = hint;
+ result.Add(canonicalHint.ToLower());
+ }
+ return result;
+
+ }
+
+ public static int GetPartitionIndex(string hint)
+ {
+ for (int i = 0; i < partitionsOfCanonicalHints.Count; i++)
+ {
+ if (partitionsOfCanonicalHints[i].Contains(hint))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public static FilledAutofillFieldCollection FilterForPartition(FilledAutofillFieldCollection autofillFields, int partitionIndex)
+ {
+ FilledAutofillFieldCollection filteredCollection =
+ new FilledAutofillFieldCollection {DatasetName = autofillFields.DatasetName};
+
+ if (partitionIndex == -1)
+ return filteredCollection;
+
+ foreach (var field in autofillFields.HintMap.Values.Distinct())
+ {
+ foreach (var hint in field.AutofillHints)
+ {
+ if (GetPartitionIndex(hint) == partitionIndex)
+ {
+ filteredCollection.Add(field);
+ break;
+ }
+ }
+ }
+
+ return filteredCollection;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/keepass2android/services/AutofillBase/AutofillServiceBase.cs b/src/keepass2android/services/AutofillBase/AutofillServiceBase.cs
new file mode 100644
index 00000000..352bc50e
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/AutofillServiceBase.cs
@@ -0,0 +1,163 @@
+using System;
+using System.Linq;
+using Android.Content;
+using Android.OS;
+using Android.Runtime;
+using Android.Service.Autofill;
+using Android.Util;
+using Android.Views.Autofill;
+using Android.Widget;
+using keepass2android.services.AutofillBase.model;
+
+namespace keepass2android.services.AutofillBase
+{
+ public interface IAutofillIntentBuilder
+ {
+ IntentSender GetAuthIntentSenderForResponse(Context context, string query, bool isManualRequest, bool autoReturnFromQuery);
+ Intent GetRestartAppIntent(Context context);
+
+ int AppIconResource { get; }
+ }
+
+ public abstract class AutofillServiceBase: AutofillService
+ {
+ public AutofillServiceBase()
+ {
+
+ }
+
+ public AutofillServiceBase(IntPtr javaReference, JniHandleOwnership transfer)
+ : base(javaReference, transfer)
+ {
+ }
+
+
+ public override void OnFillRequest(FillRequest request, CancellationSignal cancellationSignal, FillCallback callback)
+ {
+ bool isManual = (request.Flags & FillRequest.FlagManualRequest) != 0;
+ CommonUtil.logd( "onFillRequest " + (isManual ? "manual" : "auto"));
+ var structure = request.FillContexts[request.FillContexts.Count - 1].Structure;
+
+ //TODO support package signature verification as soon as this is supported in Keepass storage
+
+ var clientState = request.ClientState;
+ CommonUtil.logd( "onFillRequest(): data=" + CommonUtil.BundleToString(clientState));
+
+
+ cancellationSignal.CancelEvent += (sender, e) => {
+ Log.Warn(CommonUtil.Tag, "Cancel autofill not implemented yet.");
+ };
+ // Parse AutoFill data in Activity
+ string query = null;
+ var parser = new StructureParser(this, structure);
+ try
+ {
+ query = parser.ParseForFill(isManual);
+
+ }
+ catch (Java.Lang.SecurityException e)
+ {
+ Log.Warn(CommonUtil.Tag, "Security exception handling request");
+ callback.OnFailure(e.Message);
+ return;
+ }
+
+ AutofillFieldMetadataCollection autofillFields = parser.AutofillFields;
+
+
+ var autofillIds = autofillFields.GetAutofillIds();
+ if (autofillIds.Length != 0 && CanAutofill(query))
+ {
+ var responseBuilder = new FillResponse.Builder();
+
+ var entryDataset = AddEntryDataset(query, parser);
+ bool hasEntryDataset = entryDataset != null;
+ if (entryDataset != null)
+ responseBuilder.AddDataset(entryDataset);
+
+ AddQueryDataset(query, isManual, autofillIds, responseBuilder, !hasEntryDataset);
+ responseBuilder.SetSaveInfo(new SaveInfo.Builder(parser.AutofillFields.SaveType,
+ parser.AutofillFields.GetAutofillIds()).Build());
+
+ callback.OnSuccess(responseBuilder.Build());
+ }
+ else
+ {
+ callback.OnSuccess(null);
+ }
+ }
+
+ private Dataset AddEntryDataset(string query, StructureParser parser)
+ {
+ var filledAutofillFieldCollection = GetSuggestedEntry(query);
+ if (filledAutofillFieldCollection == null)
+ return null;
+ int partitionIndex = AutofillHintsHelper.GetPartitionIndex(parser.AutofillFields.FocusedAutofillCanonicalHints.FirstOrDefault());
+ FilledAutofillFieldCollection partitionData = AutofillHintsHelper.FilterForPartition(filledAutofillFieldCollection, partitionIndex);
+
+ return AutofillHelper.NewDataset(this, parser.AutofillFields, partitionData, IntentBuilder);
+ }
+
+ protected abstract FilledAutofillFieldCollection GetSuggestedEntry(string query);
+
+ private void AddQueryDataset(string query, bool isManual, AutofillId[] autofillIds, FillResponse.Builder responseBuilder, bool autoReturnFromQuery)
+ {
+ var sender = IntentBuilder.GetAuthIntentSenderForResponse(this, query, isManual, autoReturnFromQuery);
+ RemoteViews presentation = AutofillHelper.NewRemoteViews(PackageName,
+ GetString(Resource.String.autofill_sign_in_prompt), AppNames.LauncherIcon);
+
+ var datasetBuilder = new Dataset.Builder(presentation);
+ datasetBuilder.SetAuthentication(sender);
+ //need to add placeholders so we can directly fill after ChooseActivity
+ foreach (var autofillId in autofillIds)
+ {
+ datasetBuilder.SetValue(autofillId, AutofillValue.ForText("PLACEHOLDER"));
+ }
+
+ responseBuilder.AddDataset(datasetBuilder.Build());
+ }
+
+ private bool CanAutofill(string query)
+ {
+ return !(query == "androidapp://android" || query == "androidapp://"+this.PackageName);
+ }
+
+ public override void OnSaveRequest(SaveRequest request, SaveCallback callback)
+ {
+
+ var structure = request.FillContexts?.LastOrDefault()?.Structure;
+ if (structure == null)
+ {
+ return;
+ }
+
+ var parser = new StructureParser(this, structure);
+ string query = parser.ParseForSave();
+ try
+ {
+ HandleSaveRequest(parser, query);
+ callback.OnSuccess();
+ }
+ catch (Exception e)
+ {
+ callback.OnFailure(e.Message);
+ }
+
+ }
+
+ protected abstract void HandleSaveRequest(StructureParser parser, string query);
+
+
+ public override void OnConnected()
+ {
+ CommonUtil.logd( "onConnected");
+ }
+
+ public override void OnDisconnected()
+ {
+ CommonUtil.logd( "onDisconnected");
+ }
+
+ public abstract IAutofillIntentBuilder IntentBuilder{get;}
+ }
+}
diff --git a/src/keepass2android/services/AutofillBase/ChooseForAutofillActivityBase.cs b/src/keepass2android/services/AutofillBase/ChooseForAutofillActivityBase.cs
new file mode 100644
index 00000000..f088cc26
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/ChooseForAutofillActivityBase.cs
@@ -0,0 +1,135 @@
+using System;
+using Android.App;
+using Android.App.Assist;
+using Android.Content;
+using Android.OS;
+using Android.Service.Autofill;
+using Android.Support.V7.App;
+using Android.Util;
+using Android.Views.Autofill;
+using Android.Widget;
+using Java.Util;
+using keepass2android.services.AutofillBase.model;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace keepass2android.services.AutofillBase
+{
+
+ public abstract class ChooseForAutofillActivityBase : AppCompatActivity
+ {
+ protected Intent ReplyIntent;
+
+
+ public static string ExtraQueryString => "EXTRA_QUERY_STRING";
+ public static string ExtraIsManualRequest => "EXTRA_IS_MANUAL_REQUEST";
+ public static string ExtraAutoReturnFromQuery => "EXTRA_AUTO_RETURN_FROM_QUERY";
+
+ public int RequestCodeQuery => 6245;
+
+ protected override void OnCreate(Bundle savedInstanceState)
+ {
+ base.OnCreate(savedInstanceState);
+
+ //if launched from history, don't re-use the task. Proceed to FileSelect instead.
+ if (Intent.Flags.HasFlag(ActivityFlags.LaunchedFromHistory))
+ {
+ Kp2aLog.Log("Forwarding to FileSelect. QueryCredentialsActivity started from history.");
+ RestartApp();
+ return;
+ }
+
+ string requestedUrl = Intent.GetStringExtra(ExtraQueryString);
+ if (requestedUrl == null)
+ {
+ Toast.MakeText(this, "Cannot execute query for null.", ToastLength.Long).Show();
+ RestartApp();
+ return;
+ }
+
+ var i = GetQueryIntent(requestedUrl, Intent.GetBooleanExtra(ExtraAutoReturnFromQuery, true));
+ StartActivityForResult(i, RequestCodeQuery);
+ }
+
+ protected abstract Intent GetQueryIntent(string requestedUrl, bool autoReturnFromQuery);
+
+ protected void RestartApp()
+ {
+ Intent intent = IntentBuilder.GetRestartAppIntent(this);
+ StartActivity(intent);
+ Finish();
+ }
+
+
+ public override void Finish()
+ {
+ if (ReplyIntent != null)
+ {
+ SetResult(Result.Ok, ReplyIntent);
+ }
+ else
+ {
+ SetResult(Result.Canceled);
+ }
+ base.Finish();
+ }
+
+ void OnFailure()
+ {
+ Log.Warn(CommonUtil.Tag, "Failed auth.");
+ ReplyIntent = null;
+ }
+
+ protected void OnSuccess(FilledAutofillFieldCollection clientFormDataMap, bool isManual)
+ {
+ var intent = Intent;
+ AssistStructure structure = (AssistStructure)intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure);
+ StructureParser parser = new StructureParser(this, structure);
+ parser.ParseForFill(isManual);
+ AutofillFieldMetadataCollection autofillFields = parser.AutofillFields;
+ int partitionIndex = AutofillHintsHelper.GetPartitionIndex(autofillFields.FocusedAutofillCanonicalHints.FirstOrDefault());
+ FilledAutofillFieldCollection partitionData = AutofillHintsHelper.FilterForPartition(clientFormDataMap, partitionIndex);
+ ReplyIntent = new Intent();
+ SetDatasetIntent(AutofillHelper.NewDataset(this, autofillFields, partitionData, IntentBuilder));
+ }
+
+ protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
+ {
+ base.OnActivityResult(requestCode, resultCode, data);
+
+ if (requestCode == RequestCodeQuery)
+ {
+ if (resultCode == ExpectedActivityResult)
+ OnSuccess(GetDataset(data), Intent.GetBooleanExtra(ExtraIsManualRequest, false));
+ else
+ OnFailure();
+ Finish();
+
+ }
+
+ }
+
+ protected virtual Result ExpectedActivityResult
+ {
+ get { return Result.Ok; }
+ }
+
+ ///
+ /// Creates the FilledAutofillFieldCollection from the intent returned from the query activity
+ ///
+ protected abstract FilledAutofillFieldCollection GetDataset(Intent data);
+
+ public abstract IAutofillIntentBuilder IntentBuilder { get; }
+
+
+ protected void SetResponseIntent(FillResponse fillResponse)
+ {
+ ReplyIntent.PutExtra(AutofillManager.ExtraAuthenticationResult, fillResponse);
+ }
+
+ protected void SetDatasetIntent(Dataset dataset)
+ {
+ ReplyIntent.PutExtra(AutofillManager.ExtraAuthenticationResult, dataset);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/keepass2android/services/AutofillBase/CommonUtil.cs b/src/keepass2android/services/AutofillBase/CommonUtil.cs
new file mode 100644
index 00000000..498abbef
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/CommonUtil.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Text;
+using Android.OS;
+using Android.Util;
+using Java.Util;
+
+namespace keepass2android.services.AutofillBase
+{
+ public class CommonUtil
+ {
+ public const string Tag = "Kp2aAutofill";
+ public const bool Debug = true;
+
+ static void BundleToString(StringBuilder builder, Bundle data)
+ {
+ var keySet = data.KeySet();
+ builder.Append("[Bundle with ").Append(keySet.Count).Append(" keys:");
+ foreach (var key in keySet)
+ {
+ builder.Append(' ').Append(key).Append('=');
+ Object value = data.Get(key);
+ if (value is Bundle)
+ {
+ BundleToString(builder, (Bundle)value);
+ }
+ else
+ {
+ builder.Append((value is Object[])
+ ? Arrays.ToString((bool[])value) : value);
+ }
+ }
+ builder.Append(']');
+ }
+
+ public static string BundleToString(Bundle data)
+ {
+ if (data == null)
+ {
+ return "N/A";
+ }
+ StringBuilder builder = new StringBuilder();
+ BundleToString(builder, data);
+ return builder.ToString();
+ }
+
+ public static void logd(string s)
+ {
+#if DEBUG
+ Log.Debug(Tag, s);
+#endif
+ }
+
+ public static void loge(string s)
+ {
+ Kp2aLog.Log(s);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/keepass2android/services/AutofillBase/Kp2aDigitalAssetLinksDataSource.cs b/src/keepass2android/services/AutofillBase/Kp2aDigitalAssetLinksDataSource.cs
new file mode 100644
index 00000000..c356ba19
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/Kp2aDigitalAssetLinksDataSource.cs
@@ -0,0 +1,46 @@
+using System.Collections.Generic;
+using Android.Content;
+
+namespace keepass2android.services.AutofillBase
+{
+
+ internal class Kp2aDigitalAssetLinksDataSource
+ {
+ private static Kp2aDigitalAssetLinksDataSource instance;
+
+ private Kp2aDigitalAssetLinksDataSource() { }
+
+ public static Kp2aDigitalAssetLinksDataSource Instance
+ {
+ get
+ {
+ if (instance == null)
+ {
+ instance = new Kp2aDigitalAssetLinksDataSource();
+ }
+ return instance;
+ }
+ }
+
+ public bool IsValid(Context context, string webDomain, string packageName)
+ {
+ return (IsTrustedBrowser(packageName));
+
+ }
+
+ static readonly HashSet _trustedBrowsers = new HashSet
+ {
+ "org.mozilla.klar","org.mozilla.focus","org.mozilla.firefox","org.mozilla.firefox_beta","com.microsoft.emmx",
+ "com.android.chrome","com.chrome.beta","com.android.browser","com.brave.browser","com.opera.browser",
+ "com.opera.browser.beta","com.opera.mini.native","com.chrome.dev","com.chrome.canary",
+ "com.google.android.apps.chrome","com.google.android.apps.chrome_dev","com.yandex.browser",
+ "com.sec.android.app.sbrowser","com.sec.android.app.sbrowser.beta","org.codeaurora.swe.browser",
+ "com.amazon.cloud9"
+ };
+
+ private bool IsTrustedBrowser(string packageName)
+ {
+ return _trustedBrowsers.Contains(packageName);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/keepass2android/services/AutofillBase/StructureParser.cs b/src/keepass2android/services/AutofillBase/StructureParser.cs
new file mode 100644
index 00000000..8f50388e
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/StructureParser.cs
@@ -0,0 +1,231 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Android.App.Assist;
+using Android.Content;
+using Android.Text;
+using Android.Util;
+using Android.Views;
+using Android.Views.Autofill;
+using keepass2android.services.AutofillBase.model;
+using FilledAutofillFieldCollection = keepass2android.services.AutofillBase.model.FilledAutofillFieldCollection;
+
+namespace keepass2android.services.AutofillBase
+{
+ ///
+ /// Parser for an AssistStructure object. This is invoked when the Autofill Service receives an
+ /// AssistStructure from the client Activity, representing its View hierarchy. In this sample, it
+ /// parses the hierarchy and collects autofill metadata from {@link ViewNode}s along the way.
+ ///
+ public sealed class StructureParser
+ {
+ public Context mContext { get; }
+ public AutofillFieldMetadataCollection AutofillFields { get; set; }
+ AssistStructure Structure;
+ private List _editTextsWithoutHint = new List();
+ public FilledAutofillFieldCollection ClientFormData { get; set; }
+
+ public StructureParser(Context context, AssistStructure structure)
+ {
+ mContext = context;
+ Structure = structure;
+ AutofillFields = new AutofillFieldMetadataCollection();
+ }
+
+ public string ParseForFill(bool isManual)
+ {
+ return Parse(true, isManual);
+ }
+
+ public string ParseForSave()
+ {
+ return Parse(false, true);
+ }
+
+ ///
+ /// Traverse AssistStructure and add ViewNode metadata to a flat list.
+ ///
+ /// The parse.
+ /// If set to true for fill.
+ ///
+ string Parse(bool forFill, bool isManualRequest)
+ {
+ CommonUtil.logd("Parsing structure for " + Structure.ActivityComponent);
+ var nodes = Structure.WindowNodeCount;
+ ClientFormData = new FilledAutofillFieldCollection();
+ String webDomain = null;
+ _editTextsWithoutHint.Clear();
+
+ for (int i = 0; i < nodes; i++)
+ {
+ var node = Structure.GetWindowNodeAt(i);
+ var view = node.RootViewNode;
+ ParseLocked(forFill, isManualRequest, view, ref webDomain);
+ }
+
+
+
+ List passwordFields = new List();
+ List usernameFields = new List();
+ if (AutofillFields.Empty)
+ {
+ passwordFields = _editTextsWithoutHint.Where(IsPassword).ToList();
+ if (!passwordFields.Any())
+ {
+ passwordFields = _editTextsWithoutHint.Where(HasPasswordHint).ToList();
+ }
+
+ foreach (var passwordField in passwordFields)
+ {
+ var usernameField = _editTextsWithoutHint.TakeWhile(f => f.AutofillId != passwordField.AutofillId).LastOrDefault();
+ if (usernameField != null)
+ {
+ usernameFields.Add(usernameField);
+ }
+ }
+ //for some pages with two-step login, we don't see a password field and don't display the autofill for non-manual requests. But if the user forces autofill,
+ //let's assume it is a username field:
+ if (isManualRequest && !passwordFields.Any() && _editTextsWithoutHint.Count == 1)
+ {
+ usernameFields.Add(_editTextsWithoutHint.First());
+ }
+
+
+ }
+
+ //force focused fields to be included in autofill fields when request was triggered manually. This allows to fill fields which are "off" or don't have a hint (in case there are hints)
+ if (isManualRequest)
+ {
+ foreach (AssistStructure.ViewNode editText in _editTextsWithoutHint)
+ {
+ if (editText.IsFocused)
+ {
+ if (IsPassword(editText) || HasPasswordHint(editText))
+ passwordFields.Add(editText);
+ else
+ usernameFields.Add(editText);
+ break;
+ }
+
+ }
+ }
+
+ if (forFill)
+ {
+ foreach (var uf in usernameFields)
+ AutofillFields.Add(new AutofillFieldMetadata(uf, new[] { View.AutofillHintUsername }));
+ foreach (var pf in passwordFields)
+ AutofillFields.Add(new AutofillFieldMetadata(pf, new[] { View.AutofillHintPassword }));
+
+ }
+ else
+ {
+ foreach (var uf in usernameFields)
+ ClientFormData.Add(new FilledAutofillField(uf, new[] { View.AutofillHintUsername }));
+ foreach (var pf in passwordFields)
+ ClientFormData.Add(new FilledAutofillField(pf, new[] { View.AutofillHintPassword }));
+ }
+
+
+
+ String packageName = Structure.ActivityComponent.PackageName;
+ if (!string.IsNullOrEmpty(webDomain))
+ {
+ bool valid = Kp2aDigitalAssetLinksDataSource.Instance.IsValid(mContext, webDomain, packageName);
+ if (!valid)
+ {
+ CommonUtil.loge($"DAL verification failed for {packageName}/{webDomain}");
+ webDomain = null;
+ }
+ }
+ if (string.IsNullOrEmpty(webDomain))
+ {
+ webDomain = "androidapp://" + packageName;
+ CommonUtil.logd("no web domain. Using package name.");
+ }
+ return webDomain;
+ }
+
+ private static bool HasPasswordHint(AssistStructure.ViewNode f)
+ {
+ return (f.IdEntry?.ToLowerInvariant().Contains("password") ?? false)
+ || (f.Hint?.ToLowerInvariant().Contains("password") ?? false);
+ }
+
+ private static bool IsPassword(AssistStructure.ViewNode f)
+ {
+ return
+ (!f.IdEntry?.ToLowerInvariant().Contains("search") ?? true) &&
+ (!f.Hint?.ToLowerInvariant().Contains("search") ?? true) &&
+ (
+ f.InputType.HasFlag(InputTypes.TextVariationPassword) ||
+ f.InputType.HasFlag(InputTypes.TextVariationVisiblePassword) ||
+ f.InputType.HasFlag(InputTypes.TextVariationWebPassword) ||
+ (f.HtmlInfo?.Attributes.Any(p => p.First.ToString() == "type" && p.Second.ToString() == "password") ?? false)
+ );
+ }
+
+ void ParseLocked(bool forFill, bool isManualRequest, AssistStructure.ViewNode viewNode, ref string validWebdomain)
+ {
+ String webDomain = viewNode.WebDomain;
+ if (webDomain != null)
+ {
+ CommonUtil.logd($"child web domain: {webDomain}");
+ if (!string.IsNullOrEmpty(validWebdomain))
+ {
+ if (webDomain == validWebdomain)
+ {
+ throw new Java.Lang.SecurityException($"Found multiple web domains: valid= {validWebdomain}, child={webDomain}");
+ }
+ }
+ else
+ {
+ validWebdomain = webDomain;
+ }
+ }
+
+ string[] viewHints = viewNode.GetAutofillHints();
+ if (viewHints != null && viewHints.Length == 1 && viewHints.First() == "off" && viewNode.IsFocused &&
+ isManualRequest)
+ viewHints[0] = "on";
+ CommonUtil.logd("viewHints=" + viewHints);
+ CommonUtil.logd("class=" + viewNode.ClassName);
+ CommonUtil.logd("tag=" + (viewNode?.HtmlInfo?.Tag ?? "(null)"));
+ if (viewNode?.HtmlInfo?.Tag == "input")
+ {
+ foreach (var p in viewNode.HtmlInfo.Attributes)
+ CommonUtil.logd("attr="+p.First + "/" + p.Second);
+ }
+ if (viewHints != null && viewHints.Length > 0 && viewHints.First() != "on" /*if hint is "on", treat as if there is no hint*/)
+ {
+ if (forFill)
+ {
+ AutofillFields.Add(new AutofillFieldMetadata(viewNode));
+ }
+ else
+ {
+ FilledAutofillField filledAutofillField = new FilledAutofillField(viewNode);
+ ClientFormData.Add(filledAutofillField);
+ }
+ }
+ else
+ {
+
+ if (viewNode.ClassName == "android.widget.EditText" || viewNode?.HtmlInfo?.Tag == "input")
+ {
+ _editTextsWithoutHint.Add(viewNode);
+ }
+
+ }
+ var childrenSize = viewNode.ChildCount;
+ if (childrenSize > 0)
+ {
+ for (int i = 0; i < childrenSize; i++)
+ {
+ ParseLocked(forFill, isManualRequest, viewNode.GetChildAt(i), ref validWebdomain);
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/keepass2android/services/AutofillBase/model/FilledAutofillField.cs b/src/keepass2android/services/AutofillBase/model/FilledAutofillField.cs
new file mode 100644
index 00000000..119b2437
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/model/FilledAutofillField.cs
@@ -0,0 +1,155 @@
+using System.Collections.Generic;
+using Android.App.Assist;
+using Android.Views.Autofill;
+using KeePassLib.Utility;
+
+namespace keepass2android.services.AutofillBase.model
+{
+ public class FilledAutofillField
+ {
+ private string[] _autofillHints;
+ public string TextValue { get; set; }
+ public long? DateValue { get; set; }
+ public bool? ToggleValue { get; set; }
+
+ public string ValueToString()
+ {
+ if (DateValue != null)
+ {
+ return TimeUtil.ConvertUnixTime((long)DateValue / 1000.0).ToLongDateString();
+ }
+ if (ToggleValue != null)
+ return ToggleValue.ToString();
+ return TextValue;
+ }
+
+ ///
+ /// returns the autofill hints for the filled field. These are always lowercased for simpler string comparison.
+ ///
+ public string[] AutofillHints
+ {
+ get
+ {
+ return _autofillHints;
+ }
+ set
+ {
+ _autofillHints = value;
+ for (int i = 0; i < _autofillHints.Length; i++)
+ _autofillHints[i] = _autofillHints[i].ToLower();
+ }
+ }
+
+
+ public FilledAutofillField()
+ {}
+
+ public FilledAutofillField(AssistStructure.ViewNode viewNode)
+ : this(viewNode, viewNode.GetAutofillHints())
+ {
+
+ }
+
+ public FilledAutofillField(AssistStructure.ViewNode viewNode, string[] hints)
+ {
+
+ string[] rawHints = AutofillHintsHelper.FilterForSupportedHints(hints);
+ List hintList = new List();
+
+ string nextHint = null;
+ for (int i = 0; i < rawHints.Length; i++)
+ {
+ string hint = rawHints[i];
+ if (i < rawHints.Length - 1)
+ {
+ nextHint = rawHints[i + 1];
+ }
+ // First convert the compound W3C autofill hints
+ if (W3cHints.isW3cSectionPrefix(hint) && i < rawHints.Length - 1)
+ {
+ hint = rawHints[++i];
+ CommonUtil.logd($"Hint is a W3C section prefix; using {hint} instead");
+ if (i < rawHints.Length - 1)
+ {
+ nextHint = rawHints[i + 1];
+ }
+ }
+ if (W3cHints.isW3cTypePrefix(hint) && nextHint != null && W3cHints.isW3cTypeHint(nextHint))
+ {
+ hint = nextHint;
+ i++;
+ CommonUtil.logd($"Hint is a W3C type prefix; using {hint} instead");
+ }
+ if (W3cHints.isW3cAddressType(hint) && nextHint != null)
+ {
+ hint = nextHint;
+ i++;
+ CommonUtil.logd($"Hint is a W3C address prefix; using {hint} instead");
+ }
+
+ // Then check if the "actual" hint is supported.
+ if (AutofillHintsHelper.IsSupportedHint(hint))
+ {
+ hintList.Add(hint);
+ }
+ else
+ {
+ CommonUtil.loge($"Invalid hint: {rawHints[i]}");
+ }
+ }
+ AutofillHints = AutofillHintsHelper.ConvertToCanonicalHints(hintList.ToArray()).ToArray();
+
+ AutofillValue autofillValue = viewNode.AutofillValue;
+ if (autofillValue != null)
+ {
+ if (autofillValue.IsList)
+ {
+ string[] autofillOptions = viewNode.GetAutofillOptions();
+ int index = autofillValue.ListValue;
+ if (autofillOptions != null && autofillOptions.Length > 0)
+ {
+ TextValue = autofillOptions[index];
+ }
+ }
+ else if (autofillValue.IsDate)
+ {
+ DateValue = autofillValue.DateValue;
+ }
+ else if (autofillValue.IsText)
+ {
+ TextValue = autofillValue.TextValue;
+ }
+ }
+ }
+
+ public bool IsNull()
+ {
+ return TextValue == null && DateValue == null && ToggleValue == null;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (this == obj) return true;
+ if (obj == null || GetType() != obj.GetType()) return false;
+
+ FilledAutofillField that = (FilledAutofillField)obj;
+
+ if (!TextValue?.Equals(that.TextValue) ?? that.TextValue != null)
+ return false;
+ if (DateValue != null ? !DateValue.Equals(that.DateValue) : that.DateValue != null)
+ return false;
+ return ToggleValue != null ? ToggleValue.Equals(that.ToggleValue) : that.ToggleValue == null;
+ }
+
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ var result = TextValue != null ? TextValue.GetHashCode() : 0;
+ result = 31 * result + (DateValue != null ? DateValue.GetHashCode() : 0);
+ result = 31 * result + (ToggleValue != null ? ToggleValue.GetHashCode() : 0);
+ return result;
+ }
+ }
+ }
+}
diff --git a/src/keepass2android/services/AutofillBase/model/FilledAutofillFieldCollection.cs b/src/keepass2android/services/AutofillBase/model/FilledAutofillFieldCollection.cs
new file mode 100644
index 00000000..68d4d3c2
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/model/FilledAutofillFieldCollection.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+using Android.Service.Autofill;
+using Android.Util;
+using Android.Views;
+using Android.Views.Autofill;
+
+namespace keepass2android.services.AutofillBase.model
+{
+ ///
+ /// FilledAutofillFieldCollection is the model that holds all of the data on a client app's page,
+ /// plus the dataset name associated with it.
+ ///
+ public class FilledAutofillFieldCollection
+ {
+ public Dictionary HintMap { get; }
+ public string DatasetName { get; set; }
+
+ public FilledAutofillFieldCollection(Dictionary hintMap, string datasetName = "")
+ {
+ //recreate hint map making sure we compare case insensitive
+ HintMap = BuildHintMap();
+ foreach (var p in hintMap)
+ HintMap.Add(p.Key, p.Value);
+ DatasetName = datasetName;
+ }
+
+ public FilledAutofillFieldCollection() : this(BuildHintMap())
+ {}
+
+ private static Dictionary BuildHintMap()
+ {
+ return new Dictionary(StringComparer.OrdinalIgnoreCase);
+ }
+
+ ///
+ /// Adds a filledAutofillField to the collection, indexed by all of its hints.
+ ///
+ /// The add.
+ /// Filled autofill field.
+ public void Add(FilledAutofillField filledAutofillField)
+ {
+ foreach (string hint in filledAutofillField.AutofillHints)
+ {
+ if (AutofillHintsHelper.IsSupportedHint(hint))
+ {
+ HintMap.TryAdd(hint, filledAutofillField);
+ }
+ else
+ {
+ CommonUtil.loge($"Invalid hint: {hint}");
+ }
+ }
+
+ }
+
+
+ ///
+ /// Populates a Dataset.Builder with appropriate values for each AutofillId
+ /// in a AutofillFieldMetadataCollection.
+ ///
+ /// In other words, it constructs an autofill Dataset.Builder
+ /// by applying saved values (from this FilledAutofillFieldCollection)
+ /// to Views specified in a AutofillFieldMetadataCollection, which represents the current
+ /// page the user is on.
+ ///
+ /// true, if to fields was applyed, false otherwise.
+ /// Autofill field metadata collection.
+ /// Dataset builder.
+ public bool ApplyToFields(AutofillFieldMetadataCollection autofillFieldMetadataCollection, Dataset.Builder datasetBuilder)
+ {
+ bool setValueAtLeastOnce = false;
+
+ foreach (string hint in autofillFieldMetadataCollection.AllAutofillCanonicalHints)
+ {
+ foreach (AutofillFieldMetadata autofillFieldMetadata in autofillFieldMetadataCollection.GetFieldsForHint(hint))
+ {
+ FilledAutofillField filledAutofillField;
+ if (!HintMap.TryGetValue(hint, out filledAutofillField) || (filledAutofillField == null))
+ {
+ continue;
+ }
+
+ var autofillId = autofillFieldMetadata.AutofillId;
+ var autofillType = autofillFieldMetadata.AutofillType;
+ switch (autofillType)
+ {
+ case AutofillType.List:
+ var listValue = autofillFieldMetadata.GetAutofillOptionIndex(filledAutofillField.TextValue);
+ if (listValue != -1)
+ {
+ datasetBuilder.SetValue(autofillId, AutofillValue.ForList(listValue));
+ setValueAtLeastOnce = true;
+ }
+ break;
+ case AutofillType.Date:
+ var dateValue = filledAutofillField.DateValue;
+ datasetBuilder.SetValue(autofillId, AutofillValue.ForDate((long)dateValue));
+ setValueAtLeastOnce = true;
+ break;
+ case AutofillType.Text:
+ var textValue = filledAutofillField.TextValue;
+ if (textValue != null)
+ {
+ datasetBuilder.SetValue(autofillId, AutofillValue.ForText(textValue));
+ setValueAtLeastOnce = true;
+ }
+ break;
+ case AutofillType.Toggle:
+ var toggleValue = filledAutofillField.ToggleValue;
+ if (toggleValue != null)
+ {
+ datasetBuilder.SetValue(autofillId, AutofillValue.ForToggle(toggleValue.Value));
+ setValueAtLeastOnce = true;
+ }
+ break;
+ default:
+ Log.Warn(CommonUtil.Tag, "Invalid autofill type - " + autofillType);
+ break;
+ }
+ }
+ }
+ return setValueAtLeastOnce;
+ }
+
+ ///
+ /// Takes in a list of autofill hints (`autofillHints`), usually associated with a View or set of
+ /// Views. Returns whether any of the filled fields on the page have at least 1 of these
+ /// `autofillHint`s.
+ ///
+ /// true, if with hints was helpsed, false otherwise.
+ /// Autofill hints.
+ public bool HelpsWithHints(List autofillHints)
+ {
+ for (int i = 0; i < autofillHints.Count; i++)
+ {
+ var autofillHint = autofillHints[i];
+ if (HintMap.ContainsKey(autofillHint) && !HintMap[autofillHint].IsNull())
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/src/keepass2android/services/AutofillBase/model/W3cHints.cs b/src/keepass2android/services/AutofillBase/model/W3cHints.cs
new file mode 100644
index 00000000..8078ddfc
--- /dev/null
+++ b/src/keepass2android/services/AutofillBase/model/W3cHints.cs
@@ -0,0 +1,127 @@
+using Android.Util;
+
+namespace keepass2android.services.AutofillBase.model
+{
+ public class W3cHints
+ {
+
+ // Supported W3C autofill tokens (https://html.spec.whatwg.org/multipage/forms.html#autofill)
+ public const string HONORIFIC_PREFIX = "honorific-prefix";
+ public const string NAME = "name";
+ public const string GIVEN_NAME = "given-name";
+ public const string ADDITIONAL_NAME = "additional-name";
+ public const string FAMILY_NAME = "family-name";
+ public const string HONORIFIC_SUFFIX = "honorific-suffix";
+ public const string USERNAME = "username";
+ public const string NEW_PASSWORD = "new-password";
+ public const string CURRENT_PASSWORD = "current-password";
+ public const string ORGANIZATION_TITLE = "organization-title";
+ public const string ORGANIZATION = "organization";
+ public const string STREET_ADDRESS = "street-address";
+ public const string ADDRESS_LINE1 = "address-line1";
+ public const string ADDRESS_LINE2 = "address-line2";
+ public const string ADDRESS_LINE3 = "address-line3";
+ public const string ADDRESS_LEVEL4 = "address-level4";
+ public const string ADDRESS_LEVEL3 = "address-level3";
+ public const string ADDRESS_LEVEL2 = "address-level2";
+ public const string ADDRESS_LEVEL1 = "address-level1";
+ public const string COUNTRY = "country";
+ public const string COUNTRY_NAME = "country-name";
+ public const string POSTAL_CODE = "postal-code";
+ public const string CC_NAME = "cc-name";
+ public const string CC_GIVEN_NAME = "cc-given-name";
+ public const string CC_ADDITIONAL_NAME = "cc-additional-name";
+ public const string CC_FAMILY_NAME = "cc-family-name";
+ public const string CC_NUMBER = "cc-number";
+ public const string CC_EXPIRATION = "cc-exp";
+ public const string CC_EXPIRATION_MONTH = "cc-exp-month";
+ public const string CC_EXPIRATION_YEAR = "cc-exp-year";
+ public const string CC_CSC = "cc-csc";
+ public const string CC_TYPE = "cc-type";
+ public const string TRANSACTION_CURRENCY = "transaction-currency";
+ public const string TRANSACTION_AMOUNT = "transaction-amount";
+ public const string LANGUAGE = "language";
+ public const string BDAY = "bday";
+ public const string BDAY_DAY = "bday-day";
+ public const string BDAY_MONTH = "bday-month";
+ public const string BDAY_YEAR = "bday-year";
+ public const string SEX = "sex";
+ public const string URL = "url";
+ public const string PHOTO = "photo";
+ // Optional W3C prefixes
+ public const string PREFIX_SECTION = "section-";
+ public const string SHIPPING = "shipping";
+ public const string BILLING = "billing";
+ // W3C prefixes below...
+ public const string PREFIX_HOME = "home";
+ public const string PREFIX_WORK = "work";
+ public const string PREFIX_FAX = "fax";
+ public const string PREFIX_PAGER = "pager";
+ // ... require those suffix
+ public const string TEL = "tel";
+ public const string TEL_COUNTRY_CODE = "tel-country-code";
+ public const string TEL_NATIONAL = "tel-national";
+ public const string TEL_AREA_CODE = "tel-area-code";
+ public const string TEL_LOCAL = "tel-local";
+ public const string TEL_LOCAL_PREFIX = "tel-local-prefix";
+ public const string TEL_LOCAL_SUFFIX = "tel-local-suffix";
+ public const string TEL_EXTENSION = "tel_extension";
+ public const string EMAIL = "email";
+ public const string IMPP = "impp";
+
+ private W3cHints()
+ {
+ }
+
+
+
+ public static bool isW3cSectionPrefix(string hint)
+ {
+ return hint.ToLower().StartsWith(W3cHints.PREFIX_SECTION);
+ }
+
+ public static bool isW3cAddressType(string hint)
+ {
+ switch (hint.ToLower())
+ {
+ case W3cHints.SHIPPING:
+ case W3cHints.BILLING:
+ return true;
+ }
+ return false;
+ }
+
+ public static bool isW3cTypePrefix(string hint)
+ {
+ switch (hint.ToLower())
+ {
+ case W3cHints.PREFIX_WORK:
+ case W3cHints.PREFIX_FAX:
+ case W3cHints.PREFIX_HOME:
+ case W3cHints.PREFIX_PAGER:
+ return true;
+ }
+ return false;
+ }
+
+ public static bool isW3cTypeHint(string hint)
+ {
+ switch (hint.ToLower())
+ {
+ case W3cHints.TEL:
+ case W3cHints.TEL_COUNTRY_CODE:
+ case W3cHints.TEL_NATIONAL:
+ case W3cHints.TEL_AREA_CODE:
+ case W3cHints.TEL_LOCAL:
+ case W3cHints.TEL_LOCAL_PREFIX:
+ case W3cHints.TEL_LOCAL_SUFFIX:
+ case W3cHints.TEL_EXTENSION:
+ case W3cHints.EMAIL:
+ case W3cHints.IMPP:
+ return true;
+ }
+ Log.Warn(CommonUtil.Tag, "Invalid W3C type hint: " + hint);
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/keepass2android/services/Kp2aAutofill/ChooseForAutofillActivity.cs b/src/keepass2android/services/Kp2aAutofill/ChooseForAutofillActivity.cs
new file mode 100644
index 00000000..a07b52ac
--- /dev/null
+++ b/src/keepass2android/services/Kp2aAutofill/ChooseForAutofillActivity.cs
@@ -0,0 +1,157 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.OS;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using keepass2android.services.AutofillBase;
+using keepass2android.services.AutofillBase.model;
+using Keepass2android.Pluginsdk;
+using KeePassLib;
+using KeePassLib.Utility;
+
+namespace keepass2android.services.Kp2aAutofill
+{
+ [Activity(Label = "@string/app_name",
+ ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
+ Theme = "@style/MyTheme_ActionBar",
+ Permission = "keepass2android." + AppNames.PackagePart + ".permission.Kp2aChooseAutofill")]
+ public class ChooseForAutofillActivity : ChooseForAutofillActivityBase
+ {
+ protected override Intent GetQueryIntent(string requestedUrl, bool autoReturnFromQuery)
+ {
+ //launch FileSelectActivity (which is root of the stack (exception: we're even below!)) with the appropriate task.
+ //will return the results later
+ Intent i = new Intent(this, typeof(FileSelectActivity));
+ //don't show user notifications when an entry is opened.
+ var task = new SearchUrlTask() { UrlToSearchFor = requestedUrl, ShowUserNotifications = false, AutoReturnFromQuery = autoReturnFromQuery };
+ task.ToIntent(i);
+ return i;
+ }
+
+ protected override Result ExpectedActivityResult => KeePass.ExitCloseAfterTaskComplete;
+
+ protected override FilledAutofillFieldCollection GetDataset(Intent data)
+ {
+ if (!App.Kp2a.GetDb().Loaded || (App.Kp2a.QuickLocked))
+ return null;
+ var entryOutput = App.Kp2a.GetDb().LastOpenedEntry;
+
+ return GetFilledAutofillFieldCollectionFromEntry(entryOutput, this);
+ }
+
+ public static FilledAutofillFieldCollection GetFilledAutofillFieldCollectionFromEntry(PwEntryOutput pwEntryOutput, Context context)
+ {
+ if (pwEntryOutput == null)
+ return null;
+ FilledAutofillFieldCollection fieldCollection = new FilledAutofillFieldCollection();
+ var pwEntry = pwEntryOutput.Entry;
+
+ foreach (string key in pwEntryOutput.OutputStrings.GetKeys())
+ {
+ FilledAutofillField field =
+ new FilledAutofillField
+ {
+ AutofillHints = new[] {GetCanonicalHintFromKp2aField(key)},
+ TextValue = pwEntryOutput.OutputStrings.ReadSafe(key)
+ };
+ fieldCollection.Add(field);
+ }
+ if (IsCreditCard(pwEntry, context) && pwEntry.Expires)
+ {
+ DateTime expTime = pwEntry.ExpiryTime;
+ FilledAutofillField field =
+ new FilledAutofillField
+ {
+ AutofillHints = new[] {View.AutofillHintCreditCardExpirationDate},
+ DateValue = (long) (1000 * TimeUtil.SerializeUnix(expTime))
+ };
+ fieldCollection.Add(field);
+
+ field =
+ new FilledAutofillField
+ {
+ AutofillHints = new[] {View.AutofillHintCreditCardExpirationDay},
+ TextValue = expTime.Day.ToString()
+ };
+ fieldCollection.Add(field);
+
+ field =
+ new FilledAutofillField
+ {
+ AutofillHints = new[] {View.AutofillHintCreditCardExpirationMonth},
+ TextValue = expTime.Month.ToString()
+ };
+ fieldCollection.Add(field);
+
+ field =
+ new FilledAutofillField
+ {
+ AutofillHints = new[] {View.AutofillHintCreditCardExpirationYear},
+ TextValue = expTime.Year.ToString()
+ };
+ fieldCollection.Add(field);
+ }
+
+
+ fieldCollection.DatasetName = pwEntry.Strings.ReadSafe(PwDefs.TitleField);
+
+ return fieldCollection;
+ }
+
+ private static bool IsCreditCard(PwEntry pwEntry, Context context)
+ {
+ return pwEntry.Strings.Exists("cc-number")
+ || pwEntry.Strings.Exists("cc-csc")
+ || pwEntry.Strings.Exists(context.GetString(Resource.String.TemplateField_CreditCard_CVV));
+ }
+
+ private static readonly Dictionary keyToHint = BuildKeyToHint();
+
+ public static string GetKp2aKeyFromHint(string canonicalHint)
+ {
+ var key = keyToHint.FirstOrDefault(p => p.Value.Equals(canonicalHint, StringComparison.OrdinalIgnoreCase)).Key;
+ if (string.IsNullOrWhiteSpace(key))
+ return canonicalHint;
+ return key;
+ }
+
+ private static Dictionary BuildKeyToHint()
+ {
+ var result = new Dictionary
+ {
+ {PwDefs.UserNameField, View.AutofillHintUsername},
+ {PwDefs.PasswordField, View.AutofillHintPassword},
+ {PwDefs.UrlField, W3cHints.URL},
+ {
+ Application.Context.GetString(Resource.String.TemplateField_CreditCard_CVV),
+ View.AutofillHintCreditCardSecurityCode
+ },
+ {
+ Application.Context.GetString(Resource.String.TemplateField_CreditCard_Owner),
+ W3cHints.CC_NAME
+ },
+ {Application.Context.GetString(Resource.String.TemplateField_Number), View.AutofillHintCreditCardNumber},
+ {Application.Context.GetString(Resource.String.TemplateField_IdCard_Name), View.AutofillHintName},
+ };
+ return result;
+ }
+
+ private static string GetCanonicalHintFromKp2aField(string key)
+ {
+ if (!keyToHint.TryGetValue(key, out string result))
+ result = key;
+ result = result.ToLower();
+ return result;
+ }
+
+ public override IAutofillIntentBuilder IntentBuilder => new Kp2aAutofillIntentBuilder();
+
+ }
+}
\ No newline at end of file
diff --git a/src/keepass2android/services/Kp2aAutofill/Kp2aAutofillService.cs b/src/keepass2android/services/Kp2aAutofill/Kp2aAutofillService.cs
new file mode 100644
index 00000000..88cd6131
--- /dev/null
+++ b/src/keepass2android/services/Kp2aAutofill/Kp2aAutofillService.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using Android;
+using Android.App;
+using Android.Content;
+using Android.Runtime;
+using keepass2android.services.AutofillBase;
+using keepass2android.services.AutofillBase.model;
+using keepass2android.services.Kp2aAutofill;
+using Keepass2android.Pluginsdk;
+using KeePassLib;
+using KeePassLib.Utility;
+using Org.Json;
+using AutofillServiceBase = keepass2android.services.AutofillBase.AutofillServiceBase;
+
+namespace keepass2android.services
+{
+ [Service(Label = AppNames.AppName, Permission=Manifest.Permission.BindAutofillService)]
+ [IntentFilter(new [] {"android.service.autofill.AutofillService"})]
+ [MetaData("android.autofill", Resource = "@xml/autofillservice")]
+ [Register("keepass2android.services.Kp2aAutofillService")]
+ public class Kp2aAutofillService: AutofillServiceBase
+ {
+ public Kp2aAutofillService()
+ {
+
+ }
+
+ public Kp2aAutofillService(IntPtr javaReference, JniHandleOwnership transfer)
+ : base(javaReference, transfer)
+ {
+ }
+
+ protected override FilledAutofillFieldCollection GetSuggestedEntry(string query)
+ {
+ if (App.Kp2a.GetDb()?.LastOpenedEntry?.SearchUrl == query)
+ return ChooseForAutofillActivity.GetFilledAutofillFieldCollectionFromEntry(
+ App.Kp2a.GetDb()?.LastOpenedEntry, this);
+ return null;
+ }
+
+ protected override void HandleSaveRequest(StructureParser parser, string query)
+ {
+
+
+ var intent = new Intent(this, typeof(FileSelectActivity));
+
+ Dictionary outputFields = new Dictionary();
+ foreach (var p in parser.ClientFormData.HintMap)
+ {
+ CommonUtil.logd(p.Key + " = " + p.Value.ValueToString());
+ outputFields.TryAdd(ChooseForAutofillActivity.GetKp2aKeyFromHint(p.Key), p.Value.ValueToString());
+
+ }
+ if (query != null)
+ outputFields.TryAdd(PwDefs.UrlField, query);
+
+ JSONObject jsonOutput = new JSONObject(outputFields);
+ var jsonOutputStr = jsonOutput.ToString();
+ intent.PutExtra(Strings.ExtraEntryOutputData, jsonOutputStr);
+
+ JSONArray jsonProtectedFields = new JSONArray(
+ (System.Collections.ICollection)new string[]{});
+ intent.PutExtra(Strings.ExtraProtectedFieldsList, jsonProtectedFields.ToString());
+
+ intent.PutExtra(AppTask.AppTaskKey, "CreateEntryThenCloseTask");
+ intent.PutExtra(CreateEntryThenCloseTask.ShowUserNotificationsKey, "false");
+
+ StartActivity(intent);
+
+ }
+
+ public override IAutofillIntentBuilder IntentBuilder => new Kp2aAutofillIntentBuilder();
+ }
+}
\ No newline at end of file
diff --git a/src/keepass2android/services/Kp2aAutofillIntentBuilder.cs b/src/keepass2android/services/Kp2aAutofillIntentBuilder.cs
new file mode 100644
index 00000000..12830a83
--- /dev/null
+++ b/src/keepass2android/services/Kp2aAutofillIntentBuilder.cs
@@ -0,0 +1,39 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Android.App;
+using Android.Content;
+using Android.OS;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using keepass2android.services.AutofillBase;
+using keepass2android.services.Kp2aAutofill;
+
+namespace keepass2android.services
+{
+ class Kp2aAutofillIntentBuilder: IAutofillIntentBuilder
+ {
+
+ public IntentSender GetAuthIntentSenderForResponse(Context context, string query, bool isManualRequest, bool autoReturnFromQuery)
+ {
+ Intent intent = new Intent(context, typeof(ChooseForAutofillActivity));
+ intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryString, query);
+ intent.PutExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, isManualRequest);
+ intent.PutExtra(ChooseForAutofillActivityBase.ExtraAutoReturnFromQuery, autoReturnFromQuery);
+ return PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.CancelCurrent).IntentSender;
+ }
+
+ public Intent GetRestartAppIntent(Context context)
+ {
+ var intent = new Intent(context, typeof(FileSelectActivity));
+ intent.AddFlags(ActivityFlags.ForwardResult);
+ return intent;
+ }
+
+ public int AppIconResource
+ {
+ get { return AppNames.LauncherIcon; }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/keepass2android/settings/DatabaseSettingsActivity.cs b/src/keepass2android/settings/DatabaseSettingsActivity.cs
index 782f2844..ce9d6fd2 100644
--- a/src/keepass2android/settings/DatabaseSettingsActivity.cs
+++ b/src/keepass2android/settings/DatabaseSettingsActivity.cs
@@ -30,9 +30,11 @@ using Android.Graphics.Drawables;
using Android.OS;
using Android.Widget;
using Android.Preferences;
+using Android.Provider;
using Android.Runtime;
using Android.Util;
using Android.Views;
+using Android.Views.Autofill;
using Java.IO;
using KeePassLib.Cryptography.Cipher;
using KeePassLib.Keys;
@@ -347,6 +349,13 @@ namespace keepass2android
App.Kp2a.UpdateOngoingNotification();
}
+ public override void OnResume()
+ {
+ base.OnResume();
+
+ UpdateAutofillPref();
+ }
+
public override void OnCreate(Bundle savedInstanceState)
{
@@ -359,6 +368,36 @@ namespace keepass2android
FindPreference(GetString(Resource.String.ShowUnlockedNotification_key)).PreferenceChange += OnShowUnlockedNotificationChanged;
FindPreference(GetString(Resource.String.DebugLog_key)).PreferenceChange += OnDebugLogChanged;
FindPreference(GetString(Resource.String.DebugLog_send_key)).PreferenceClick += OnSendDebug;
+
+ UpdateAutofillPref();
+
+ var autofillPref = FindPreference(GetString(Resource.String.AutoFill_prefs_key));
+ if (autofillPref != null)
+ {
+ autofillPref.PreferenceClick += (sender, args) =>
+ {
+
+ var intent = new Intent(Settings.ActionRequestSetAutofillService);
+ intent.SetData(Android.Net.Uri.Parse("package:" + Context.PackageName));
+ try
+ {
+ Context.StartActivity(intent);
+ }
+ catch (ActivityNotFoundException e)
+ {
+ //this exception was reported by many Huawei users
+ Kp2aLog.LogUnexpectedError(e);
+ new AlertDialog.Builder(Context)
+ .SetTitle(Resource.String.autofill_enable)
+ .SetMessage(Resource.String.autofill_enable_failed)
+ .SetPositiveButton(Resource.String.ok, (o, eventArgs) => { })
+ .Show();
+
+ }
+ };
+ }
+
+
PrepareNoDonatePreference(Activity, FindPreference(GetString(Resource.String.NoDonateOption_key)));
PrepareNoDonationReminderPreference(Activity, ((PreferenceScreen)FindPreference(GetString(Resource.String.display_prefs_key))), FindPreference(GetString(Resource.String.NoDonationReminder_key)));
@@ -450,7 +489,42 @@ namespace keepass2android
}
- private void OnSendDebug(object sender, Preference.PreferenceClickEventArgs e)
+ private void UpdateAutofillPref()
+ {
+ var autofillPref = FindPreference(GetString(Resource.String.AutoFill_prefs_key));
+ if (autofillPref == null)
+ return;
+ if ((Android.OS.Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.O) ||
+ !((AutofillManager) Activity.GetSystemService(Java.Lang.Class.FromType(typeof(AutofillManager))))
+ .IsAutofillSupported)
+ {
+ var passwordAccessScreen =
+ (PreferenceScreen) FindPreference(Activity.GetString(Resource.String.password_access_prefs_key));
+ passwordAccessScreen.RemovePreference(autofillPref);
+ }
+ else
+ {
+ if (((AutofillManager) Activity.GetSystemService(Java.Lang.Class.FromType(typeof(AutofillManager))))
+ .HasEnabledAutofillServices)
+ {
+ autofillPref.Summary = Activity.GetString(Resource.String.plugin_enabled);
+ autofillPref.Intent = new Intent(Intent.ActionView);
+ autofillPref.Intent.SetData(Android.Net.Uri.Parse("https://philippc.github.io/keepass2android/OreoAutoFill.html"));
+ }
+ else
+ {
+ autofillPref.Summary = Activity.GetString(Resource.String.not_enabled);
+
+
+
+
+
+ }
+
+ }
+ }
+
+ private void OnSendDebug(object sender, Preference.PreferenceClickEventArgs e)
{
Kp2aLog.SendLog(this.Activity);
}
@@ -945,7 +1019,9 @@ namespace keepass2android
}
- ///
+
+
+ ///
/// Activity to configure the application and database settings. The database must be unlocked, and this activity will close if it becomes locked.
///
[Activity(Label = "@string/app_name", Theme = "@style/MyTheme")]
diff --git a/src/keepass2android/views/GroupView.cs b/src/keepass2android/views/GroupView.cs
deleted file mode 100644
index e32c4ff6..00000000
--- a/src/keepass2android/views/GroupView.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
-This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file is based on Keepassdroid, Copyright Brian Pellin.
-
- Keepass2Android is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Keepass2Android is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Keepass2Android. If not, see .
- */
-
-using System;
-using Android.Content;
-using Android.Runtime;
-using Android.Util;
-using Android.Views;
-using Android.Widget;
-
-namespace keepass2android.view
-{
- /*
- public class GroupView : RelativeLayout
- {
- public GroupView (IntPtr javaReference, JniHandleOwnership transfer)
- : base(javaReference, transfer)
- {
-
- }
-
- public GroupView(Context context): base(context) {
- Inflate(context);
- }
-
- public GroupView(Context context, IAttributeSet attrs): base(context, attrs) {
- Inflate(context);
- }
-
- public ListView ListView
- {
- get { return (ListView) FindViewById(Android.Resource.Id.List); }
- }
-
- private void Inflate(Context context) {
- LayoutInflater inflater = (LayoutInflater) context.GetSystemService(Context.LayoutInflaterService);
- inflater.Inflate(Resource.Layout.group_add_entry, this);
-
-
- }
- public void SetNormalButtonVisibility(bool showAddGroup, bool showAddEntry)
- {
-
- View insertElement = FindViewById(Resource.Id.insert_element);
- insertElement.Visibility = ViewStates.Gone;
-
- View insertElementCancel = FindViewById(Resource.Id.cancel_insert_element);
- insertElementCancel.Visibility = ViewStates.Gone;
-
- View addGroup = FindViewById(Resource.Id.add_group);
- addGroup.Visibility = showAddGroup? ViewStates.Visible : ViewStates.Gone;
-
-
- View addEntry = FindViewById(Resource.Id.add_entry);
- addEntry.Visibility = showAddEntry ? ViewStates.Visible : ViewStates.Gone;
-
-
- if (!showAddEntry && !showAddGroup)
- {
- View divider2 = FindViewById(Resource.Id.divider2);
- divider2.Visibility = ViewStates.Gone;
-
- FindViewById(Resource.Id.bottom_bar).Visibility = ViewStates.Gone;
-
- View list = FindViewById(Android.Resource.Id.List);
- LayoutParams lp = (RelativeLayout.LayoutParams) list.LayoutParameters;
-
- lp.AddRule(LayoutRules.AlignParentBottom, (int) LayoutRules.True);
- }
- }
-
- public void ShowInsertButtons()
- {
- View addGroup = FindViewById(Resource.Id.add_group);
- addGroup.Visibility = ViewStates.Gone;
-
- View addEntry = FindViewById(Resource.Id.add_entry);
- addEntry.Visibility = ViewStates.Gone;
-
- View insertElement = FindViewById(Resource.Id.insert_element);
- insertElement.Visibility = ViewStates.Visible;
-
- View insertElementCancel = FindViewById(Resource.Id.cancel_insert_element);
- insertElementCancel.Visibility = ViewStates.Visible;
-
- View divider2 = FindViewById(Resource.Id.divider2);
- divider2.Visibility = ViewStates.Visible;
-
- }
-
-
- }
- */
-}
-
diff --git a/src/netftpandroid b/src/netftpandroid
index 561a509f..040e8bbe 160000
--- a/src/netftpandroid
+++ b/src/netftpandroid
@@ -1 +1 @@
-Subproject commit 561a509f390aef519cefd0c964af4f089ead211a
+Subproject commit 040e8bbe564bd140203255e11c86c01c2f7c1892