From dd6b376abfa30c46280e68636b9f358d68c009d2 Mon Sep 17 00:00:00 2001 From: PhilippC Date: Sat, 6 Apr 2013 07:15:08 +0200 Subject: [PATCH] First working version of KP2A Keyboard, but some features still missing --- .gitignore | 21 + src/KP2AKeyboard/Additions/AboutAdditions.txt | 48 + src/KP2AKeyboard/KP2AKeyboard.csproj | 59 + src/KP2AKeyboard/Properties/AssemblyInfo.cs | 28 + src/KP2AKeyboard/Resources/AboutResources.txt | 44 + .../Resources/Resource.designer.cs | 42 + src/KP2AKeyboard/Resources/values/Strings.xml | 4 + src/KP2AKeyboard/Transforms/EnumFields.xml | 14 + src/KP2AKeyboard/Transforms/EnumMethods.xml | 11 + src/KP2AKeyboard/Transforms/Metadata.xml | 9 + src/KeePass.sln | 20 + .../Additions/AboutAdditions.txt | 48 + src/Kp2aKeyboardBinding/Jars/AboutJars.txt | 37 + .../Kp2aKeyboardBinding.csproj | 61 + .../Properties/AssemblyInfo.cs | 28 + .../Transforms/EnumFields.xml | 14 + .../Transforms/EnumMethods.xml | 11 + .../Transforms/Metadata.xml | 9 + src/java/KP2ASoftKeyboard/.classpath | 4 +- src/java/KP2ASoftKeyboard/AndroidManifest.xml | 4 +- src/java/KP2ASoftKeyboard/project.properties | 1 + src/java/KP2ASoftKeyboard/project.zip | Bin 0 -> 99221 bytes .../res/drawable-hdpi/sym_keyboard.png | Bin 0 -> 1486 bytes .../res/drawable-hdpi/sym_keyboard_kp2a.png | Bin 0 -> 1178 bytes .../res/drawable-mdpi/sym_keyboard.png | Bin 0 -> 726 bytes .../res/drawable-mdpi/sym_keyboard_kp2a.png | Bin 0 -> 718 bytes .../KP2ASoftKeyboard/res/values/strings.xml | 3 + src/java/KP2ASoftKeyboard/res/xml/qwerty.xml | 6 +- .../kbbridge/KeyboardData.java | 12 + .../kbbridge/KeyboardDataBuilder.java | 0 .../softkeyboard/KP2AKeyboard.java | 1219 +++++----- .../softkeyboard/LatinKeyboardView.java | 3 +- src/java/kbbridge/.classpath | 8 - src/java/kbbridge/.project | 33 - src/java/kbbridge/AndroidManifest.xml | 17 - .../keepass2android/kbbridge/BuildConfig.java | 6 - .../gen/keepass2android/kbbridge/R.java | 47 - src/java/kbbridge/proguard-project.txt | 20 - src/java/kbbridge/project.properties | 15 - src/java/kbbridge/res/values/strings.xml | 5 - src/java/kbbridge/res/values/styles.xml | 20 - .../kbbridge/KeyboardData.java | 6 - .../Properties/AndroidManifest_net.xml | 8 + .../Resources/Resource.designer.cs | 1967 +++++++++-------- .../drawable-hdpi/notify_keyboard.png | Bin 0 -> 1242 bytes .../Resources/drawable/notify_keyboard.png | Bin 0 -> 896 bytes .../Resources/values/strings.xml | 3 + src/keepass2android/intents/Intents.cs | 1 + src/keepass2android/keepass2android.csproj | 6 + .../services/CopyToClipboardService.cs | 154 +- 50 files changed, 2364 insertions(+), 1712 deletions(-) create mode 100644 src/KP2AKeyboard/Additions/AboutAdditions.txt create mode 100644 src/KP2AKeyboard/KP2AKeyboard.csproj create mode 100644 src/KP2AKeyboard/Properties/AssemblyInfo.cs create mode 100644 src/KP2AKeyboard/Resources/AboutResources.txt create mode 100644 src/KP2AKeyboard/Resources/Resource.designer.cs create mode 100644 src/KP2AKeyboard/Resources/values/Strings.xml create mode 100644 src/KP2AKeyboard/Transforms/EnumFields.xml create mode 100644 src/KP2AKeyboard/Transforms/EnumMethods.xml create mode 100644 src/KP2AKeyboard/Transforms/Metadata.xml create mode 100644 src/Kp2aKeyboardBinding/Additions/AboutAdditions.txt create mode 100644 src/Kp2aKeyboardBinding/Jars/AboutJars.txt create mode 100644 src/Kp2aKeyboardBinding/Kp2aKeyboardBinding.csproj create mode 100644 src/Kp2aKeyboardBinding/Properties/AssemblyInfo.cs create mode 100644 src/Kp2aKeyboardBinding/Transforms/EnumFields.xml create mode 100644 src/Kp2aKeyboardBinding/Transforms/EnumMethods.xml create mode 100644 src/Kp2aKeyboardBinding/Transforms/Metadata.xml create mode 100644 src/java/KP2ASoftKeyboard/project.zip create mode 100644 src/java/KP2ASoftKeyboard/res/drawable-hdpi/sym_keyboard.png create mode 100644 src/java/KP2ASoftKeyboard/res/drawable-hdpi/sym_keyboard_kp2a.png create mode 100644 src/java/KP2ASoftKeyboard/res/drawable-mdpi/sym_keyboard.png create mode 100644 src/java/KP2ASoftKeyboard/res/drawable-mdpi/sym_keyboard_kp2a.png create mode 100644 src/java/KP2ASoftKeyboard/src/keepass2android/kbbridge/KeyboardData.java rename src/java/{kbbridge => KP2ASoftKeyboard}/src/keepass2android/kbbridge/KeyboardDataBuilder.java (100%) delete mode 100644 src/java/kbbridge/.classpath delete mode 100644 src/java/kbbridge/.project delete mode 100644 src/java/kbbridge/AndroidManifest.xml delete mode 100644 src/java/kbbridge/gen/keepass2android/kbbridge/BuildConfig.java delete mode 100644 src/java/kbbridge/gen/keepass2android/kbbridge/R.java delete mode 100644 src/java/kbbridge/proguard-project.txt delete mode 100644 src/java/kbbridge/project.properties delete mode 100644 src/java/kbbridge/res/values/strings.xml delete mode 100644 src/java/kbbridge/res/values/styles.xml delete mode 100644 src/java/kbbridge/src/keepass2android/kbbridge/KeyboardData.java create mode 100644 src/keepass2android/Resources/drawable-hdpi/notify_keyboard.png create mode 100644 src/keepass2android/Resources/drawable/notify_keyboard.png diff --git a/.gitignore b/.gitignore index 71eff6fc..c0e6eab7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,24 @@ /src/KeePassLib2Android/bin /src/KeePass.userprefs /src/keepass2android/Properties/AndroidManifest.xml + +/src/java/kbbridge/bin/AndroidManifest.xml +/src/java/kbbridge/bin/R.txt +/src/java/kbbridge/bin/classes/keepass2android/kbbridge/BuildConfig.class +/src/java/kbbridge/bin/classes/keepass2android/kbbridge/KeyboardData.class +/src/java/kbbridge/bin/classes/keepass2android/kbbridge/KeyboardDataBuilder.class +/src/java/kbbridge/bin/classes/keepass2android/kbbridge/R$attr.class +/src/java/kbbridge/bin/classes/keepass2android/kbbridge/R$drawable.class +/src/java/kbbridge/bin/classes/keepass2android/kbbridge/R$string.class +/src/java/kbbridge/bin/classes/keepass2android/kbbridge/R$style.class +/src/java/kbbridge/bin/classes/keepass2android/kbbridge/R.class +/src/java/kbbridge/bin/kp2asoftkeyboardbridge.jar +/src/java/kbbridge/bin/res/drawable-hdpi/ic_launcher.png +/src/java/kbbridge/bin/res/drawable-mdpi/ic_launcher.png +/src/java/kbbridge/bin/res/drawable-xhdpi/ic_launcher.png + +/src/java/kbbridge/libs/android-support-v4.jar +/src/java/KP2ASoftKeyboard/bin +/src/java/KP2ASoftKeyboard/gen +/src/java/KP2ASoftKeyboard/projectzip +/src/java/KP2ASoftKeyboard/createProjectZip.bat diff --git a/src/KP2AKeyboard/Additions/AboutAdditions.txt b/src/KP2AKeyboard/Additions/AboutAdditions.txt new file mode 100644 index 00000000..9141ebd7 --- /dev/null +++ b/src/KP2AKeyboard/Additions/AboutAdditions.txt @@ -0,0 +1,48 @@ +Additions allow you to add arbitrary C# to the generated classes +before they are compiled. This can be helpful for providing convenience +methods or adding pure C# classes. + +== Adding Methods to Generated Classes == + +Let's say the library being bound has a Rectangle class with a constructor +that takes an x and y position, and a width and length size. It will look like +this: + +public partial class Rectangle +{ + public Rectangle (int x, int y, int width, int height) + { + // JNI bindings + } +} + +Imagine we want to add a constructor to this class that takes a Point and +Size structure instead of 4 ints. We can add a new file called Rectangle.cs +with a partial class containing our new method: + +public partial class Rectangle +{ + public Rectangle (Point location, Size size) : + this (location.X, location.Y, size.Width, size.Height) + { + } +} + +At compile time, the additions class will be added to the generated class +and the final assembly will a Rectangle class with both constructors. + + +== Adding C# Classes == + +Another thing that can be done is adding fully C# managed classes to the +generated library. In the above example, let's assume that there isn't a +Point class available in Java or our library. The one we create doesn't need +to interact with Java, so we'll create it like a normal class in C#. + +By adding a Point.cs file with this class, it will end up in the binding library: + +public class Point +{ + public int X { get; set; } + public int Y { get; set; } +} diff --git a/src/KP2AKeyboard/KP2AKeyboard.csproj b/src/KP2AKeyboard/KP2AKeyboard.csproj new file mode 100644 index 00000000..2705f474 --- /dev/null +++ b/src/KP2AKeyboard/KP2AKeyboard.csproj @@ -0,0 +1,59 @@ + + + + Debug + AnyCPU + 10.0.0 + 2.0 + {4F9D8890-82EE-4A3B-8E98-61B00B5AADAA} + {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{10368E6C-D01B-4462-8E8B-01FC667A7035};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + KP2AKeyboard + Resources + Assets + KP2AKeyboard + + + True + full + False + bin\Debug + DEBUG; + 4 + False + None + + + none + True + bin\Release + 4 + False + False + SdkOnly + + + + + + + + + + + + + + + + + + + + + + project.zip + Always + + + \ No newline at end of file diff --git a/src/KP2AKeyboard/Properties/AssemblyInfo.cs b/src/KP2AKeyboard/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c67f8b19 --- /dev/null +++ b/src/KP2AKeyboard/Properties/AssemblyInfo.cs @@ -0,0 +1,28 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using Android.App; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("KP2AKeyboard")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("Philipp")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.0")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/src/KP2AKeyboard/Resources/AboutResources.txt b/src/KP2AKeyboard/Resources/AboutResources.txt new file mode 100644 index 00000000..54c2267a --- /dev/null +++ b/src/KP2AKeyboard/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.axml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.axml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "R" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the R class would expose: + +public class R { + public class drawable { + public const int icon = 0x123; + } + + public class layout { + public const int main = 0x456; + } + + public class strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main +to reference the layout/main.axml file, or R.strings.first_string to reference the first +string in the dictionary file values/strings.xml. diff --git a/src/KP2AKeyboard/Resources/Resource.designer.cs b/src/KP2AKeyboard/Resources/Resource.designer.cs new file mode 100644 index 00000000..a7963b30 --- /dev/null +++ b/src/KP2AKeyboard/Resources/Resource.designer.cs @@ -0,0 +1,42 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.296 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +[assembly: Android.Runtime.ResourceDesignerAttribute("KP2AKeyboard.Resource", IsApplication=false)] + +namespace KP2AKeyboard +{ + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Novell.MonoDroid.Build.Tasks", "1.0.0.0")] + public partial class Resource + { + + public partial class Attribute + { + + private Attribute() + { + } + } + + public partial class String + { + + // aapt resource value: 0x7f020000 + public static int library_name = 2130837504; + + private String() + { + } + } + } +} +#pragma warning restore 1591 diff --git a/src/KP2AKeyboard/Resources/values/Strings.xml b/src/KP2AKeyboard/Resources/values/Strings.xml new file mode 100644 index 00000000..f89a894f --- /dev/null +++ b/src/KP2AKeyboard/Resources/values/Strings.xml @@ -0,0 +1,4 @@ + + + KP2AKeyboard + diff --git a/src/KP2AKeyboard/Transforms/EnumFields.xml b/src/KP2AKeyboard/Transforms/EnumFields.xml new file mode 100644 index 00000000..b3aca487 --- /dev/null +++ b/src/KP2AKeyboard/Transforms/EnumFields.xml @@ -0,0 +1,14 @@ + + + diff --git a/src/KP2AKeyboard/Transforms/EnumMethods.xml b/src/KP2AKeyboard/Transforms/EnumMethods.xml new file mode 100644 index 00000000..0ffc15ca --- /dev/null +++ b/src/KP2AKeyboard/Transforms/EnumMethods.xml @@ -0,0 +1,11 @@ + + + diff --git a/src/KP2AKeyboard/Transforms/Metadata.xml b/src/KP2AKeyboard/Transforms/Metadata.xml new file mode 100644 index 00000000..87ac70dc --- /dev/null +++ b/src/KP2AKeyboard/Transforms/Metadata.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/KeePass.sln b/src/KeePass.sln index 9e97eeaf..0b73d48e 100644 --- a/src/KeePass.sln +++ b/src/KeePass.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "keepass2android", "keepass2 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "kp2akeytransform", "kp2akeytransform\kp2akeytransform.csproj", "{A57B3ACE-5634-469A-88C4-858BB409F356}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kp2aKeyboardBinding", "Kp2aKeyboardBinding\Kp2aKeyboardBinding.csproj", "{A8779D4D-7C49-4C2F-82BD-2CDC448391DA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -74,6 +76,24 @@ Global {A6CF8A86-37C1-4197-80FE-519DE2C842F5}.Release|x64.Build.0 = Release|Any CPU {A6CF8A86-37C1-4197-80FE-519DE2C842F5}.ReleaseNoNet|Any CPU.ActiveCfg = ReleaseNoNet|Any CPU {A6CF8A86-37C1-4197-80FE-519DE2C842F5}.ReleaseNoNet|Any CPU.Build.0 = ReleaseNoNet|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Debug|Win32.ActiveCfg = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Debug|Win32.Build.0 = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Debug|x64.ActiveCfg = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Debug|x64.Build.0 = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Release|Any CPU.Build.0 = Release|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Release|Win32.ActiveCfg = Release|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Release|Win32.Build.0 = Release|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Release|x64.ActiveCfg = Release|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.Release|x64.Build.0 = Release|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.ReleaseNoNet|Any CPU.ActiveCfg = Debug|Any CPU + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA}.ReleaseNoNet|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution diff --git a/src/Kp2aKeyboardBinding/Additions/AboutAdditions.txt b/src/Kp2aKeyboardBinding/Additions/AboutAdditions.txt new file mode 100644 index 00000000..9141ebd7 --- /dev/null +++ b/src/Kp2aKeyboardBinding/Additions/AboutAdditions.txt @@ -0,0 +1,48 @@ +Additions allow you to add arbitrary C# to the generated classes +before they are compiled. This can be helpful for providing convenience +methods or adding pure C# classes. + +== Adding Methods to Generated Classes == + +Let's say the library being bound has a Rectangle class with a constructor +that takes an x and y position, and a width and length size. It will look like +this: + +public partial class Rectangle +{ + public Rectangle (int x, int y, int width, int height) + { + // JNI bindings + } +} + +Imagine we want to add a constructor to this class that takes a Point and +Size structure instead of 4 ints. We can add a new file called Rectangle.cs +with a partial class containing our new method: + +public partial class Rectangle +{ + public Rectangle (Point location, Size size) : + this (location.X, location.Y, size.Width, size.Height) + { + } +} + +At compile time, the additions class will be added to the generated class +and the final assembly will a Rectangle class with both constructors. + + +== Adding C# Classes == + +Another thing that can be done is adding fully C# managed classes to the +generated library. In the above example, let's assume that there isn't a +Point class available in Java or our library. The one we create doesn't need +to interact with Java, so we'll create it like a normal class in C#. + +By adding a Point.cs file with this class, it will end up in the binding library: + +public class Point +{ + public int X { get; set; } + public int Y { get; set; } +} diff --git a/src/Kp2aKeyboardBinding/Jars/AboutJars.txt b/src/Kp2aKeyboardBinding/Jars/AboutJars.txt new file mode 100644 index 00000000..9a14c103 --- /dev/null +++ b/src/Kp2aKeyboardBinding/Jars/AboutJars.txt @@ -0,0 +1,37 @@ +This directory is for Android .jars. + +There are 3 types of jars that are supported: + +== Input Jar and Embedded Jar == + +This is the jar that bindings should be generated for. + +For example, if you were binding the Google Maps library, this would +be Google's "maps.jar". + +The difference between EmbeddedJar and InputJar is, EmbeddedJar is to be +embedded in the resulting dll as EmbeddedResource, while InputJar is not. +There are couple of reasons you wouldn't like to embed the target jar +in your dll (the ones that could be internally loaded by +feature e.g. maps.jar, or you cannot embed jars that are under some +proprietary license). + +Set the build action for these jars in the properties page to "InputJar". + + +== Reference Jar and Embedded Reference Jar == + +These are jars that are referenced by the input jar. C# bindings will +not be created for these jars. These jars will be used to resolve +types used by the input jar. + +NOTE: Do not add "android.jar" as a reference jar. It will be added automatically +based on the Target Framework selected. + +Set the build action for these jars in the properties page to "ReferenceJar". + +"EmbeddedJar" works like "ReferenceJar", but like "EmbeddedJar", it is +embedded in your dll. But at application build time, they are not included +in the final apk, like ReferenceJar files. + + diff --git a/src/Kp2aKeyboardBinding/Kp2aKeyboardBinding.csproj b/src/Kp2aKeyboardBinding/Kp2aKeyboardBinding.csproj new file mode 100644 index 00000000..30ce0f23 --- /dev/null +++ b/src/Kp2aKeyboardBinding/Kp2aKeyboardBinding.csproj @@ -0,0 +1,61 @@ + + + + Debug + AnyCPU + 10.0.0 + 2.0 + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA} + {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{10368E6C-D01B-4462-8E8B-01FC667A7035};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Kp2aKeyboardBinding + Assets + Resources + Kp2aKeyboardBinding + + + True + full + False + bin\Debug + DEBUG; + prompt + 4 + False + None + + + none + True + bin\Release + prompt + 4 + False + False + SdkOnly + + + + + + + + + + + + + + + + + + + + + + + project.zip + + + \ No newline at end of file diff --git a/src/Kp2aKeyboardBinding/Properties/AssemblyInfo.cs b/src/Kp2aKeyboardBinding/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a8aed884 --- /dev/null +++ b/src/Kp2aKeyboardBinding/Properties/AssemblyInfo.cs @@ -0,0 +1,28 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using Android.App; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("Kp2aKeyboardBinding")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("Philipp")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.0")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/src/Kp2aKeyboardBinding/Transforms/EnumFields.xml b/src/Kp2aKeyboardBinding/Transforms/EnumFields.xml new file mode 100644 index 00000000..b3aca487 --- /dev/null +++ b/src/Kp2aKeyboardBinding/Transforms/EnumFields.xml @@ -0,0 +1,14 @@ + + + diff --git a/src/Kp2aKeyboardBinding/Transforms/EnumMethods.xml b/src/Kp2aKeyboardBinding/Transforms/EnumMethods.xml new file mode 100644 index 00000000..0ffc15ca --- /dev/null +++ b/src/Kp2aKeyboardBinding/Transforms/EnumMethods.xml @@ -0,0 +1,11 @@ + + + diff --git a/src/Kp2aKeyboardBinding/Transforms/Metadata.xml b/src/Kp2aKeyboardBinding/Transforms/Metadata.xml new file mode 100644 index 00000000..87ac70dc --- /dev/null +++ b/src/Kp2aKeyboardBinding/Transforms/Metadata.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/java/KP2ASoftKeyboard/.classpath b/src/java/KP2ASoftKeyboard/.classpath index a4763d1e..3f9691c5 100644 --- a/src/java/KP2ASoftKeyboard/.classpath +++ b/src/java/KP2ASoftKeyboard/.classpath @@ -1,8 +1,8 @@ - - + + diff --git a/src/java/KP2ASoftKeyboard/AndroidManifest.xml b/src/java/KP2ASoftKeyboard/AndroidManifest.xml index 27da654f..71182870 100644 --- a/src/java/KP2ASoftKeyboard/AndroidManifest.xml +++ b/src/java/KP2ASoftKeyboard/AndroidManifest.xml @@ -1,6 +1,6 @@ - + package="keepass2android.softkeyboard" android:versionCode="1"> + )loi`26-B;=+s_3$ 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 A0RR91 literal 0 HcmV?d00001 diff --git a/src/java/KP2ASoftKeyboard/res/drawable-hdpi/sym_keyboard.png b/src/java/KP2ASoftKeyboard/res/drawable-hdpi/sym_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..b57ae6656cbb4718e82ef2c54b0eb0d1bb215f35 GIT binary patch literal 1486 zcmV;<1u^=GP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*h( z1p^)K$_`Qh00mA-L_t(&-tC%CXcSi*$3L?(yNSD-jRs7j-NdZHv93K7dNCdfwSOoj zE%ab=PzqA$y?F8>bkkExD+!8+R!c)#dI@?cYe6GqwPrVs8w+lfT*Nf1rG+*zYu0gR zc6#v5GMW4_E}4*({lT!4-}~{K_kF+j`@Y|MFOq4Ryo}=EC6y|$DzGZBDzGZBDzHix z$pKOUYJnO+cC>FsF##QT3Oo_-MLRGLum#u(G>YFX0^DX61IPpa0{;NB0$|ZHr~$%l zZEf$5jg9@L>$+}Mi0Hbm-?(vOBoc|d3+x1ZcI5TI8xs=~znc{*moH!b6?h#8+4HQa zwY9a=tYFb~UEj59*9Rh%Bt?Kz>gwu(_7L8>b!)n_v$HRo%}xW_CL_FBRaJM#bn5MaiC=MJr@Rg=%X&?&}1OsgrV7{rTsfULTANHox=~#&( zpJDLWBep~|O?wE;2w;X|S&(gvY1rD`)E8}i@B-4p!a{bXB}`dmWS)vhIYHHk1Put? zV<0EqgD&YGiF7F1!0NIrYwJ~c$UsO{RW+4LeVt4udsS84Bi6lbF6u+&tf?NLB^r$$ zv9k>DA+WC1K!X5jk&a@EddQ{+Sg;kk(hB}x zNR)C|F&qxJ_V@R90USGa?8mvexd(t04u@M#ojUbNKA*2E6bjz8IP`kGg_@e0+3xP{ z^VVcp#=jv7@}irpxcmC`>p$CAYXH~>?7MpP>JR1afaCG_S>RP*-!lH&HiQ)efq*st z@%emyOYisl1LZPULqo%MF%6gV?|IRqK;=0*RcV>yuE()h?Ci;tCl%8)jaV%9owbkZ z?d|>k#EBDIHBAc`hOwpvRhDJL=kv|?^z?jdk;*duA3OGiYuaWn%P@YwzdN7Lr^GJW zaGXDeL^S{~?_jxY;&-k2TM*>&p8#NOH0}N$InE0eAiQ_)-nZ`Fy?cH&R$Rh5&CSiN z_wL=Bv3=Zh91ZB!Y!UQtwLKLBvDT?$v8m5C7#@fJZ8lJn(1pET?~c``q6wIiBrOW{ z;NakAU0q#9Hk&`iCiqDmJit3)YSA&B9R!b zw6pu$w{QQ^(b4fS&}yxB_S=?PK?2)FIaCR^EkzNbS>SKMta-p#>3+;-J0;%i_hW`2 zH%;W1K~*a8s&>8pNlcQ~Z`Q6ypIo_IKXc{`@pzn`o}LwL`uqDyBog%X^|_RNrnxSU zT_z?bO8P5Tt}JTv`~6(IcCFN&$z)vVlPkagMn*9JlLqkKZr-$pn04`j(P_i2s7}$`!-!QsA oefl(-rg8lE@eQH-mv$ZdA9pzK2Jh=p?f?J)07*qoM6N<$f~LsG+yDRo literal 0 HcmV?d00001 diff --git a/src/java/KP2ASoftKeyboard/res/drawable-hdpi/sym_keyboard_kp2a.png b/src/java/KP2ASoftKeyboard/res/drawable-hdpi/sym_keyboard_kp2a.png new file mode 100644 index 0000000000000000000000000000000000000000..1bddc2078e4c7551d70d63295e2afdd279601452 GIT binary patch literal 1178 zcmV;L1ZDe)P)Px#0%A)?L;wJ)jUzGu000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*h(0}%=l zV2AVo000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000B|Nkl$#5``4#Dm`=sPKS7z zIoAv3CCmayn9K|bGaT5I#rAFQ9)KyT6wowx0poNR^nqSf#*n2U>Rjreffh)HVJB<* z<4dc7V(=|z+2IcAfz&D8ZjB|p&17Z>6QlM{^@lYxAeiWh_v?T<@JJX)X;MwY5SS^1 zOwv5;KP*hBn2A2&6&ENAj|-`^LBb5lkOfbW;g9*3Vjb2nm=Ag5FoCHlEpGMMEa9Ti zN4cHynye~HYN)8H^Zr3^;MxF%x*JaJtZk~Uk|hN-7hsS{W0^hfsqVd*vdKuw&_oAJ zZnATq+n(K>xr7pNI7e8U(D&|C_hj^wpI2Je1}2T`crNo@_jGO~KIu|9;6%``u~@j) z3Ao4^LRiC(`V3&QE}+v2iSh+8Sm-yIAr_}kOh2Nv!V*GJ!onvo!pvzQUpq2&Xy%#P zkT;h!SktK@FlvhMxI}gWM){Rlwz7>l(T5@PN>ma`Ern|YEVSEVAP!0a#3_cEA*RY} zyhn@=P?E)IR|P@72_sT%DP3o{z%Fj^HhGS7f};#F8@gtVhbTRfaf9^hau!CGvs~n3 zhJpJT;TSs;Nz^r;#0_)YcrB@+)#3&)zygb`ppPp_fTgNRXV+4`h=>?0CPR)45FuO( zusY~;E4z*J1;6p9o?ru>oBU{5y})z!q!!zp!MHl#>L6U!SD7i$NW)S6oO`R=t2Hg_ z746xYEn@h(v^^GkUTwc4E^cl%cG&)nN28^6HMXojx2c?KQ=`gw3!|OM?JAVq?a!67 zcPHPvKI_^ritcG;&JisQY*JUAylYqNmfdI3W}0Z$n5TWEi_@% literal 0 HcmV?d00001 diff --git a/src/java/KP2ASoftKeyboard/res/drawable-mdpi/sym_keyboard.png b/src/java/KP2ASoftKeyboard/res/drawable-mdpi/sym_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..33d68cccfada6bc886222144bf4bab069db2b531 GIT binary patch literal 726 zcmV;{0xA88P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*h( z1p*fr1lA1z00LG?L_t(o!|j;CirP>VhQDhvMr~`XG8Z8*bYq~tOrK!hpjixbF^fX! zqKkIhzCoX$FJp^tN>L~kCDCFgQggdGmP{F)(Wp2u2M*UGa{oW){`Z^{l`)26vI0kD z4}=~F6Qw_!OW5_(2d{gkd-` z2evQ_M?nx=06tJrKm&LlhT#|2b?d!e?|Y}y={k-xS4yS(NRKh5kR(a5-ERA>R_j?5 zMdMnn_5%27i)N~>>(&Q@!B5}!KLK4}wC5vh0DiyUf8}{z6Q}~krG{*P*=%+N`~bcI zzeGz#@udjKhTtmkQ2fD zXZ9_rb%2I3<}-j&Di95P+%i6wTNSSYwC{4@!{IR6WxUSpI~1;1YyDc{DL{@m&gklX zw2s>{WC7(Inz>0sRvtq4MniA1O;~IFK3i|J*6*a=Y^))B%cCwzrFB*m!bED$!8G(i zCWLi1J*b9~B$=$OsE%WDYbZ_Af;73BXutvHTIZ|)5{#d z6^yE2UL&*s{s2@el@f3!8=gv6J`pEFzyfBXl~tF)0-pX??@r`FjA-yoFcA(5TUbw` zC>nd7*X(w?FAq5nd7jsdqG&8lcYc%;qkT*>_0hd`99wTiZTjzrQfeC!@Bhu!7;_`g zs_*wsXql-j`112MS=`BhmL;_dGCP?Vvjp;z$uoZB7Wyjt3*IyPx#0%A)?L;wJ)jUzGu000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*h(0}ue{ zu3xJF000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0006lNkl4y;H!c*qsZ{(E+~`ge zKPhe$kzzOEM_baoBsEP+^D)=Oyu>sGb%tTyaL+k+?wL2k3daAp4L?N>*HXE^0&^^> z@ZgmoSOKW^OlJ7`7ea=kXBeKe4SV90G+H5iqlB&)n+iVRHz=CEz*8jzuwptxX@2zbh6M#=GpWBxcSJ`{ln@Ngj{ zj0!W{XPMhvXP<}rm}J5TI-N9w23wq^mlJ#?#JXG-VW)+XvwJjI)Hq+Pta&b3Uzg9y zFLf-aYvfehS4%bCf6mnYaS4-#?+#OrRCinj>&#Fi+azdZIHY$BbrHhEu4RC?!M7b~ zv)hEuH$x=3rJlA0A^oju@ds1vdS!Zd0rpn>8;4ixVAvcr_5c6?07*qoM6N<$g7z^r Axc~qF literal 0 HcmV?d00001 diff --git a/src/java/KP2ASoftKeyboard/res/values/strings.xml b/src/java/KP2ASoftKeyboard/res/values/strings.xml index ac583d40..4315c5d7 100644 --- a/src/java/KP2ASoftKeyboard/res/values/strings.xml +++ b/src/java/KP2ASoftKeyboard/res/values/strings.xml @@ -24,6 +24,9 @@ \u0020.,;:!?\n()[]*&@{}/<>_+=|" + Select another entry + Select entry + Go Next diff --git a/src/java/KP2ASoftKeyboard/res/xml/qwerty.xml b/src/java/KP2ASoftKeyboard/res/xml/qwerty.xml index afee012a..839b5dbe 100644 --- a/src/java/KP2ASoftKeyboard/res/xml/qwerty.xml +++ b/src/java/KP2ASoftKeyboard/res/xml/qwerty.xml @@ -68,8 +68,10 @@ - + + diff --git a/src/java/KP2ASoftKeyboard/src/keepass2android/kbbridge/KeyboardData.java b/src/java/KP2ASoftKeyboard/src/keepass2android/kbbridge/KeyboardData.java new file mode 100644 index 00000000..dea665c4 --- /dev/null +++ b/src/java/KP2ASoftKeyboard/src/keepass2android/kbbridge/KeyboardData.java @@ -0,0 +1,12 @@ + +package keepass2android.kbbridge; +import java.util.HashMap; +public class KeyboardData { + public static HashMap availableFields = new HashMap(); + public static String entryName; + + public static void clear() + { + availableFields.clear(); + } +} diff --git a/src/java/kbbridge/src/keepass2android/kbbridge/KeyboardDataBuilder.java b/src/java/KP2ASoftKeyboard/src/keepass2android/kbbridge/KeyboardDataBuilder.java similarity index 100% rename from src/java/kbbridge/src/keepass2android/kbbridge/KeyboardDataBuilder.java rename to src/java/KP2ASoftKeyboard/src/keepass2android/kbbridge/KeyboardDataBuilder.java diff --git a/src/java/KP2ASoftKeyboard/src/keepass2android/softkeyboard/KP2AKeyboard.java b/src/java/KP2ASoftKeyboard/src/keepass2android/softkeyboard/KP2AKeyboard.java index 86131e2d..33ee8dc8 100644 --- a/src/java/KP2ASoftKeyboard/src/keepass2android/softkeyboard/KP2AKeyboard.java +++ b/src/java/KP2ASoftKeyboard/src/keepass2android/softkeyboard/KP2AKeyboard.java @@ -17,10 +17,14 @@ package keepass2android.softkeyboard; import android.app.AlertDialog; +import android.content.ComponentName; import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; import android.inputmethodservice.InputMethodService; import android.inputmethodservice.Keyboard; import android.inputmethodservice.KeyboardView; +import android.provider.Settings; import android.text.InputType; import android.view.KeyEvent; import android.view.View; @@ -33,613 +37,672 @@ import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import keepass2android.softkeyboard.R; /** - * Example of writing an input method for a soft keyboard. This code is - * focused on simplicity over completeness, so it should in no way be considered - * to be a complete soft keyboard implementation. Its purpose is to provide - * a basic example for how you would get started writing an input method, to - * be fleshed out as appropriate. + * Example of writing an input method for a soft keyboard. This code is focused + * on simplicity over completeness, so it should in no way be considered to be a + * complete soft keyboard implementation. Its purpose is to provide a basic + * example for how you would get started writing an input method, to be fleshed + * out as appropriate. */ -public class KP2AKeyboard extends InputMethodService - implements KeyboardView.OnKeyboardActionListener { - static final boolean DEBUG = false; - - private InputMethodManager mInputMethodManager; +public class KP2AKeyboard extends InputMethodService implements + KeyboardView.OnKeyboardActionListener { + static final boolean DEBUG = false; - private LatinKeyboardView mInputView; - private CandidateView mCandidateView; - private CompletionInfo[] mCompletions; - - private StringBuilder mComposing = new StringBuilder(); - private boolean mPredictionOn; - private boolean mCompletionOn; - private int mLastDisplayWidth; - private boolean mCapsLock; - private long mLastShiftTime; - private long mMetaState; - - private LatinKeyboard mSymbolsKeyboard; - private LatinKeyboard mSymbolsShiftedKeyboard; - private LatinKeyboard mQwertyKeyboard; - - private LatinKeyboard mCurKeyboard; - - private String mWordSeparators; - - /** - * Main initialization of the input method component. Be sure to call - * to super class. - */ - @Override public void onCreate() { - super.onCreate(); - mInputMethodManager = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); - mWordSeparators = getResources().getString(R.string.word_separators); - } - - /** - * This is the point where you can do all of your UI initialization. It - * is called after creation and any configuration change. - */ - @Override public void onInitializeInterface() { - if (mQwertyKeyboard != null) { - // Configuration changes can happen after the keyboard gets recreated, - // so we need to be able to re-build the keyboards if the available - // space has changed. - int displayWidth = getMaxWidth(); - if (displayWidth == mLastDisplayWidth) return; - mLastDisplayWidth = displayWidth; - } - mQwertyKeyboard = new LatinKeyboard(this, R.xml.qwerty); - mSymbolsKeyboard = new LatinKeyboard(this, R.xml.symbols); - mSymbolsShiftedKeyboard = new LatinKeyboard(this, R.xml.symbols_shift); - } - - /** - * Called by the framework when your view for creating input needs to - * be generated. This will be called the first time your input method - * is displayed, and every time it needs to be re-created such as due to - * a configuration change. - */ - @Override public View onCreateInputView() { - mInputView = (LatinKeyboardView) getLayoutInflater().inflate( - R.layout.input, null); - mInputView.setOnKeyboardActionListener(this); - mInputView.setKeyboard(mQwertyKeyboard); - return mInputView; - } + private InputMethodManager mInputMethodManager; - /** - * Called by the framework when your view for showing candidates needs to - * be generated, like {@link #onCreateInputView}. - */ - @Override public View onCreateCandidatesView() { - mCandidateView = new CandidateView(this); - mCandidateView.setService(this); - return mCandidateView; - } + private LatinKeyboardView mInputView; + private CandidateView mCandidateView; + private CompletionInfo[] mCompletions; - /** - * This is the main point where we do our initialization of the input method - * to begin operating on an application. At this point we have been - * bound to the client, and are now receiving all of the detailed information - * about the target of our edits. - */ - @Override public void onStartInput(EditorInfo attribute, boolean restarting) { - super.onStartInput(attribute, restarting); - - // Reset our state. We want to do this even if restarting, because - // the underlying state of the text editor could have changed in any way. - mComposing.setLength(0); - updateCandidates(); - - if (!restarting) { - // Clear shift states. - mMetaState = 0; - } - - mPredictionOn = false; - mCompletionOn = false; - mCompletions = null; - - // We are now going to initialize our state based on the type of - // text being edited. - switch (attribute.inputType & InputType.TYPE_MASK_CLASS) { - case InputType.TYPE_CLASS_NUMBER: - case InputType.TYPE_CLASS_DATETIME: - // Numbers and dates default to the symbols keyboard, with - // no extra features. - mCurKeyboard = mSymbolsKeyboard; - break; - - case InputType.TYPE_CLASS_PHONE: - // Phones will also default to the symbols keyboard, though - // often you will want to have a dedicated phone keyboard. - mCurKeyboard = mSymbolsKeyboard; - break; - - case InputType.TYPE_CLASS_TEXT: - // This is general text editing. We will default to the - // normal alphabetic keyboard, and assume that we should - // be doing predictive text (showing candidates as the - // user types). - mCurKeyboard = mQwertyKeyboard; - mPredictionOn = true; - - // We now look for a few special variations of text that will - // modify our behavior. - int variation = attribute.inputType & InputType.TYPE_MASK_VARIATION; - if (variation == InputType.TYPE_TEXT_VARIATION_PASSWORD || - variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) { - // Do not display predictions / what the user is typing - // when they are entering a password. - mPredictionOn = false; - } - - if (variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS - || variation == InputType.TYPE_TEXT_VARIATION_URI - || variation == InputType.TYPE_TEXT_VARIATION_FILTER) { - // Our predictions are not useful for e-mail addresses - // or URIs. - mPredictionOn = false; - } - - if ((attribute.inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { - // If this is an auto-complete text view, then our predictions - // will not be shown and instead we will allow the editor - // to supply their own. We only show the editor's - // candidates when in fullscreen mode, otherwise relying - // own it displaying its own UI. - mPredictionOn = false; - mCompletionOn = isFullscreenMode(); - } - - // We also want to look at the current state of the editor - // to decide whether our alphabetic keyboard should start out - // shifted. - updateShiftKeyState(attribute); - break; - - default: - // For all unknown input types, default to the alphabetic - // keyboard with no special features. - mCurKeyboard = mQwertyKeyboard; - updateShiftKeyState(attribute); - } - - // Update the label on the enter key, depending on what the application - // says it will do. - mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions); - } + private StringBuilder mComposing = new StringBuilder(); + private boolean mPredictionOn; + private boolean mCompletionOn; + private int mLastDisplayWidth; + private boolean mCapsLock; + private long mLastShiftTime; + private long mMetaState; - /** - * This is called when the user is done editing a field. We can use - * this to reset our state. - */ - @Override public void onFinishInput() { - super.onFinishInput(); - - // Clear current composing text and candidates. - mComposing.setLength(0); - updateCandidates(); - - // We only hide the candidates window when finishing input on - // a particular editor, to avoid popping the underlying application - // up and down if the user is entering text into the bottom of - // its window. - setCandidatesViewShown(false); - - mCurKeyboard = mQwertyKeyboard; - if (mInputView != null) { - mInputView.closing(); - } - } - - @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { - super.onStartInputView(attribute, restarting); - // Apply the selected keyboard to the input view. - mInputView.setKeyboard(mCurKeyboard); - mInputView.closing(); - //final InputMethodSubtype subtype = mInputMethodManager.getCurrentInputMethodSubtype(); - //mInputView.setSubtypeOnSpaceKey(subtype); - } + private LatinKeyboard mSymbolsKeyboard; + private LatinKeyboard mSymbolsShiftedKeyboard; + private LatinKeyboard mQwertyKeyboard; - @Override - public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) { - mInputView.setSubtypeOnSpaceKey(subtype); - } + private LatinKeyboard mCurKeyboard; - /** - * Deal with the editor reporting movement of its cursor. - */ - @Override public void onUpdateSelection(int oldSelStart, int oldSelEnd, - int newSelStart, int newSelEnd, - int candidatesStart, int candidatesEnd) { - super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, - candidatesStart, candidatesEnd); - - // If the current selection in the text view changes, we should - // clear whatever candidate text we have. - if (mComposing.length() > 0 && (newSelStart != candidatesEnd - || newSelEnd != candidatesEnd)) { - mComposing.setLength(0); - updateCandidates(); - InputConnection ic = getCurrentInputConnection(); - if (ic != null) { - ic.finishComposingText(); - } - } - } + private String mWordSeparators; - /** - * This tells us about completions that the editor has determined based - * on the current text in it. We want to use this in fullscreen mode - * to show the completions ourself, since the editor can not be seen - * in that situation. - */ - @Override public void onDisplayCompletions(CompletionInfo[] completions) { - if (mCompletionOn) { - mCompletions = completions; - if (completions == null) { - setSuggestions(null, false, false); - return; - } - - List stringList = new ArrayList(); - for (int i = 0; i < completions.length; i++) { - CompletionInfo ci = completions[i]; - if (ci != null) stringList.add(ci.getText().toString()); - } - setSuggestions(stringList, true, true); - } - } - - - /** - * Use this to monitor key events being delivered to the application. - * We get first crack at them, and can either resume them or let them - * continue to the app. - */ - @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_BACK: - // The InputMethodService already takes care of the back - // key for us, to dismiss the input method if it is shown. - // However, our keyboard could be showing a pop-up window - // that back should dismiss, so we first allow it to do that. - if (event.getRepeatCount() == 0 && mInputView != null) { - if (mInputView.handleBack()) { - return true; - } - } - break; - - case KeyEvent.KEYCODE_DEL: - // Special handling of the delete key: if we currently are - // composing text for the user, we want to modify that instead - // of let the application to the delete itself. - if (mComposing.length() > 0) { - onKey(Keyboard.KEYCODE_DELETE, null); - return true; - } - break; - - case KeyEvent.KEYCODE_ENTER: - // Let the underlying text editor always handle these. - return false; - - default: - - } - - return super.onKeyDown(keyCode, event); - } + /** + * Main initialization of the input method component. Be sure to call to + * super class. + */ + @Override + public void onCreate() { + super.onCreate(); + mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + mWordSeparators = getResources().getString(R.string.word_separators); + } + /** + * This is the point where you can do all of your UI initialization. It is + * called after creation and any configuration change. + */ + @Override + public void onInitializeInterface() { + if (mQwertyKeyboard != null) { + // Configuration changes can happen after the keyboard gets + // recreated, + // so we need to be able to re-build the keyboards if the available + // space has changed. + int displayWidth = getMaxWidth(); + if (displayWidth == mLastDisplayWidth) + return; + mLastDisplayWidth = displayWidth; + } + mQwertyKeyboard = new LatinKeyboard(this, R.xml.qwerty); + mSymbolsKeyboard = new LatinKeyboard(this, R.xml.symbols); + mSymbolsShiftedKeyboard = new LatinKeyboard(this, R.xml.symbols_shift); + } - /** - * Helper function to commit any text being composed in to the editor. - */ - private void commitTyped(InputConnection inputConnection) { - if (mComposing.length() > 0) { - inputConnection.commitText(mComposing, mComposing.length()); - mComposing.setLength(0); - updateCandidates(); - } - } + /** + * Called by the framework when your view for creating input needs to be + * generated. This will be called the first time your input method is + * displayed, and every time it needs to be re-created such as due to a + * configuration change. + */ + @Override + public View onCreateInputView() { + mInputView = (LatinKeyboardView) getLayoutInflater().inflate( + R.layout.input, null); + mInputView.setOnKeyboardActionListener(this); + mInputView.setKeyboard(mQwertyKeyboard); + return mInputView; + } - /** - * Helper to update the shift state of our keyboard based on the initial - * editor state. - */ - private void updateShiftKeyState(EditorInfo attr) { - if (attr != null - && mInputView != null && mQwertyKeyboard == mInputView.getKeyboard()) { - int caps = 0; - EditorInfo ei = getCurrentInputEditorInfo(); - if (ei != null && ei.inputType != InputType.TYPE_NULL) { - caps = getCurrentInputConnection().getCursorCapsMode(attr.inputType); - } - mInputView.setShifted(mCapsLock || caps != 0); - } - } - - /** - * Helper to determine if a given character code is alphabetic. - */ - private boolean isAlphabet(int code) { - if (Character.isLetter(code)) { - return true; - } else { - return false; - } - } - - /** - * Helper to send a key down / key up pair to the current editor. - */ - private void keyDownUp(int keyEventCode) { - getCurrentInputConnection().sendKeyEvent( - new KeyEvent(KeyEvent.ACTION_DOWN, keyEventCode)); - getCurrentInputConnection().sendKeyEvent( - new KeyEvent(KeyEvent.ACTION_UP, keyEventCode)); - } - - /** - * Helper to send a character to the editor as raw key events. - */ - private void sendKey(int keyCode) { - switch (keyCode) { - case '\n': - keyDownUp(KeyEvent.KEYCODE_ENTER); - break; - default: - if (keyCode >= '0' && keyCode <= '9') { - keyDownUp(keyCode - '0' + KeyEvent.KEYCODE_0); - } else { - getCurrentInputConnection().commitText(String.valueOf((char) keyCode), 1); - } - break; - } - } + /** + * Called by the framework when your view for showing candidates needs to be + * generated, like {@link #onCreateInputView}. + */ + @Override + public View onCreateCandidatesView() { + mCandidateView = new CandidateView(this); + mCandidateView.setService(this); + return mCandidateView; + } - // Implementation of KeyboardViewListener + /** + * This is the main point where we do our initialization of the input method + * to begin operating on an application. At this point we have been bound to + * the client, and are now receiving all of the detailed information about + * the target of our edits. + */ + @Override + public void onStartInput(EditorInfo attribute, boolean restarting) { + super.onStartInput(attribute, restarting); - public void onKey(int primaryCode, int[] keyCodes) { - if (isWordSeparator(primaryCode)) { - // Handle separator - if (mComposing.length() > 0) { - commitTyped(getCurrentInputConnection()); - } - sendKey(primaryCode); - updateShiftKeyState(getCurrentInputEditorInfo()); - } else if (primaryCode == Keyboard.KEYCODE_DELETE) { - handleBackspace(); - } else if (primaryCode == Keyboard.KEYCODE_SHIFT) { - handleShift(); - } else if (primaryCode == Keyboard.KEYCODE_CANCEL) { - handleClose(); - return; - } else if (primaryCode == LatinKeyboardView.KEYCODE_KP2A) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - final CharSequence[] items = {"Gallery Image Menu!", "hello你好", "View pattern", "Delete pattern", "Locate pattern in list view", "Row Counter (with pattern)", "Share Pattern", "Share Image"}; - builder.setTitle("Keepass2Android"); - //builder.setMessage("What do you want to type securely?"); - builder.setItems(items, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { + // Reset our state. We want to do this even if restarting, because + // the underlying state of the text editor could have changed in any + // way. + mComposing.setLength(0); + updateCandidates(); - getCurrentInputConnection().commitText(items[item],0); + if (!restarting) { + // Clear shift states. + mMetaState = 0; + } - if (item == 0){ - } + mPredictionOn = false; + mCompletionOn = false; + mCompletions = null; - } - }); - // Add the buttons - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // User cancelled the dialog - } - }); - // Set other dialog properties + // We are now going to initialize our state based on the type of + // text being edited. + switch (attribute.inputType & InputType.TYPE_MASK_CLASS) { + case InputType.TYPE_CLASS_NUMBER: + case InputType.TYPE_CLASS_DATETIME: + // Numbers and dates default to the symbols keyboard, with + // no extra features. + mCurKeyboard = mSymbolsKeyboard; + break; - // Create the AlertDialog - AlertDialog dialog = builder.create(); - Window window = dialog.getWindow(); - WindowManager.LayoutParams lp = window.getAttributes(); - lp.token = mInputView.getWindowToken(); - lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; - window.setAttributes(lp); - window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); - - dialog.show(); - } else if (primaryCode == LatinKeyboardView.KEYCODE_OPTIONS) { - // Show a menu or somethin' - } else if (primaryCode == Keyboard.KEYCODE_MODE_CHANGE - && mInputView != null) { - Keyboard current = mInputView.getKeyboard(); - if (current == mSymbolsKeyboard || current == mSymbolsShiftedKeyboard) { - current = mQwertyKeyboard; - } else { - current = mSymbolsKeyboard; - } - mInputView.setKeyboard(current); - if (current == mSymbolsKeyboard) { - current.setShifted(false); - } - } else { - handleCharacter(primaryCode, keyCodes); - //mCapsLock = false; - //mInputView.setShifted(mCapsLock); - updateShiftKeyState(getCurrentInputEditorInfo()); - } - } + case InputType.TYPE_CLASS_PHONE: + // Phones will also default to the symbols keyboard, though + // often you will want to have a dedicated phone keyboard. + mCurKeyboard = mSymbolsKeyboard; + break; - public void onText(CharSequence text) { - InputConnection ic = getCurrentInputConnection(); - if (ic == null) return; - ic.beginBatchEdit(); - if (mComposing.length() > 0) { - commitTyped(ic); - } - ic.commitText(text, 0); - ic.endBatchEdit(); - updateShiftKeyState(getCurrentInputEditorInfo()); - } + case InputType.TYPE_CLASS_TEXT: + // This is general text editing. We will default to the + // normal alphabetic keyboard, and assume that we should + // be doing predictive text (showing candidates as the + // user types). + mCurKeyboard = mQwertyKeyboard; + mPredictionOn = true; - /** - * Update the list of available candidates from the current composing - * text. This will need to be filled in by however you are determining - * candidates. - */ - private void updateCandidates() { - if (!mCompletionOn) { - if (mComposing.length() > 0) { - ArrayList list = new ArrayList(); - list.add(mComposing.toString()); - setSuggestions(list, true, true); - } else { - setSuggestions(null, false, false); - } - } - } - - public void setSuggestions(List suggestions, boolean completions, - boolean typedWordValid) { - if (suggestions != null && suggestions.size() > 0) { - setCandidatesViewShown(true); - } else if (isExtractViewShown()) { - setCandidatesViewShown(true); - } - if (mCandidateView != null) { - mCandidateView.setSuggestions(suggestions, completions, typedWordValid); - } - } - - private void handleBackspace() { - final int length = mComposing.length(); - if (length > 1) { - mComposing.delete(length - 1, length); - getCurrentInputConnection().setComposingText(mComposing, 1); - updateCandidates(); - } else if (length > 0) { - mComposing.setLength(0); - getCurrentInputConnection().commitText("", 0); - updateCandidates(); - } else { - keyDownUp(KeyEvent.KEYCODE_DEL); - } - updateShiftKeyState(getCurrentInputEditorInfo()); - } + // We now look for a few special variations of text that will + // modify our behavior. + int variation = attribute.inputType & InputType.TYPE_MASK_VARIATION; + if (variation == InputType.TYPE_TEXT_VARIATION_PASSWORD + || variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) { + // Do not display predictions / what the user is typing + // when they are entering a password. + mPredictionOn = false; + } - private void handleShift() { - if (mInputView == null) { - return; - } - - Keyboard currentKeyboard = mInputView.getKeyboard(); - if (mQwertyKeyboard == currentKeyboard) { - // Alphabet keyboard - checkToggleCapsLock(); - mInputView.setShifted(mCapsLock || !mInputView.isShifted()); - + if (variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + || variation == InputType.TYPE_TEXT_VARIATION_URI + || variation == InputType.TYPE_TEXT_VARIATION_FILTER) { + // Our predictions are not useful for e-mail addresses + // or URIs. + mPredictionOn = false; + } - } else if (currentKeyboard == mSymbolsKeyboard) { - mSymbolsKeyboard.setShifted(true); - mInputView.setKeyboard(mSymbolsShiftedKeyboard); - mSymbolsShiftedKeyboard.setShifted(true); - } else if (currentKeyboard == mSymbolsShiftedKeyboard) { - mSymbolsShiftedKeyboard.setShifted(false); - mInputView.setKeyboard(mSymbolsKeyboard); - mSymbolsKeyboard.setShifted(false); - } - } - - private void handleCharacter(int primaryCode, int[] keyCodes) { - if (isInputViewShown()) { - if (mInputView.isShifted()) { - primaryCode = Character.toUpperCase(primaryCode); - } - } - if (isAlphabet(primaryCode) && mPredictionOn) { - mComposing.append((char) primaryCode); - getCurrentInputConnection().setComposingText(mComposing, 1); - updateShiftKeyState(getCurrentInputEditorInfo()); - updateCandidates(); - } else { - getCurrentInputConnection().commitText( - String.valueOf((char) primaryCode), 1); - } - } + if ((attribute.inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) { + // If this is an auto-complete text view, then our predictions + // will not be shown and instead we will allow the editor + // to supply their own. We only show the editor's + // candidates when in fullscreen mode, otherwise relying + // own it displaying its own UI. + mPredictionOn = false; + mCompletionOn = isFullscreenMode(); + } - private void handleClose() { - commitTyped(getCurrentInputConnection()); - requestHideSelf(0); - mInputView.closing(); - } + // We also want to look at the current state of the editor + // to decide whether our alphabetic keyboard should start out + // shifted. + updateShiftKeyState(attribute); + break; - private void checkToggleCapsLock() { - long now = System.currentTimeMillis(); - if (mLastShiftTime + 800 > now) { - mCapsLock = !mCapsLock; - mLastShiftTime = 0; - } else { - mLastShiftTime = now; - } - } - - private String getWordSeparators() { - return mWordSeparators; - } - - public boolean isWordSeparator(int code) { - String separators = getWordSeparators(); - return separators.contains(String.valueOf((char)code)); - } + default: + // For all unknown input types, default to the alphabetic + // keyboard with no special features. + mCurKeyboard = mQwertyKeyboard; + updateShiftKeyState(attribute); + } - public void pickDefaultCandidate() { - pickSuggestionManually(0); - } - - public void pickSuggestionManually(int index) { - if (mCompletionOn && mCompletions != null && index >= 0 - && index < mCompletions.length) { - CompletionInfo ci = mCompletions[index]; - getCurrentInputConnection().commitCompletion(ci); - if (mCandidateView != null) { - mCandidateView.clear(); - } - updateShiftKeyState(getCurrentInputEditorInfo()); - } else if (mComposing.length() > 0) { - // If we were generating candidate suggestions for the current - // text, we would commit one of them here. But for this sample, - // we will just commit the current text. - commitTyped(getCurrentInputConnection()); - } - } - - public void swipeRight() { - if (mCompletionOn) { - pickDefaultCandidate(); - } - } - - public void swipeLeft() { - handleBackspace(); - } + // Update the label on the enter key, depending on what the application + // says it will do. + mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions); + } - public void swipeDown() { - handleClose(); - } + /** + * This is called when the user is done editing a field. We can use this to + * reset our state. + */ + @Override + public void onFinishInput() { + super.onFinishInput(); - public void swipeUp() { - } - - public void onPress(int primaryCode) { - } - - public void onRelease(int primaryCode) { - } + // Clear current composing text and candidates. + mComposing.setLength(0); + updateCandidates(); + + // We only hide the candidates window when finishing input on + // a particular editor, to avoid popping the underlying application + // up and down if the user is entering text into the bottom of + // its window. + setCandidatesViewShown(false); + + mCurKeyboard = mQwertyKeyboard; + if (mInputView != null) { + mInputView.closing(); + } + } + + @Override + public void onStartInputView(EditorInfo attribute, boolean restarting) { + super.onStartInputView(attribute, restarting); + // Apply the selected keyboard to the input view. + mInputView.setKeyboard(mCurKeyboard); + mInputView.closing(); + // final InputMethodSubtype subtype = + // mInputMethodManager.getCurrentInputMethodSubtype(); + // mInputView.setSubtypeOnSpaceKey(subtype); + } + + @Override + public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) { + mInputView.setSubtypeOnSpaceKey(subtype); + } + + /** + * Deal with the editor reporting movement of its cursor. + */ + @Override + public void onUpdateSelection(int oldSelStart, int oldSelEnd, + int newSelStart, int newSelEnd, int candidatesStart, + int candidatesEnd) { + super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, + candidatesStart, candidatesEnd); + + // If the current selection in the text view changes, we should + // clear whatever candidate text we have. + if (mComposing.length() > 0 + && (newSelStart != candidatesEnd || newSelEnd != candidatesEnd)) { + mComposing.setLength(0); + updateCandidates(); + InputConnection ic = getCurrentInputConnection(); + if (ic != null) { + ic.finishComposingText(); + } + } + } + + /** + * This tells us about completions that the editor has determined based on + * the current text in it. We want to use this in fullscreen mode to show + * the completions ourself, since the editor can not be seen in that + * situation. + */ + @Override + public void onDisplayCompletions(CompletionInfo[] completions) { + if (mCompletionOn) { + mCompletions = completions; + if (completions == null) { + setSuggestions(null, false, false); + return; + } + + List stringList = new ArrayList(); + for (int i = 0; i < completions.length; i++) { + CompletionInfo ci = completions[i]; + if (ci != null) + stringList.add(ci.getText().toString()); + } + setSuggestions(stringList, true, true); + } + } + + /** + * Use this to monitor key events being delivered to the application. We get + * first crack at them, and can either resume them or let them continue to + * the app. + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_BACK: + // The InputMethodService already takes care of the back + // key for us, to dismiss the input method if it is shown. + // However, our keyboard could be showing a pop-up window + // that back should dismiss, so we first allow it to do that. + if (event.getRepeatCount() == 0 && mInputView != null) { + if (mInputView.handleBack()) { + return true; + } + } + break; + + case KeyEvent.KEYCODE_DEL: + // Special handling of the delete key: if we currently are + // composing text for the user, we want to modify that instead + // of let the application to the delete itself. + if (mComposing.length() > 0) { + onKey(Keyboard.KEYCODE_DELETE, null); + return true; + } + break; + + case KeyEvent.KEYCODE_ENTER: + // Let the underlying text editor always handle these. + return false; + + default: + + } + + return super.onKeyDown(keyCode, event); + } + + /** + * Helper function to commit any text being composed in to the editor. + */ + private void commitTyped(InputConnection inputConnection) { + if (mComposing.length() > 0) { + inputConnection.commitText(mComposing, mComposing.length()); + mComposing.setLength(0); + updateCandidates(); + } + } + + /** + * Helper to update the shift state of our keyboard based on the initial + * editor state. + */ + private void updateShiftKeyState(EditorInfo attr) { + if (attr != null && mInputView != null + && mQwertyKeyboard == mInputView.getKeyboard()) { + int caps = 0; + EditorInfo ei = getCurrentInputEditorInfo(); + if (ei != null && ei.inputType != InputType.TYPE_NULL) { + caps = getCurrentInputConnection().getCursorCapsMode( + attr.inputType); + } + mInputView.setShifted(mCapsLock || caps != 0); + } + } + + /** + * Helper to determine if a given character code is alphabetic. + */ + private boolean isAlphabet(int code) { + if (Character.isLetter(code)) { + return true; + } else { + return false; + } + } + + /** + * Helper to send a key down / key up pair to the current editor. + */ + private void keyDownUp(int keyEventCode) { + getCurrentInputConnection().sendKeyEvent( + new KeyEvent(KeyEvent.ACTION_DOWN, keyEventCode)); + getCurrentInputConnection().sendKeyEvent( + new KeyEvent(KeyEvent.ACTION_UP, keyEventCode)); + } + + /** + * Helper to send a character to the editor as raw key events. + */ + private void sendKey(int keyCode) { + switch (keyCode) { + case '\n': + keyDownUp(KeyEvent.KEYCODE_ENTER); + break; + default: + if (keyCode >= '0' && keyCode <= '9') { + keyDownUp(keyCode - '0' + KeyEvent.KEYCODE_0); + } else { + getCurrentInputConnection().commitText( + String.valueOf((char) keyCode), 1); + } + break; + } + } + + // Implementation of KeyboardViewListener + + public void onKey(int primaryCode, int[] keyCodes) { + if (isWordSeparator(primaryCode)) { + // Handle separator + if (mComposing.length() > 0) { + commitTyped(getCurrentInputConnection()); + } + sendKey(primaryCode); + updateShiftKeyState(getCurrentInputEditorInfo()); + } else if (primaryCode == Keyboard.KEYCODE_DELETE) { + android.util.Log.d("DEBUG", "DELETE"); + handleBackspace(); + } else if (primaryCode == Keyboard.KEYCODE_SHIFT) { + android.util.Log.d("DEBUG", "SHIFT"); + handleShift(); + } else if (primaryCode == Keyboard.KEYCODE_CANCEL) { + android.util.Log.d("DEBUG", "CANCEL"); + handleClose(); + return; + } else if (primaryCode == LatinKeyboardView.KEYCODE_KP2A) { + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + String title = "Keepass2Android"; + HashMap availableFields = keepass2android.kbbridge.KeyboardData.availableFields; + + final ArrayList items = new ArrayList(); + final ArrayList values = new ArrayList(); + for (HashMap.Entry entry : availableFields.entrySet()) + { + String key = entry.getKey(); + String value = entry.getValue(); + items.add(key); + values.add(value); + } + + + if (keepass2android.kbbridge.KeyboardData.entryName == null) + { + items.add(getString(R.string.open_entry)); + values.add(""); + } + else + { + title += " ("+keepass2android.kbbridge.KeyboardData.entryName+")"; + items.add(getString(R.string.change_entry)); + values.add(""); + } + builder.setTitle(title); + + // builder.setMessage("What do you want to type securely?"); + builder.setItems(items.toArray(new CharSequence[items.size()]), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + + if (item == items.size() - 1) { + //change entry + Intent startKp2aIntent = getPackageManager().getLaunchIntentForPackage(getApplicationContext().getPackageName()); + if (startKp2aIntent != null) + { + startKp2aIntent.addCategory(Intent.CATEGORY_LAUNCHER); + startKp2aIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(startKp2aIntent); + Settings.Secure.getString( + getContentResolver(), + Settings.Secure.DEFAULT_INPUT_METHOD + ); + } + } else { + getCurrentInputConnection().commitText( + values.get(item), 0); + } + } + }); + + builder.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + // User cancelled the dialog + } + }); + + // Create the AlertDialog + AlertDialog dialog = builder.create(); + Window window = dialog.getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.token = mInputView.getWindowToken(); + lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; + window.setAttributes(lp); + window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + + dialog.show(); + } else if (primaryCode == LatinKeyboardView.KEYCODE_SELECT_IME) { + mInputMethodManager.showInputMethodPicker(); + } else if (primaryCode == Keyboard.KEYCODE_MODE_CHANGE + && mInputView != null) { + Keyboard current = mInputView.getKeyboard(); + if (current == mSymbolsKeyboard + || current == mSymbolsShiftedKeyboard) { + current = mQwertyKeyboard; + } else { + current = mSymbolsKeyboard; + } + mInputView.setKeyboard(current); + if (current == mSymbolsKeyboard) { + current.setShifted(false); + } + } else { + handleCharacter(primaryCode, keyCodes); + // mCapsLock = false; + // mInputView.setShifted(mCapsLock); + updateShiftKeyState(getCurrentInputEditorInfo()); + } + } + + public void onText(CharSequence text) { + InputConnection ic = getCurrentInputConnection(); + if (ic == null) + return; + ic.beginBatchEdit(); + if (mComposing.length() > 0) { + commitTyped(ic); + } + ic.commitText(text, 0); + ic.endBatchEdit(); + updateShiftKeyState(getCurrentInputEditorInfo()); + } + + /** + * Update the list of available candidates from the current composing text. + * This will need to be filled in by however you are determining candidates. + */ + private void updateCandidates() { + if (!mCompletionOn) { + if (mComposing.length() > 0) { + ArrayList list = new ArrayList(); + list.add(mComposing.toString()); + setSuggestions(list, true, true); + } else { + setSuggestions(null, false, false); + } + } + } + + public void setSuggestions(List suggestions, boolean completions, + boolean typedWordValid) { + if (suggestions != null && suggestions.size() > 0) { + setCandidatesViewShown(true); + } else if (isExtractViewShown()) { + setCandidatesViewShown(true); + } + if (mCandidateView != null) { + mCandidateView.setSuggestions(suggestions, completions, + typedWordValid); + } + } + + private void handleBackspace() { + final int length = mComposing.length(); + if (length > 1) { + mComposing.delete(length - 1, length); + getCurrentInputConnection().setComposingText(mComposing, 1); + updateCandidates(); + } else if (length > 0) { + mComposing.setLength(0); + getCurrentInputConnection().commitText("", 0); + updateCandidates(); + } else { + keyDownUp(KeyEvent.KEYCODE_DEL); + } + updateShiftKeyState(getCurrentInputEditorInfo()); + } + + private void handleShift() { + if (mInputView == null) { + return; + } + + Keyboard currentKeyboard = mInputView.getKeyboard(); + if (mQwertyKeyboard == currentKeyboard) { + // Alphabet keyboard + checkToggleCapsLock(); + mInputView.setShifted(mCapsLock || !mInputView.isShifted()); + + } else if (currentKeyboard == mSymbolsKeyboard) { + mSymbolsKeyboard.setShifted(true); + mInputView.setKeyboard(mSymbolsShiftedKeyboard); + mSymbolsShiftedKeyboard.setShifted(true); + } else if (currentKeyboard == mSymbolsShiftedKeyboard) { + mSymbolsShiftedKeyboard.setShifted(false); + mInputView.setKeyboard(mSymbolsKeyboard); + mSymbolsKeyboard.setShifted(false); + } + } + + private void handleCharacter(int primaryCode, int[] keyCodes) { + if (isInputViewShown()) { + if (mInputView.isShifted()) { + primaryCode = Character.toUpperCase(primaryCode); + } + } + if (isAlphabet(primaryCode) && mPredictionOn) { + mComposing.append((char) primaryCode); + getCurrentInputConnection().setComposingText(mComposing, 1); + updateShiftKeyState(getCurrentInputEditorInfo()); + updateCandidates(); + } else { + getCurrentInputConnection().commitText( + String.valueOf((char) primaryCode), 1); + } + } + + private void handleClose() { + commitTyped(getCurrentInputConnection()); + requestHideSelf(0); + mInputView.closing(); + } + + private void checkToggleCapsLock() { + long now = System.currentTimeMillis(); + if (mLastShiftTime + 800 > now) { + mCapsLock = !mCapsLock; + mLastShiftTime = 0; + } else { + mLastShiftTime = now; + } + } + + private String getWordSeparators() { + return mWordSeparators; + } + + public boolean isWordSeparator(int code) { + String separators = getWordSeparators(); + return separators.contains(String.valueOf((char) code)); + } + + public void pickDefaultCandidate() { + pickSuggestionManually(0); + } + + public void pickSuggestionManually(int index) { + if (mCompletionOn && mCompletions != null && index >= 0 + && index < mCompletions.length) { + CompletionInfo ci = mCompletions[index]; + getCurrentInputConnection().commitCompletion(ci); + if (mCandidateView != null) { + mCandidateView.clear(); + } + updateShiftKeyState(getCurrentInputEditorInfo()); + } else if (mComposing.length() > 0) { + // If we were generating candidate suggestions for the current + // text, we would commit one of them here. But for this sample, + // we will just commit the current text. + commitTyped(getCurrentInputConnection()); + } + } + + public void swipeRight() { + if (mCompletionOn) { + pickDefaultCandidate(); + } + } + + public void swipeLeft() { + handleBackspace(); + } + + public void swipeDown() { + handleClose(); + } + + public void swipeUp() { + } + + public void onPress(int primaryCode) { + } + + public void onRelease(int primaryCode) { + } } diff --git a/src/java/KP2ASoftKeyboard/src/keepass2android/softkeyboard/LatinKeyboardView.java b/src/java/KP2ASoftKeyboard/src/keepass2android/softkeyboard/LatinKeyboardView.java index c91200c2..a1854da8 100644 --- a/src/java/KP2ASoftKeyboard/src/keepass2android/softkeyboard/LatinKeyboardView.java +++ b/src/java/KP2ASoftKeyboard/src/keepass2android/softkeyboard/LatinKeyboardView.java @@ -27,11 +27,12 @@ public class LatinKeyboardView extends KeyboardView { static final int KEYCODE_OPTIONS = -100; static final int KEYCODE_KP2A = -101; + static final int KEYCODE_SELECT_IME = -102; public LatinKeyboardView(Context context, AttributeSet attrs) { super(context, attrs); } - + public LatinKeyboardView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } diff --git a/src/java/kbbridge/.classpath b/src/java/kbbridge/.classpath deleted file mode 100644 index a4763d1e..00000000 --- a/src/java/kbbridge/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/java/kbbridge/.project b/src/java/kbbridge/.project deleted file mode 100644 index 51dabebc..00000000 --- a/src/java/kbbridge/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - KP2ASoftKeyboardBridge - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/src/java/kbbridge/AndroidManifest.xml b/src/java/kbbridge/AndroidManifest.xml deleted file mode 100644 index 1f0ec938..00000000 --- a/src/java/kbbridge/AndroidManifest.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/java/kbbridge/gen/keepass2android/kbbridge/BuildConfig.java b/src/java/kbbridge/gen/keepass2android/kbbridge/BuildConfig.java deleted file mode 100644 index a853a376..00000000 --- a/src/java/kbbridge/gen/keepass2android/kbbridge/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package keepass2android.kbbridge; - -public final class BuildConfig { - public final static boolean DEBUG = true; -} \ No newline at end of file diff --git a/src/java/kbbridge/gen/keepass2android/kbbridge/R.java b/src/java/kbbridge/gen/keepass2android/kbbridge/R.java deleted file mode 100644 index 376d8ace..00000000 --- a/src/java/kbbridge/gen/keepass2android/kbbridge/R.java +++ /dev/null @@ -1,47 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package keepass2android.kbbridge; - -public final class R { - public static final class attr { - } - public static final class drawable { - public static int ic_launcher=0x7f020000; - } - public static final class string { - public static int app_name=0x7f030000; - } - public static final class style { - /** - Base application theme, dependent on API level. This theme is replaced - by AppBaseTheme from res/values-vXX/styles.xml on newer devices. - - - Theme customizations available in newer API levels can go in - res/values-vXX/styles.xml, while customizations related to - backward-compatibility can go here. - - - Base application theme for API 11+. This theme completely replaces - AppBaseTheme from res/values/styles.xml on API 11+ devices. - - API 11 theme customizations can go here. - - Base application theme for API 14+. This theme completely replaces - AppBaseTheme from BOTH res/values/styles.xml and - res/values-v11/styles.xml on API 14+ devices. - - API 14 theme customizations can go here. - */ - public static int AppBaseTheme=0x7f040000; - /** Application theme. - All customizations that are NOT specific to a particular API-level can go here. - */ - public static int AppTheme=0x7f040001; - } -} diff --git a/src/java/kbbridge/proguard-project.txt b/src/java/kbbridge/proguard-project.txt deleted file mode 100644 index f2fe1559..00000000 --- a/src/java/kbbridge/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/src/java/kbbridge/project.properties b/src/java/kbbridge/project.properties deleted file mode 100644 index 22e1c480..00000000 --- a/src/java/kbbridge/project.properties +++ /dev/null @@ -1,15 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-14 -android.library=true diff --git a/src/java/kbbridge/res/values/strings.xml b/src/java/kbbridge/res/values/strings.xml deleted file mode 100644 index 2312da05..00000000 --- a/src/java/kbbridge/res/values/strings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - KP2ASoftKeyboardBridge - - \ No newline at end of file diff --git a/src/java/kbbridge/res/values/styles.xml b/src/java/kbbridge/res/values/styles.xml deleted file mode 100644 index 4a10ca49..00000000 --- a/src/java/kbbridge/res/values/styles.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/java/kbbridge/src/keepass2android/kbbridge/KeyboardData.java b/src/java/kbbridge/src/keepass2android/kbbridge/KeyboardData.java deleted file mode 100644 index 4538f6b6..00000000 --- a/src/java/kbbridge/src/keepass2android/kbbridge/KeyboardData.java +++ /dev/null @@ -1,6 +0,0 @@ - -package keepass2android.kbbridge; -import java.util.HashMap; -public class KeyboardData { - public static HashMap availableFields = new HashMap(); -} diff --git a/src/keepass2android/Properties/AndroidManifest_net.xml b/src/keepass2android/Properties/AndroidManifest_net.xml index fb07a999..069f6fc0 100644 --- a/src/keepass2android/Properties/AndroidManifest_net.xml +++ b/src/keepass2android/Properties/AndroidManifest_net.xml @@ -25,6 +25,14 @@ + + + + + + + diff --git a/src/keepass2android/Resources/Resource.designer.cs b/src/keepass2android/Resources/Resource.designer.cs index d19e7e8d..53e96319 100644 --- a/src/keepass2android/Resources/Resource.designer.cs +++ b/src/keepass2android/Resources/Resource.designer.cs @@ -27,20 +27,20 @@ namespace keepass2android public partial class Array { - // aapt resource value: 0x7f080002 - public const int clipboard_timeout_options = 2131230722; + // aapt resource value: 0x7f090002 + public const int clipboard_timeout_options = 2131296258; - // aapt resource value: 0x7f080000 - public const int clipboard_timeout_values = 2131230720; + // aapt resource value: 0x7f090000 + public const int clipboard_timeout_values = 2131296256; - // aapt resource value: 0x7f080004 - public const int cred_remember_modes = 2131230724; + // aapt resource value: 0x7f090004 + public const int cred_remember_modes = 2131296260; - // aapt resource value: 0x7f080003 - public const int list_size_options = 2131230723; + // aapt resource value: 0x7f090003 + public const int list_size_options = 2131296259; - // aapt resource value: 0x7f080001 - public const int list_size_values = 2131230721; + // aapt resource value: 0x7f090001 + public const int list_size_values = 2131296257; private Array() { @@ -58,20 +58,20 @@ namespace keepass2android public partial class Boolean { - // aapt resource value: 0x7f070004 - public const int TanExpiresOnUse_default = 2131165188; + // aapt resource value: 0x7f080004 + public const int TanExpiresOnUse_default = 2131230724; - // aapt resource value: 0x7f070001 - public const int keyfile_default = 2131165185; + // aapt resource value: 0x7f080001 + public const int keyfile_default = 2131230721; - // aapt resource value: 0x7f070000 - public const int maskpass_default = 2131165184; + // aapt resource value: 0x7f080000 + public const int maskpass_default = 2131230720; - // aapt resource value: 0x7f070003 - public const int omitbackup_default = 2131165187; + // aapt resource value: 0x7f080003 + public const int omitbackup_default = 2131230723; - // aapt resource value: 0x7f070002 - public const int sort_default = 2131165186; + // aapt resource value: 0x7f080002 + public const int sort_default = 2131230722; private Boolean() { @@ -81,35 +81,64 @@ namespace keepass2android public partial class Color { - // aapt resource value: 0x7f050007 - public const int bg_gray = 2131034119; - - // aapt resource value: 0x7f050000 - public const int blue_highlight = 2131034112; - - // aapt resource value: 0x7f050005 - public const int emphasis = 2131034117; - - // aapt resource value: 0x7f050006 - public const int emphasis2 = 2131034118; - - // aapt resource value: 0x7f050001 - public const int group = 2131034113; + // aapt resource value: 0x7f05000b + public const int bg_gray = 2131034123; // aapt resource value: 0x7f050004 - public const int group_header_button_pressed = 2131034116; - - // aapt resource value: 0x7f050002 - public const int icon_background = 2131034114; + public const int blue_highlight = 2131034116; // aapt resource value: 0x7f050003 - public const int icon_text = 2131034115; + public const int candidate_background = 2131034115; + + // aapt resource value: 0x7f050000 + public const int candidate_normal = 2131034112; + + // aapt resource value: 0x7f050002 + public const int candidate_other = 2131034114; + + // aapt resource value: 0x7f050001 + public const int candidate_recommended = 2131034113; + + // aapt resource value: 0x7f050009 + public const int emphasis = 2131034121; + + // aapt resource value: 0x7f05000a + public const int emphasis2 = 2131034122; + + // aapt resource value: 0x7f050005 + public const int group = 2131034117; + + // aapt resource value: 0x7f050008 + public const int group_header_button_pressed = 2131034120; + + // aapt resource value: 0x7f050006 + public const int icon_background = 2131034118; + + // aapt resource value: 0x7f050007 + public const int icon_text = 2131034119; private Color() { } } + public partial class Dimension + { + + // aapt resource value: 0x7f060001 + public const int candidate_font_height = 2131099649; + + // aapt resource value: 0x7f060002 + public const int candidate_vertical_padding = 2131099650; + + // aapt resource value: 0x7f060000 + public const int key_height = 2131099648; + + private Dimension() + { + } + } + public partial class Drawable { @@ -384,13 +413,40 @@ namespace keepass2android public const int notify = 2130837593; // aapt resource value: 0x7f02005a - public const int RedButton = 2130837594; + public const int notify_keyboard = 2130837594; // aapt resource value: 0x7f02005b - public const int section_header = 2130837595; + public const int RedButton = 2130837595; // aapt resource value: 0x7f02005c - public const int YellowButton = 2130837596; + public const int section_header = 2130837596; + + // aapt resource value: 0x7f02005d + public const int sym_keyboard = 2130837597; + + // aapt resource value: 0x7f02005e + public const int sym_keyboard_delete = 2130837598; + + // aapt resource value: 0x7f02005f + public const int sym_keyboard_done = 2130837599; + + // aapt resource value: 0x7f020060 + public const int sym_keyboard_kp2a = 2130837600; + + // aapt resource value: 0x7f020061 + public const int sym_keyboard_return = 2130837601; + + // aapt resource value: 0x7f020062 + public const int sym_keyboard_search = 2130837602; + + // aapt resource value: 0x7f020063 + public const int sym_keyboard_shift = 2130837603; + + // aapt resource value: 0x7f020064 + public const int sym_keyboard_space = 2130837604; + + // aapt resource value: 0x7f020065 + public const int YellowButton = 2130837605; private Drawable() { @@ -400,491 +456,494 @@ namespace keepass2android public partial class Id { - // aapt resource value: 0x7f0b000a - public const int Credit = 2131427338; + // aapt resource value: 0x7f0c000a + public const int Credit = 2131492874; - // aapt resource value: 0x7f0b0070 - public const int IconGridView = 2131427440; + // aapt resource value: 0x7f0c0070 + public const int IconGridView = 2131492976; - // aapt resource value: 0x7f0b007d - public const int QuickUnlock_button = 2131427453; + // aapt resource value: 0x7f0c007e + public const int QuickUnlock_button = 2131492990; - // aapt resource value: 0x7f0b007e - public const int QuickUnlock_buttonLock = 2131427454; + // aapt resource value: 0x7f0c007f + public const int QuickUnlock_buttonLock = 2131492991; - // aapt resource value: 0x7f0b007b - public const int QuickUnlock_label = 2131427451; + // aapt resource value: 0x7f0c007c + public const int QuickUnlock_label = 2131492988; - // aapt resource value: 0x7f0b007c - public const int QuickUnlock_password = 2131427452; + // aapt resource value: 0x7f0c007d + public const int QuickUnlock_password = 2131492989; - // aapt resource value: 0x7f0b0054 - public const int RelativeLayout = 2131427412; + // aapt resource value: 0x7f0c0054 + public const int RelativeLayout = 2131492948; - // aapt resource value: 0x7f0b0053 - public const int ScrollView = 2131427411; + // aapt resource value: 0x7f0c0053 + public const int ScrollView = 2131492947; - // aapt resource value: 0x7f0b0009 - public const int about_button = 2131427337; + // aapt resource value: 0x7f0c0009 + public const int about_button = 2131492873; - // aapt resource value: 0x7f0b0000 - public const int about_title = 2131427328; + // aapt resource value: 0x7f0c0000 + public const int about_title = 2131492864; - // aapt resource value: 0x7f0b0051 - public const int accept_button = 2131427409; + // aapt resource value: 0x7f0c0051 + public const int accept_button = 2131492945; - // aapt resource value: 0x7f0b0024 - public const int add_advanced = 2131427364; + // aapt resource value: 0x7f0c0024 + public const int add_advanced = 2131492900; - // aapt resource value: 0x7f0b0067 - public const int add_entry = 2131427431; + // aapt resource value: 0x7f0c0067 + public const int add_entry = 2131492967; - // aapt resource value: 0x7f0b0066 - public const int add_group = 2131427430; + // aapt resource value: 0x7f0c0066 + public const int add_group = 2131492966; - // aapt resource value: 0x7f0b0023 - public const int advanced_container = 2131427363; + // aapt resource value: 0x7f0c0023 + public const int advanced_container = 2131492899; - // aapt resource value: 0x7f0b0026 - public const int binaries = 2131427366; + // aapt resource value: 0x7f0c0026 + public const int binaries = 2131492902; - // aapt resource value: 0x7f0b0036 - public const int bottom_bar = 2131427382; + // aapt resource value: 0x7f0c0036 + public const int bottom_bar = 2131492918; - // aapt resource value: 0x7f0b0050 - public const int bottom_layout = 2131427408; + // aapt resource value: 0x7f0c0050 + public const int bottom_layout = 2131492944; - // aapt resource value: 0x7f0b0048 - public const int browse_button = 2131427400; + // aapt resource value: 0x7f0c0048 + public const int browse_button = 2131492936; - // aapt resource value: 0x7f0b0059 - public const int btn_length12 = 2131427417; + // aapt resource value: 0x7f0c0059 + public const int btn_length12 = 2131492953; - // aapt resource value: 0x7f0b0058 - public const int btn_length16 = 2131427416; + // aapt resource value: 0x7f0c0058 + public const int btn_length16 = 2131492952; - // aapt resource value: 0x7f0b005b - public const int btn_length6 = 2131427419; + // aapt resource value: 0x7f0c005b + public const int btn_length6 = 2131492955; - // aapt resource value: 0x7f0b005a - public const int btn_length8 = 2131427418; + // aapt resource value: 0x7f0c005a + public const int btn_length8 = 2131492954; - // aapt resource value: 0x7f0b000e - public const int cancel = 2131427342; + // aapt resource value: 0x7f0c000e + public const int cancel = 2131492878; - // aapt resource value: 0x7f0b0052 - public const int cancel_button = 2131427410; + // aapt resource value: 0x7f0c0052 + public const int cancel_button = 2131492946; - // aapt resource value: 0x7f0b008e - public const int cbCaseSensitive = 2131427470; + // aapt resource value: 0x7f0c008f + public const int cbCaseSensitive = 2131493007; - // aapt resource value: 0x7f0b008f - public const int cbExcludeExpiredEntries = 2131427471; + // aapt resource value: 0x7f0c0090 + public const int cbExcludeExpiredEntries = 2131493008; - // aapt resource value: 0x7f0b0084 - public const int cbRegEx = 2131427460; + // aapt resource value: 0x7f0c0085 + public const int cbRegEx = 2131492997; - // aapt resource value: 0x7f0b008d - public const int cbSearchInGroupName = 2131427469; + // aapt resource value: 0x7f0c008e + public const int cbSearchInGroupName = 2131493006; - // aapt resource value: 0x7f0b008a - public const int cbSearchInNotes = 2131427466; + // aapt resource value: 0x7f0c008b + public const int cbSearchInNotes = 2131493003; - // aapt resource value: 0x7f0b008b - public const int cbSearchInOtherStrings = 2131427467; + // aapt resource value: 0x7f0c008c + public const int cbSearchInOtherStrings = 2131493004; - // aapt resource value: 0x7f0b0089 - public const int cbSearchInPassword = 2131427465; + // aapt resource value: 0x7f0c008a + public const int cbSearchInPassword = 2131493002; - // aapt resource value: 0x7f0b008c - public const int cbSearchInTags = 2131427468; + // aapt resource value: 0x7f0c008d + public const int cbSearchInTags = 2131493005; - // aapt resource value: 0x7f0b0086 - public const int cbSearchInTitle = 2131427462; + // aapt resource value: 0x7f0c0087 + public const int cbSearchInTitle = 2131492999; - // aapt resource value: 0x7f0b0087 - public const int cbSearchInUrl = 2131427463; + // aapt resource value: 0x7f0c0088 + public const int cbSearchInUrl = 2131493000; - // aapt resource value: 0x7f0b0088 - public const int cbSearchInUsername = 2131427464; + // aapt resource value: 0x7f0c0089 + public const int cbSearchInUsername = 2131493001; - // aapt resource value: 0x7f0b0064 - public const int cb_brackets = 2131427428; + // aapt resource value: 0x7f0c0064 + public const int cb_brackets = 2131492964; - // aapt resource value: 0x7f0b005f - public const int cb_digits = 2131427423; + // aapt resource value: 0x7f0c005f + public const int cb_digits = 2131492959; - // aapt resource value: 0x7f0b005e - public const int cb_lowercase = 2131427422; + // aapt resource value: 0x7f0c005e + public const int cb_lowercase = 2131492958; - // aapt resource value: 0x7f0b0060 - public const int cb_minus = 2131427424; + // aapt resource value: 0x7f0c0060 + public const int cb_minus = 2131492960; - // aapt resource value: 0x7f0b0062 - public const int cb_space = 2131427426; + // aapt resource value: 0x7f0c0062 + public const int cb_space = 2131492962; - // aapt resource value: 0x7f0b0063 - public const int cb_specials = 2131427427; + // aapt resource value: 0x7f0c0063 + public const int cb_specials = 2131492963; - // aapt resource value: 0x7f0b0061 - public const int cb_underline = 2131427425; + // aapt resource value: 0x7f0c0061 + public const int cb_underline = 2131492961; - // aapt resource value: 0x7f0b005d - public const int cb_uppercase = 2131427421; + // aapt resource value: 0x7f0c005d + public const int cb_uppercase = 2131492957; - // aapt resource value: 0x7f0b004b - public const int create = 2131427403; + // aapt resource value: 0x7f0c004b + public const int create = 2131492939; - // aapt resource value: 0x7f0b0094 - public const int cred_password = 2131427476; + // aapt resource value: 0x7f0c0095 + public const int cred_password = 2131493013; - // aapt resource value: 0x7f0b0095 - public const int cred_remember_mode = 2131427477; + // aapt resource value: 0x7f0c0096 + public const int cred_remember_mode = 2131493014; - // aapt resource value: 0x7f0b0093 - public const int cred_username = 2131427475; + // aapt resource value: 0x7f0c0094 + public const int cred_username = 2131493012; - // aapt resource value: 0x7f0b0078 - public const int default_database = 2131427448; + // aapt resource value: 0x7f0c0079 + public const int default_database = 2131492985; - // aapt resource value: 0x7f0b0030 - public const int delete = 2131427376; + // aapt resource value: 0x7f0c0030 + public const int delete = 2131492912; - // aapt resource value: 0x7f0b0008 - public const int disclaimer = 2131427336; + // aapt resource value: 0x7f0c0008 + public const int disclaimer = 2131492872; - // aapt resource value: 0x7f0b0001 - public const int divider1 = 2131427329; + // aapt resource value: 0x7f0c0001 + public const int divider1 = 2131492865; - // aapt resource value: 0x7f0b0004 - public const int divider2 = 2131427332; + // aapt resource value: 0x7f0c0004 + public const int divider2 = 2131492868; - // aapt resource value: 0x7f0b0007 - public const int divider3 = 2131427335; + // aapt resource value: 0x7f0c0007 + public const int divider3 = 2131492871; - // aapt resource value: 0x7f0b0032 - public const int divider_comment = 2131427378; + // aapt resource value: 0x7f0c0032 + public const int divider_comment = 2131492914; - // aapt resource value: 0x7f0b0079 - public const int enable_quickunlock = 2131427449; + // aapt resource value: 0x7f0c007a + public const int enable_quickunlock = 2131492986; - // aapt resource value: 0x7f0b0041 - public const int entry_accessed = 2131427393; + // aapt resource value: 0x7f0c0041 + public const int entry_accessed = 2131492929; - // aapt resource value: 0x7f0b0040 - public const int entry_accessed_label = 2131427392; + // aapt resource value: 0x7f0c0040 + public const int entry_accessed_label = 2131492928; - // aapt resource value: 0x7f0b0025 - public const int entry_binaries_label = 2131427365; + // aapt resource value: 0x7f0c0025 + public const int entry_binaries_label = 2131492901; - // aapt resource value: 0x7f0b0021 - public const int entry_comment = 2131427361; + // aapt resource value: 0x7f0c0021 + public const int entry_comment = 2131492897; - // aapt resource value: 0x7f0b0020 - public const int entry_comment_label = 2131427360; + // aapt resource value: 0x7f0c0020 + public const int entry_comment_label = 2131492896; - // aapt resource value: 0x7f0b001f - public const int entry_confpassword = 2131427359; + // aapt resource value: 0x7f0c001f + public const int entry_confpassword = 2131492895; - // aapt resource value: 0x7f0b001e - public const int entry_confpassword_label = 2131427358; + // aapt resource value: 0x7f0c001e + public const int entry_confpassword_label = 2131492894; - // aapt resource value: 0x7f0b0039 - public const int entry_contents = 2131427385; + // aapt resource value: 0x7f0c0039 + public const int entry_contents = 2131492921; - // aapt resource value: 0x7f0b003d - public const int entry_created = 2131427389; + // aapt resource value: 0x7f0c003d + public const int entry_created = 2131492925; - // aapt resource value: 0x7f0b003c - public const int entry_created_label = 2131427388; + // aapt resource value: 0x7f0c003c + public const int entry_created_label = 2131492924; - // aapt resource value: 0x7f0b0038 - public const int entry_divider2 = 2131427384; + // aapt resource value: 0x7f0c0038 + public const int entry_divider2 = 2131492920; - // aapt resource value: 0x7f0b0037 - public const int entry_edit = 2131427383; + // aapt resource value: 0x7f0c0037 + public const int entry_edit = 2131492919; - // aapt resource value: 0x7f0b002d - public const int entry_expires = 2131427373; + // aapt resource value: 0x7f0c002d + public const int entry_expires = 2131492909; - // aapt resource value: 0x7f0b002c - public const int entry_expires_checkbox = 2131427372; + // aapt resource value: 0x7f0c002c + public const int entry_expires_checkbox = 2131492908; - // aapt resource value: 0x7f0b002b - public const int entry_expires_label = 2131427371; + // aapt resource value: 0x7f0c002b + public const int entry_expires_label = 2131492907; - // aapt resource value: 0x7f0b0022 - public const int entry_extra_strings_label = 2131427362; + // aapt resource value: 0x7f0c0022 + public const int entry_extra_strings_label = 2131492898; - // aapt resource value: 0x7f0b0033 - public const int entry_icon = 2131427379; + // aapt resource value: 0x7f0c0033 + public const int entry_icon = 2131492915; - // aapt resource value: 0x7f0b003f - public const int entry_modified = 2131427391; + // aapt resource value: 0x7f0c003f + public const int entry_modified = 2131492927; - // aapt resource value: 0x7f0b003e - public const int entry_modified_label = 2131427390; + // aapt resource value: 0x7f0c003e + public const int entry_modified_label = 2131492926; - // aapt resource value: 0x7f0b002a - public const int entry_override_url = 2131427370; + // aapt resource value: 0x7f0c002a + public const int entry_override_url = 2131492906; - // aapt resource value: 0x7f0b0029 - public const int entry_override_url_label = 2131427369; + // aapt resource value: 0x7f0c0029 + public const int entry_override_url_label = 2131492905; - // aapt resource value: 0x7f0b001d - public const int entry_password = 2131427357; + // aapt resource value: 0x7f0c001d + public const int entry_password = 2131492893; - // aapt resource value: 0x7f0b001b - public const int entry_password_label = 2131427355; + // aapt resource value: 0x7f0c001b + public const int entry_password_label = 2131492891; - // aapt resource value: 0x7f0b0012 - public const int entry_save = 2131427346; + // aapt resource value: 0x7f0c0012 + public const int entry_save = 2131492882; - // aapt resource value: 0x7f0b0011 - public const int entry_save_header = 2131427345; + // aapt resource value: 0x7f0c0011 + public const int entry_save_header = 2131492881; - // aapt resource value: 0x7f0b0013 - public const int entry_scroll = 2131427347; + // aapt resource value: 0x7f0c0013 + public const int entry_scroll = 2131492883; - // aapt resource value: 0x7f0b003a - public const int entry_table = 2131427386; + // aapt resource value: 0x7f0c003a + public const int entry_table = 2131492922; - // aapt resource value: 0x7f0b0028 - public const int entry_tags = 2131427368; + // aapt resource value: 0x7f0c0028 + public const int entry_tags = 2131492904; - // aapt resource value: 0x7f0b0027 - public const int entry_tags_label = 2131427367; + // aapt resource value: 0x7f0c0027 + public const int entry_tags_label = 2131492903; - // aapt resource value: 0x7f0b0034 - public const int entry_text = 2131427380; + // aapt resource value: 0x7f0c0034 + public const int entry_text = 2131492916; - // aapt resource value: 0x7f0b0016 - public const int entry_title = 2131427350; + // aapt resource value: 0x7f0c0016 + public const int entry_title = 2131492886; - // aapt resource value: 0x7f0b0014 - public const int entry_title_label = 2131427348; + // aapt resource value: 0x7f0c0014 + public const int entry_title_label = 2131492884; - // aapt resource value: 0x7f0b001a - public const int entry_url = 2131427354; + // aapt resource value: 0x7f0c001a + public const int entry_url = 2131492890; - // aapt resource value: 0x7f0b0019 - public const int entry_url_label = 2131427353; + // aapt resource value: 0x7f0c0019 + public const int entry_url_label = 2131492889; - // aapt resource value: 0x7f0b0018 - public const int entry_user_name = 2131427352; + // aapt resource value: 0x7f0c0018 + public const int entry_user_name = 2131492888; - // aapt resource value: 0x7f0b0017 - public const int entry_user_name_label = 2131427351; + // aapt resource value: 0x7f0c0017 + public const int entry_user_name_label = 2131492887; - // aapt resource value: 0x7f0b003b - public const int extra_strings = 2131427387; + // aapt resource value: 0x7f0c003b + public const int extra_strings = 2131492923; - // aapt resource value: 0x7f0b0006 - public const int feedback = 2131427334; + // aapt resource value: 0x7f0c0006 + public const int feedback = 2131492870; - // aapt resource value: 0x7f0b0042 - public const int file_filename = 2131427394; + // aapt resource value: 0x7f0c0042 + public const int file_filename = 2131492930; - // aapt resource value: 0x7f0b0043 - public const int file_listtop = 2131427395; + // aapt resource value: 0x7f0c0043 + public const int file_listtop = 2131492931; - // aapt resource value: 0x7f0b0044 - public const int file_select = 2131427396; + // aapt resource value: 0x7f0c0044 + public const int file_select = 2131492932; - // aapt resource value: 0x7f0b0073 - public const int filename = 2131427443; + // aapt resource value: 0x7f0c0074 + public const int filename = 2131492980; - // aapt resource value: 0x7f0b0045 - public const int filename_form = 2131427397; + // aapt resource value: 0x7f0c0045 + public const int filename_form = 2131492933; - // aapt resource value: 0x7f0b0071 - public const int filename_label = 2131427441; + // aapt resource value: 0x7f0c0072 + public const int filename_label = 2131492978; - // aapt resource value: 0x7f0b0072 - public const int filenamescroll = 2131427442; + // aapt resource value: 0x7f0c0073 + public const int filenamescroll = 2131492979; - // aapt resource value: 0x7f0b004c - public const int fnv_cancel = 2131427404; + // aapt resource value: 0x7f0c004c + public const int fnv_cancel = 2131492940; - // aapt resource value: 0x7f0b001c - public const int generate_button = 2131427356; + // aapt resource value: 0x7f0c001c + public const int generate_button = 2131492892; - // aapt resource value: 0x7f0b0056 - public const int generate_password_button = 2131427414; + // aapt resource value: 0x7f0c0056 + public const int generate_password_button = 2131492950; - // aapt resource value: 0x7f0b0065 - public const int group_header = 2131427429; + // aapt resource value: 0x7f0c0065 + public const int group_header = 2131492965; - // aapt resource value: 0x7f0b006b - public const int group_icon = 2131427435; + // aapt resource value: 0x7f0c006b + public const int group_icon = 2131492971; - // aapt resource value: 0x7f0b006d - public const int group_label = 2131427437; + // aapt resource value: 0x7f0c006d + public const int group_label = 2131492973; - // aapt resource value: 0x7f0b0068 - public const int group_name = 2131427432; + // aapt resource value: 0x7f0c0068 + public const int group_name = 2131492968; - // aapt resource value: 0x7f0b006c - public const int group_text = 2131427436; + // aapt resource value: 0x7f0c006c + public const int group_text = 2131492972; - // aapt resource value: 0x7f0b0005 - public const int homepage = 2131427333; + // aapt resource value: 0x7f0c0005 + public const int homepage = 2131492869; - // aapt resource value: 0x7f0b006a - public const int icon = 2131427434; + // aapt resource value: 0x7f0c006a + public const int icon = 2131492970; - // aapt resource value: 0x7f0b0015 - public const int icon_button = 2131427349; + // aapt resource value: 0x7f0c0015 + public const int icon_button = 2131492885; - // aapt resource value: 0x7f0b006e - public const int icon_image = 2131427438; + // aapt resource value: 0x7f0c006e + public const int icon_image = 2131492974; - // aapt resource value: 0x7f0b006f - public const int icon_text = 2131427439; + // aapt resource value: 0x7f0c006f + public const int icon_text = 2131492975; - // aapt resource value: 0x7f0b000c - public const int install_market = 2131427340; + // aapt resource value: 0x7f0c000c + public const int install_market = 2131492876; - // aapt resource value: 0x7f0b000d - public const int install_web = 2131427341; + // aapt resource value: 0x7f0c000d + public const int install_web = 2131492877; - // aapt resource value: 0x7f0b0047 - public const int label_open_by_filename = 2131427399; + // aapt resource value: 0x7f0c0071 + public const int keyboard = 2131492977; - // aapt resource value: 0x7f0b0049 - public const int label_open_by_filename_details = 2131427401; + // aapt resource value: 0x7f0c0047 + public const int label_open_by_filename = 2131492935; - // aapt resource value: 0x7f0b0046 - public const int label_warning = 2131427398; + // aapt resource value: 0x7f0c0049 + public const int label_open_by_filename_details = 2131492937; - // aapt resource value: 0x7f0b005c - public const int length = 2131427420; + // aapt resource value: 0x7f0c0046 + public const int label_warning = 2131492934; - // aapt resource value: 0x7f0b0057 - public const int length_label = 2131427415; + // aapt resource value: 0x7f0c005c + public const int length = 2131492956; - // aapt resource value: 0x7f0b0083 - public const int linearLayout1 = 2131427459; + // aapt resource value: 0x7f0c0057 + public const int length_label = 2131492951; - // aapt resource value: 0x7f0b009e - public const int menu_about = 2131427486; + // aapt resource value: 0x7f0c0084 + public const int linearLayout1 = 2131492996; - // aapt resource value: 0x7f0b009d - public const int menu_app_settings = 2131427485; + // aapt resource value: 0x7f0c009f + public const int menu_about = 2131493023; - // aapt resource value: 0x7f0b009c - public const int menu_cancel_edit = 2131427484; + // aapt resource value: 0x7f0c009e + public const int menu_app_settings = 2131493022; - // aapt resource value: 0x7f0b00a0 - public const int menu_change_master_key = 2131427488; + // aapt resource value: 0x7f0c009d + public const int menu_cancel_edit = 2131493021; - // aapt resource value: 0x7f0b0097 - public const int menu_goto_url = 2131427479; + // aapt resource value: 0x7f0c00a1 + public const int menu_change_master_key = 2131493025; - // aapt resource value: 0x7f0b0098 - public const int menu_lock = 2131427480; + // aapt resource value: 0x7f0c0098 + public const int menu_goto_url = 2131493016; - // aapt resource value: 0x7f0b009a - public const int menu_rate = 2131427482; + // aapt resource value: 0x7f0c0099 + public const int menu_lock = 2131493017; - // aapt resource value: 0x7f0b009f - public const int menu_search = 2131427487; + // aapt resource value: 0x7f0c009b + public const int menu_rate = 2131493019; - // aapt resource value: 0x7f0b00a1 - public const int menu_sort = 2131427489; + // aapt resource value: 0x7f0c00a0 + public const int menu_search = 2131493024; - // aapt resource value: 0x7f0b0099 - public const int menu_suggest_improvements = 2131427481; + // aapt resource value: 0x7f0c00a2 + public const int menu_sort = 2131493026; - // aapt resource value: 0x7f0b0096 - public const int menu_toggle_pass = 2131427478; + // aapt resource value: 0x7f0c009a + public const int menu_suggest_improvements = 2131493018; - // aapt resource value: 0x7f0b009b - public const int menu_translate = 2131427483; + // aapt resource value: 0x7f0c0097 + public const int menu_toggle_pass = 2131493015; - // aapt resource value: 0x7f0b0069 - public const int ok = 2131427433; + // aapt resource value: 0x7f0c009c + public const int menu_translate = 2131493020; - // aapt resource value: 0x7f0b004a - public const int open = 2131427402; + // aapt resource value: 0x7f0c0069 + public const int ok = 2131492969; - // aapt resource value: 0x7f0b0091 - public const int pass_conf_password = 2131427473; + // aapt resource value: 0x7f0c004a + public const int open = 2131492938; - // aapt resource value: 0x7f0b0076 - public const int pass_keyfile = 2131427446; + // aapt resource value: 0x7f0c0092 + public const int pass_conf_password = 2131493010; - // aapt resource value: 0x7f0b0077 - public const int pass_ok = 2131427447; + // aapt resource value: 0x7f0c0077 + public const int pass_keyfile = 2131492983; - // aapt resource value: 0x7f0b0090 - public const int pass_password = 2131427472; + // aapt resource value: 0x7f0c0078 + public const int pass_ok = 2131492984; - // aapt resource value: 0x7f0b0055 - public const int password = 2131427413; + // aapt resource value: 0x7f0c0091 + public const int pass_password = 2131493009; - // aapt resource value: 0x7f0b0074 - public const int password_label = 2131427444; + // aapt resource value: 0x7f0c0055 + public const int password = 2131492949; - // aapt resource value: 0x7f0b002f - public const int protection = 2131427375; + // aapt resource value: 0x7f0c0075 + public const int password_label = 2131492981; - // aapt resource value: 0x7f0b007a - public const int qu_filename = 2131427450; + // aapt resource value: 0x7f0c002f + public const int protection = 2131492911; - // aapt resource value: 0x7f0b000f - public const int rounds = 2131427343; + // aapt resource value: 0x7f0c007b + public const int qu_filename = 2131492987; - // aapt resource value: 0x7f0b0010 - public const int rounds_explaination = 2131427344; + // aapt resource value: 0x7f0c000f + public const int rounds = 2131492879; - // aapt resource value: 0x7f0b0082 - public const int scrollView1 = 2131427458; + // aapt resource value: 0x7f0c0010 + public const int rounds_explaination = 2131492880; - // aapt resource value: 0x7f0b0081 - public const int searchEditText = 2131427457; + // aapt resource value: 0x7f0c0083 + public const int scrollView1 = 2131492995; - // aapt resource value: 0x7f0b0080 - public const int search_button = 2131427456; + // aapt resource value: 0x7f0c0082 + public const int searchEditText = 2131492994; - // aapt resource value: 0x7f0b0085 - public const int search_in_label = 2131427461; + // aapt resource value: 0x7f0c0081 + public const int search_button = 2131492993; - // aapt resource value: 0x7f0b007f - public const int search_label = 2131427455; + // aapt resource value: 0x7f0c0086 + public const int search_in_label = 2131492998; - // aapt resource value: 0x7f0b004f - public const int start_create = 2131427407; + // aapt resource value: 0x7f0c0080 + public const int search_label = 2131492992; - // aapt resource value: 0x7f0b0092 - public const int start_create_import = 2131427474; + // aapt resource value: 0x7f0c004f + public const int start_create = 2131492943; - // aapt resource value: 0x7f0b004d - public const int start_open_file = 2131427405; + // aapt resource value: 0x7f0c0093 + public const int start_create_import = 2131493011; - // aapt resource value: 0x7f0b004e - public const int start_open_url = 2131427406; + // aapt resource value: 0x7f0c004d + public const int start_open_file = 2131492941; - // aapt resource value: 0x7f0b000b - public const int text = 2131427339; + // aapt resource value: 0x7f0c004e + public const int start_open_url = 2131492942; - // aapt resource value: 0x7f0b002e - public const int title = 2131427374; + // aapt resource value: 0x7f0c000b + public const int text = 2131492875; - // aapt resource value: 0x7f0b0035 - public const int title_block = 2131427381; + // aapt resource value: 0x7f0c002e + public const int title = 2131492910; - // aapt resource value: 0x7f0b0075 - public const int toggle_password = 2131427445; + // aapt resource value: 0x7f0c0035 + public const int title_block = 2131492917; - // aapt resource value: 0x7f0b0031 - public const int value = 2131427377; + // aapt resource value: 0x7f0c0076 + public const int toggle_password = 2131492982; - // aapt resource value: 0x7f0b0003 - public const int version = 2131427331; + // aapt resource value: 0x7f0c0031 + public const int value = 2131492913; - // aapt resource value: 0x7f0b0002 - public const int version_title = 2131427330; + // aapt resource value: 0x7f0c0003 + public const int version = 2131492867; + + // aapt resource value: 0x7f0c0002 + public const int version_title = 2131492866; private Id() { @@ -958,22 +1017,25 @@ namespace keepass2android public const int icon_picker = 2130903060; // aapt resource value: 0x7f030015 - public const int password = 2130903061; + public const int input = 2130903061; // aapt resource value: 0x7f030016 - public const int QuickUnlock = 2130903062; + public const int password = 2130903062; // aapt resource value: 0x7f030017 - public const int search = 2130903063; + public const int QuickUnlock = 2130903063; // aapt resource value: 0x7f030018 - public const int set_password = 2130903064; + public const int search = 2130903064; // aapt resource value: 0x7f030019 - public const int StartScreenButtons = 2130903065; + public const int set_password = 2130903065; // aapt resource value: 0x7f03001a - public const int url_credentials = 2130903066; + public const int StartScreenButtons = 2130903066; + + // aapt resource value: 0x7f03001b + public const int url_credentials = 2130903067; private Layout() { @@ -983,20 +1045,20 @@ namespace keepass2android public partial class Menu { - // aapt resource value: 0x7f0a0000 - public const int entry = 2131361792; + // aapt resource value: 0x7f0b0000 + public const int entry = 2131427328; - // aapt resource value: 0x7f0a0001 - public const int entry_edit = 2131361793; + // aapt resource value: 0x7f0b0001 + public const int entry_edit = 2131427329; - // aapt resource value: 0x7f0a0002 - public const int fileselect = 2131361794; + // aapt resource value: 0x7f0b0002 + public const int fileselect = 2131427330; - // aapt resource value: 0x7f0a0003 - public const int group = 2131361795; + // aapt resource value: 0x7f0b0003 + public const int group = 2131427331; - // aapt resource value: 0x7f0a0004 - public const int password = 2131361796; + // aapt resource value: 0x7f0b0004 + public const int password = 2131427332; private Menu() { @@ -1006,770 +1068,803 @@ namespace keepass2android public partial class String { - // aapt resource value: 0x7f060025 - public const int AboutText = 2131099685; + // aapt resource value: 0x7f07002d + public const int AboutText = 2131165229; - // aapt resource value: 0x7f0600f3 - public const int AskDeletePermanentlyEntry = 2131099891; + // aapt resource value: 0x7f0700fe + public const int AskDeletePermanentlyEntry = 2131165438; - // aapt resource value: 0x7f0600f4 - public const int AskDeletePermanentlyGroup = 2131099892; + // aapt resource value: 0x7f0700ff + public const int AskDeletePermanentlyGroup = 2131165439; - // aapt resource value: 0x7f0600f5 - public const int AskDeletePermanently_title = 2131099893; + // aapt resource value: 0x7f070100 + public const int AskDeletePermanently_title = 2131165440; - // aapt resource value: 0x7f0600f8 - public const int AskDiscardChanges = 2131099896; + // aapt resource value: 0x7f070103 + public const int AskDiscardChanges = 2131165443; - // aapt resource value: 0x7f0600f9 - public const int AskDiscardChanges_title = 2131099897; + // aapt resource value: 0x7f070104 + public const int AskDiscardChanges_title = 2131165444; - // aapt resource value: 0x7f0600ed - public const int AskOverwriteBinary = 2131099885; + // aapt resource value: 0x7f0700f8 + public const int AskOverwriteBinary = 2131165432; - // aapt resource value: 0x7f0600f0 - public const int AskOverwriteBinary_no = 2131099888; + // aapt resource value: 0x7f0700fb + public const int AskOverwriteBinary_no = 2131165435; - // aapt resource value: 0x7f0600ee - public const int AskOverwriteBinary_title = 2131099886; + // aapt resource value: 0x7f0700f9 + public const int AskOverwriteBinary_title = 2131165433; - // aapt resource value: 0x7f0600ef - public const int AskOverwriteBinary_yes = 2131099887; + // aapt resource value: 0x7f0700fa + public const int AskOverwriteBinary_yes = 2131165434; - // aapt resource value: 0x7f0600f7 - public const int AskReloadFile = 2131099895; + // aapt resource value: 0x7f070102 + public const int AskReloadFile = 2131165442; - // aapt resource value: 0x7f0600f6 - public const int AskReloadFile_title = 2131099894; + // aapt resource value: 0x7f070101 + public const int AskReloadFile_title = 2131165441; - // aapt resource value: 0x7f0600f1 - public const int AttachFailed = 2131099889; + // aapt resource value: 0x7f0700fc + public const int AttachFailed = 2131165436; - // aapt resource value: 0x7f060017 - public const int BinaryDirectory_default = 2131099671; + // aapt resource value: 0x7f07001f + public const int BinaryDirectory_default = 2131165215; - // aapt resource value: 0x7f060016 - public const int BinaryDirectory_key = 2131099670; + // aapt resource value: 0x7f07001e + public const int BinaryDirectory_key = 2131165214; - // aapt resource value: 0x7f0600df - public const int BinaryDirectory_summary = 2131099871; + // aapt resource value: 0x7f0700ea + public const int BinaryDirectory_summary = 2131165418; - // aapt resource value: 0x7f0600de - public const int BinaryDirectory_title = 2131099870; + // aapt resource value: 0x7f0700e9 + public const int BinaryDirectory_title = 2131165417; - // aapt resource value: 0x7f0600fe - public const int ChangeLog = 2131099902; + // aapt resource value: 0x7f070109 + public const int ChangeLog = 2131165449; - // aapt resource value: 0x7f0600fd - public const int ChangeLog_title = 2131099901; + // aapt resource value: 0x7f070108 + public const int ChangeLog_title = 2131165448; - // aapt resource value: 0x7f060039 - public const int ClearClipboard = 2131099705; + // aapt resource value: 0x7f070041 + public const int ClearClipboard = 2131165249; - // aapt resource value: 0x7f060026 - public const int CreditsText = 2131099686; + // aapt resource value: 0x7f07002e + public const int CreditsText = 2131165230; - // aapt resource value: 0x7f06006f - public const int FileNotFound = 2131099759; + // aapt resource value: 0x7f07007a + public const int FileNotFound = 2131165306; - // aapt resource value: 0x7f060082 - public const int InvalidPassword = 2131099778; + // aapt resource value: 0x7f07008d + public const int InvalidPassword = 2131165325; - // aapt resource value: 0x7f06001c - public const int LastInfoVersionCode_key = 2131099676; + // aapt resource value: 0x7f070024 + public const int LastInfoVersionCode_key = 2131165220; - // aapt resource value: 0x7f06001e - public const int MarketURL = 2131099678; + // aapt resource value: 0x7f070026 + public const int MarketURL = 2131165222; - // aapt resource value: 0x7f06008c - public const int MaskedPassword = 2131099788; + // aapt resource value: 0x7f070097 + public const int MaskedPassword = 2131165335; - // aapt resource value: 0x7f060018 - public const int QuickUnlockDefaultEnabled_key = 2131099672; + // aapt resource value: 0x7f070020 + public const int QuickUnlockDefaultEnabled_key = 2131165216; - // aapt resource value: 0x7f0600da - public const int QuickUnlockDefaultEnabled_summary = 2131099866; + // aapt resource value: 0x7f0700e5 + public const int QuickUnlockDefaultEnabled_summary = 2131165413; - // aapt resource value: 0x7f0600d9 - public const int QuickUnlockDefaultEnabled_title = 2131099865; + // aapt resource value: 0x7f0700e4 + public const int QuickUnlockDefaultEnabled_title = 2131165412; - // aapt resource value: 0x7f06001a - public const int QuickUnlockLength_default = 2131099674; + // aapt resource value: 0x7f070022 + public const int QuickUnlockLength_default = 2131165218; - // aapt resource value: 0x7f060019 - public const int QuickUnlockLength_key = 2131099673; + // aapt resource value: 0x7f070021 + public const int QuickUnlockLength_key = 2131165217; - // aapt resource value: 0x7f0600dc - public const int QuickUnlockLength_summary = 2131099868; + // aapt resource value: 0x7f0700e7 + public const int QuickUnlockLength_summary = 2131165415; - // aapt resource value: 0x7f0600db - public const int QuickUnlockLength_title = 2131099867; + // aapt resource value: 0x7f0700e6 + public const int QuickUnlockLength_title = 2131165414; - // aapt resource value: 0x7f0600d7 - public const int QuickUnlock_button = 2131099863; + // aapt resource value: 0x7f0700e2 + public const int QuickUnlock_button = 2131165410; - // aapt resource value: 0x7f0600dd - public const int QuickUnlock_fail = 2131099869; + // aapt resource value: 0x7f0700e8 + public const int QuickUnlock_fail = 2131165416; - // aapt resource value: 0x7f0600d6 - public const int QuickUnlock_label = 2131099862; + // aapt resource value: 0x7f0700e1 + public const int QuickUnlock_label = 2131165409; - // aapt resource value: 0x7f0600d8 - public const int QuickUnlock_lockButton = 2131099864; + // aapt resource value: 0x7f0700e3 + public const int QuickUnlock_lockButton = 2131165411; - // aapt resource value: 0x7f0600f2 - public const int RecycleBin = 2131099890; + // aapt resource value: 0x7f0700fd + public const int RecycleBin = 2131165437; - // aapt resource value: 0x7f0600e1 - public const int SaveAttachment_Failed = 2131099873; + // aapt resource value: 0x7f0700ec + public const int SaveAttachment_Failed = 2131165420; - // aapt resource value: 0x7f0600e0 - public const int SaveAttachment_doneMessage = 2131099872; + // aapt resource value: 0x7f0700eb + public const int SaveAttachment_doneMessage = 2131165419; - // aapt resource value: 0x7f06001f - public const int SuggestionsURL = 2131099679; + // aapt resource value: 0x7f070027 + public const int SuggestionsURL = 2131165223; - // aapt resource value: 0x7f060014 - public const int TanExpiresOnUse_key = 2131099668; + // aapt resource value: 0x7f07001c + public const int TanExpiresOnUse_key = 2131165212; - // aapt resource value: 0x7f0600ca - public const int TanExpiresOnUse_summary = 2131099850; + // aapt resource value: 0x7f0700d5 + public const int TanExpiresOnUse_summary = 2131165397; - // aapt resource value: 0x7f0600c9 - public const int TanExpiresOnUse_title = 2131099849; + // aapt resource value: 0x7f0700d4 + public const int TanExpiresOnUse_title = 2131165396; - // aapt resource value: 0x7f060020 - public const int TranslationURL = 2131099680; + // aapt resource value: 0x7f070028 + public const int TranslationURL = 2131165224; - // aapt resource value: 0x7f06001b - public const int UsageCount_key = 2131099675; + // aapt resource value: 0x7f070023 + public const int UsageCount_key = 2131165219; - // aapt resource value: 0x7f06001d - public const int UseFileTransactions_key = 2131099677; + // aapt resource value: 0x7f070025 + public const int UseFileTransactions_key = 2131165221; - // aapt resource value: 0x7f0600ec - public const int UseFileTransactions_summary = 2131099884; + // aapt resource value: 0x7f0700f7 + public const int UseFileTransactions_summary = 2131165431; - // aapt resource value: 0x7f0600eb - public const int UseFileTransactions_title = 2131099883; + // aapt resource value: 0x7f0700f6 + public const int UseFileTransactions_title = 2131165430; - // aapt resource value: 0x7f060023 - public const int about_feedback = 2131099683; + // aapt resource value: 0x7f07002b + public const int about_feedback = 2131165227; - // aapt resource value: 0x7f060024 - public const int about_homepage = 2131099684; + // aapt resource value: 0x7f07002c + public const int about_homepage = 2131165228; - // aapt resource value: 0x7f060027 - public const int accept = 2131099687; + // aapt resource value: 0x7f07002f + public const int accept = 2131165231; - // aapt resource value: 0x7f0600e7 - public const int add_binary = 2131099879; + // aapt resource value: 0x7f0700f2 + public const int add_binary = 2131165426; - // aapt resource value: 0x7f060028 - public const int add_entry = 2131099688; + // aapt resource value: 0x7f070030 + public const int add_entry = 2131165232; - // aapt resource value: 0x7f0600e8 - public const int add_extra_string = 2131099880; + // aapt resource value: 0x7f0700f3 + public const int add_extra_string = 2131165427; - // aapt resource value: 0x7f060029 - public const int add_group = 2131099689; + // aapt resource value: 0x7f070031 + public const int add_group = 2131165233; - // aapt resource value: 0x7f06002a - public const int add_group_title = 2131099690; + // aapt resource value: 0x7f070032 + public const int add_group_title = 2131165234; - // aapt resource value: 0x7f06002b - public const int algorithm = 2131099691; + // aapt resource value: 0x7f070033 + public const int algorithm = 2131165235; - // aapt resource value: 0x7f06002c - public const int algorithm_colon = 2131099692; + // aapt resource value: 0x7f070034 + public const int algorithm_colon = 2131165236; - // aapt resource value: 0x7f060008 - public const int algorithm_key = 2131099656; + // aapt resource value: 0x7f070010 + public const int algorithm_key = 2131165200; - // aapt resource value: 0x7f060009 - public const int app_key = 2131099657; + // aapt resource value: 0x7f070011 + public const int app_key = 2131165201; - // aapt resource value: 0x7f06002d - public const int app_name = 2131099693; + // aapt resource value: 0x7f070035 + public const int app_name = 2131165237; - // aapt resource value: 0x7f06002f - public const int app_name_nonet = 2131099695; + // aapt resource value: 0x7f070037 + public const int app_name_nonet = 2131165239; - // aapt resource value: 0x7f060031 - public const int app_timeout = 2131099697; + // aapt resource value: 0x7f070039 + public const int app_timeout = 2131165241; - // aapt resource value: 0x7f06000a - public const int app_timeout_key = 2131099658; + // aapt resource value: 0x7f070012 + public const int app_timeout_key = 2131165202; - // aapt resource value: 0x7f060032 - public const int app_timeout_summary = 2131099698; + // aapt resource value: 0x7f07003a + public const int app_timeout_summary = 2131165242; - // aapt resource value: 0x7f060033 - public const int application = 2131099699; + // aapt resource value: 0x7f07003b + public const int application = 2131165243; - // aapt resource value: 0x7f060034 - public const int application_settings = 2131099700; + // aapt resource value: 0x7f07003c + public const int application_settings = 2131165244; - // aapt resource value: 0x7f060035 - public const int brackets = 2131099701; + // aapt resource value: 0x7f070046 + public const int available_through_keyboard = 2131165254; - // aapt resource value: 0x7f060036 - public const int browser_intall_text = 2131099702; + // aapt resource value: 0x7f07003d + public const int brackets = 2131165245; - // aapt resource value: 0x7f060037 - public const int building_search_idx = 2131099703; + // aapt resource value: 0x7f07003e + public const int browser_intall_text = 2131165246; - // aapt resource value: 0x7f060038 - public const int cancel = 2131099704; + // aapt resource value: 0x7f07003f + public const int building_search_idx = 2131165247; - // aapt resource value: 0x7f0600ce - public const int caseSensitive = 2131099854; + // aapt resource value: 0x7f070040 + public const int cancel = 2131165248; - // aapt resource value: 0x7f06003a - public const int clipboard_timeout = 2131099706; + // aapt resource value: 0x7f0700d9 + public const int caseSensitive = 2131165401; - // aapt resource value: 0x7f060021 - public const int clipboard_timeout_default = 2131099681; + // aapt resource value: 0x7f070002 + public const int change_entry = 2131165186; - // aapt resource value: 0x7f06000b - public const int clipboard_timeout_key = 2131099659; + // aapt resource value: 0x7f070042 + public const int clipboard_timeout = 2131165250; - // aapt resource value: 0x7f06003b - public const int clipboard_timeout_summary = 2131099707; + // aapt resource value: 0x7f070029 + public const int clipboard_timeout_default = 2131165225; - // aapt resource value: 0x7f06003d - public const int copy_password = 2131099709; + // aapt resource value: 0x7f070013 + public const int clipboard_timeout_key = 2131165203; - // aapt resource value: 0x7f06003c - public const int copy_username = 2131099708; + // aapt resource value: 0x7f070043 + public const int clipboard_timeout_summary = 2131165251; - // aapt resource value: 0x7f06003e - public const int creating_db_key = 2131099710; + // aapt resource value: 0x7f070045 + public const int copy_password = 2131165253; - // aapt resource value: 0x7f0600ea - public const int credentials_dialog_title = 2131099882; + // aapt resource value: 0x7f070044 + public const int copy_username = 2131165252; - // aapt resource value: 0x7f06003f - public const int current_group = 2131099711; + // aapt resource value: 0x7f070049 + public const int creating_db_key = 2131165257; - // aapt resource value: 0x7f060040 - public const int current_group_root = 2131099712; + // aapt resource value: 0x7f0700f5 + public const int credentials_dialog_title = 2131165429; - // aapt resource value: 0x7f060041 - public const int database = 2131099713; + // aapt resource value: 0x7f07004a + public const int current_group = 2131165258; - // aapt resource value: 0x7f0600e9 - public const int database_loaded_quickunlock_enabled = 2131099881; + // aapt resource value: 0x7f07004b + public const int current_group_root = 2131165259; - // aapt resource value: 0x7f06000c - public const int db_key = 2131099660; + // aapt resource value: 0x7f07004c + public const int database = 2131165260; - // aapt resource value: 0x7f060042 - public const int decrypting_db = 2131099714; + // aapt resource value: 0x7f0700f4 + public const int database_loaded_quickunlock_enabled = 2131165428; - // aapt resource value: 0x7f060043 - public const int decrypting_entry = 2131099715; + // aapt resource value: 0x7f070014 + public const int db_key = 2131165204; - // aapt resource value: 0x7f060044 - public const int default_checkbox = 2131099716; + // aapt resource value: 0x7f07004d + public const int decrypting_db = 2131165261; - // aapt resource value: 0x7f060001 - public const int default_file_path = 2131099649; + // aapt resource value: 0x7f07004e + public const int decrypting_entry = 2131165262; - // aapt resource value: 0x7f0600b6 - public const int default_username = 2131099830; + // aapt resource value: 0x7f07004f + public const int default_checkbox = 2131165263; - // aapt resource value: 0x7f060015 - public const int default_username_key = 2131099669; + // aapt resource value: 0x7f070009 + public const int default_file_path = 2131165193; - // aapt resource value: 0x7f060045 - public const int digits = 2131099717; + // aapt resource value: 0x7f0700c1 + public const int default_username = 2131165377; - // aapt resource value: 0x7f060046 - public const int disclaimer_formal = 2131099718; + // aapt resource value: 0x7f07001d + public const int default_username_key = 2131165213; - // aapt resource value: 0x7f060002 - public const int donate_url = 2131099650; + // aapt resource value: 0x7f070050 + public const int digits = 2131165264; - // aapt resource value: 0x7f060047 - public const int ellipsis = 2131099719; + // aapt resource value: 0x7f070051 + public const int disclaimer_formal = 2131165265; - // aapt resource value: 0x7f0600d5 - public const int enable_quickunlock = 2131099861; + // aapt resource value: 0x7f07000a + public const int donate_url = 2131165194; - // aapt resource value: 0x7f060048 - public const int enter_filename = 2131099720; + // aapt resource value: 0x7f070052 + public const int ellipsis = 2131165266; - // aapt resource value: 0x7f0600d4 - public const int enter_filename_details_create_import = 2131099860; + // aapt resource value: 0x7f0700e0 + public const int enable_quickunlock = 2131165408; - // aapt resource value: 0x7f0600d3 - public const int enter_filename_details_url = 2131099859; + // aapt resource value: 0x7f070053 + public const int enter_filename = 2131165267; - // aapt resource value: 0x7f060049 - public const int entry_accessed = 2131099721; + // aapt resource value: 0x7f0700df + public const int enter_filename_details_create_import = 2131165407; - // aapt resource value: 0x7f06004a - public const int entry_and_or = 2131099722; + // aapt resource value: 0x7f0700de + public const int enter_filename_details_url = 2131165406; - // aapt resource value: 0x7f06005a - public const int entry_binaries = 2131099738; + // aapt resource value: 0x7f070054 + public const int entry_accessed = 2131165268; - // aapt resource value: 0x7f06004b - public const int entry_cancel = 2131099723; + // aapt resource value: 0x7f070055 + public const int entry_and_or = 2131165269; - // aapt resource value: 0x7f06004c - public const int entry_comment = 2131099724; + // aapt resource value: 0x7f070065 + public const int entry_binaries = 2131165285; - // aapt resource value: 0x7f06004f - public const int entry_confpassword = 2131099727; + // aapt resource value: 0x7f070056 + public const int entry_cancel = 2131165270; - // aapt resource value: 0x7f060050 - public const int entry_created = 2131099728; + // aapt resource value: 0x7f070057 + public const int entry_comment = 2131165271; - // aapt resource value: 0x7f060051 - public const int entry_expires = 2131099729; + // aapt resource value: 0x7f07005a + public const int entry_confpassword = 2131165274; - // aapt resource value: 0x7f060059 - public const int entry_extra_strings = 2131099737; + // aapt resource value: 0x7f07005b + public const int entry_created = 2131165275; - // aapt resource value: 0x7f060052 - public const int entry_keyfile = 2131099730; + // aapt resource value: 0x7f07005c + public const int entry_expires = 2131165276; - // aapt resource value: 0x7f060053 - public const int entry_modified = 2131099731; + // aapt resource value: 0x7f070064 + public const int entry_extra_strings = 2131165284; - // aapt resource value: 0x7f06004e - public const int entry_override_url = 2131099726; + // aapt resource value: 0x7f07005d + public const int entry_keyfile = 2131165277; - // aapt resource value: 0x7f060054 - public const int entry_password = 2131099732; + // aapt resource value: 0x7f07005e + public const int entry_modified = 2131165278; - // aapt resource value: 0x7f060055 - public const int entry_save = 2131099733; + // aapt resource value: 0x7f070059 + public const int entry_override_url = 2131165273; - // aapt resource value: 0x7f06004d - public const int entry_tags = 2131099725; + // aapt resource value: 0x7f07005f + public const int entry_password = 2131165279; - // aapt resource value: 0x7f060056 - public const int entry_title = 2131099734; + // aapt resource value: 0x7f070060 + public const int entry_save = 2131165280; - // aapt resource value: 0x7f060057 - public const int entry_url = 2131099735; + // aapt resource value: 0x7f070058 + public const int entry_tags = 2131165272; - // aapt resource value: 0x7f060058 - public const int entry_user_name = 2131099736; + // aapt resource value: 0x7f070061 + public const int entry_title = 2131165281; - // aapt resource value: 0x7f06005b - public const int error_arc4 = 2131099739; + // aapt resource value: 0x7f070062 + public const int entry_url = 2131165282; - // aapt resource value: 0x7f06005c - public const int error_can_not_handle_uri = 2131099740; + // aapt resource value: 0x7f070063 + public const int entry_user_name = 2131165283; - // aapt resource value: 0x7f06005d - public const int error_could_not_create_group = 2131099741; + // aapt resource value: 0x7f070066 + public const int error_arc4 = 2131165286; - // aapt resource value: 0x7f06005e - public const int error_could_not_create_parent = 2131099742; + // aapt resource value: 0x7f070067 + public const int error_can_not_handle_uri = 2131165287; - // aapt resource value: 0x7f06005f - public const int error_database_exists = 2131099743; + // aapt resource value: 0x7f070068 + public const int error_could_not_create_group = 2131165288; - // aapt resource value: 0x7f060060 - public const int error_database_settings = 2131099744; + // aapt resource value: 0x7f070069 + public const int error_could_not_create_parent = 2131165289; - // aapt resource value: 0x7f060061 - public const int error_failed_to_launch_link = 2131099745; + // aapt resource value: 0x7f07006a + public const int error_database_exists = 2131165290; - // aapt resource value: 0x7f060063 - public const int error_file_not_create = 2131099747; + // aapt resource value: 0x7f07006b + public const int error_database_settings = 2131165291; - // aapt resource value: 0x7f060062 - public const int error_filename_required = 2131099746; + // aapt resource value: 0x7f07006c + public const int error_failed_to_launch_link = 2131165292; - // aapt resource value: 0x7f060064 - public const int error_invalid_db = 2131099748; + // aapt resource value: 0x7f07006e + public const int error_file_not_create = 2131165294; - // aapt resource value: 0x7f0600e2 - public const int error_invalid_expiry_date = 2131099874; + // aapt resource value: 0x7f07006d + public const int error_filename_required = 2131165293; - // aapt resource value: 0x7f060065 - public const int error_invalid_path = 2131099749; + // aapt resource value: 0x7f07006f + public const int error_invalid_db = 2131165295; - // aapt resource value: 0x7f060066 - public const int error_no_name = 2131099750; + // aapt resource value: 0x7f0700ed + public const int error_invalid_expiry_date = 2131165421; - // aapt resource value: 0x7f060067 - public const int error_nopass = 2131099751; + // aapt resource value: 0x7f070070 + public const int error_invalid_path = 2131165296; - // aapt resource value: 0x7f060068 - public const int error_out_of_memory = 2131099752; + // aapt resource value: 0x7f070071 + public const int error_no_name = 2131165297; - // aapt resource value: 0x7f060069 - public const int error_pass_gen_type = 2131099753; + // aapt resource value: 0x7f070072 + public const int error_nopass = 2131165298; - // aapt resource value: 0x7f06006a - public const int error_pass_match = 2131099754; + // aapt resource value: 0x7f070073 + public const int error_out_of_memory = 2131165299; - // aapt resource value: 0x7f06006b - public const int error_rounds_not_number = 2131099755; + // aapt resource value: 0x7f070074 + public const int error_pass_gen_type = 2131165300; - // aapt resource value: 0x7f06006c - public const int error_rounds_too_large = 2131099756; + // aapt resource value: 0x7f070075 + public const int error_pass_match = 2131165301; - // aapt resource value: 0x7f0600e3 - public const int error_string_key = 2131099875; + // aapt resource value: 0x7f070076 + public const int error_rounds_not_number = 2131165302; - // aapt resource value: 0x7f06006d - public const int error_title_required = 2131099757; + // aapt resource value: 0x7f070077 + public const int error_rounds_too_large = 2131165303; - // aapt resource value: 0x7f06006e - public const int error_wrong_length = 2131099758; + // aapt resource value: 0x7f0700ee + public const int error_string_key = 2131165422; - // aapt resource value: 0x7f0600cc - public const int excludeExpiredEntries = 2131099852; + // aapt resource value: 0x7f070078 + public const int error_title_required = 2131165304; - // aapt resource value: 0x7f0600e4 - public const int field_name = 2131099876; + // aapt resource value: 0x7f070079 + public const int error_wrong_length = 2131165305; - // aapt resource value: 0x7f0600e5 - public const int field_value = 2131099877; + // aapt resource value: 0x7f0700d7 + public const int excludeExpiredEntries = 2131165399; - // aapt resource value: 0x7f060070 - public const int file_browser = 2131099760; + // aapt resource value: 0x7f0700ef + public const int field_name = 2131165423; - // aapt resource value: 0x7f060071 - public const int generate_password = 2131099761; + // aapt resource value: 0x7f0700f0 + public const int field_value = 2131165424; - // aapt resource value: 0x7f060072 - public const int group = 2131099762; + // aapt resource value: 0x7f07007b + public const int file_browser = 2131165307; - // aapt resource value: 0x7f060073 - public const int hint_comment = 2131099763; + // aapt resource value: 0x7f07007c + public const int generate_password = 2131165308; - // aapt resource value: 0x7f060074 - public const int hint_conf_pass = 2131099764; + // aapt resource value: 0x7f07007d + public const int group = 2131165309; - // aapt resource value: 0x7f060075 - public const int hint_generated_password = 2131099765; + // aapt resource value: 0x7f07007e + public const int hint_comment = 2131165310; - // aapt resource value: 0x7f060076 - public const int hint_group_name = 2131099766; + // aapt resource value: 0x7f07007f + public const int hint_conf_pass = 2131165311; - // aapt resource value: 0x7f060077 - public const int hint_keyfile = 2131099767; + // aapt resource value: 0x7f070080 + public const int hint_generated_password = 2131165312; - // aapt resource value: 0x7f060078 - public const int hint_length = 2131099768; + // aapt resource value: 0x7f070081 + public const int hint_group_name = 2131165313; - // aapt resource value: 0x7f06007a - public const int hint_login_pass = 2131099770; + // aapt resource value: 0x7f070082 + public const int hint_keyfile = 2131165314; - // aapt resource value: 0x7f06007d - public const int hint_override_url = 2131099773; + // aapt resource value: 0x7f070083 + public const int hint_length = 2131165315; - // aapt resource value: 0x7f060079 - public const int hint_pass = 2131099769; + // aapt resource value: 0x7f070085 + public const int hint_login_pass = 2131165317; - // aapt resource value: 0x7f06007e - public const int hint_tags = 2131099774; + // aapt resource value: 0x7f070088 + public const int hint_override_url = 2131165320; - // aapt resource value: 0x7f06007b - public const int hint_title = 2131099771; + // aapt resource value: 0x7f070084 + public const int hint_pass = 2131165316; - // aapt resource value: 0x7f06007c - public const int hint_url = 2131099772; + // aapt resource value: 0x7f070089 + public const int hint_tags = 2131165321; - // aapt resource value: 0x7f06007f - public const int hint_username = 2131099775; + // aapt resource value: 0x7f070086 + public const int hint_title = 2131165318; - // aapt resource value: 0x7f060003 - public const int homepage = 2131099651; + // aapt resource value: 0x7f070087 + public const int hint_url = 2131165319; - // aapt resource value: 0x7f060004 - public const int homepage_short = 2131099652; + // aapt resource value: 0x7f07008a + public const int hint_username = 2131165322; - // aapt resource value: 0x7f060080 - public const int install_from_market = 2131099776; + // aapt resource value: 0x7f07000b + public const int homepage = 2131165195; - // aapt resource value: 0x7f060081 - public const int install_from_website = 2131099777; + // aapt resource value: 0x7f07000c + public const int homepage_short = 2131165196; - // aapt resource value: 0x7f060083 - public const int invalid_algorithm = 2131099779; + // aapt resource value: 0x7f070000 + public const int ime_name = 2131165184; - // aapt resource value: 0x7f060084 - public const int invalid_db_sig = 2131099780; + // aapt resource value: 0x7f07008b + public const int install_from_market = 2131165323; - // aapt resource value: 0x7f060005 - public const int issues = 2131099653; + // aapt resource value: 0x7f07008c + public const int install_from_website = 2131165324; - // aapt resource value: 0x7f060085 - public const int keyfile_does_not_exist = 2131099781; + // aapt resource value: 0x7f07008e + public const int invalid_algorithm = 2131165326; - // aapt resource value: 0x7f060086 - public const int keyfile_is_empty = 2131099782; + // aapt resource value: 0x7f07008f + public const int invalid_db_sig = 2131165327; - // aapt resource value: 0x7f06000e - public const int keyfile_key = 2131099662; + // aapt resource value: 0x7f07000d + public const int issues = 2131165197; - // aapt resource value: 0x7f0600cb - public const int kp2a_findUrl = 2131099851; + // aapt resource value: 0x7f070090 + public const int keyfile_does_not_exist = 2131165328; - // aapt resource value: 0x7f060087 - public const int length = 2131099783; + // aapt resource value: 0x7f070091 + public const int keyfile_is_empty = 2131165329; - // aapt resource value: 0x7f060000 - public const int library_name = 2131099648; + // aapt resource value: 0x7f070016 + public const int keyfile_key = 2131165206; - // aapt resource value: 0x7f060022 - public const int list_size_default = 2131099682; + // aapt resource value: 0x7f0700d6 + public const int kp2a_findUrl = 2131165398; - // aapt resource value: 0x7f060011 - public const int list_size_key = 2131099665; + // aapt resource value: 0x7f070004 + public const int label_go_key = 2131165188; - // aapt resource value: 0x7f060089 - public const int list_size_summary = 2131099785; + // aapt resource value: 0x7f070005 + public const int label_next_key = 2131165189; - // aapt resource value: 0x7f060088 - public const int list_size_title = 2131099784; + // aapt resource value: 0x7f070006 + public const int label_send_key = 2131165190; - // aapt resource value: 0x7f06008a - public const int loading_database = 2131099786; + // aapt resource value: 0x7f070007 + public const int label_subtype_generic = 2131165191; - // aapt resource value: 0x7f06008b - public const int lowercase = 2131099787; + // aapt resource value: 0x7f070092 + public const int length = 2131165330; - // aapt resource value: 0x7f06000f - public const int maskpass_key = 2131099663; + // aapt resource value: 0x7f070008 + public const int library_name = 2131165192; - // aapt resource value: 0x7f06008e - public const int maskpass_summary = 2131099790; + // aapt resource value: 0x7f07002a + public const int list_size_default = 2131165226; - // aapt resource value: 0x7f06008d - public const int maskpass_title = 2131099789; + // aapt resource value: 0x7f070019 + public const int list_size_key = 2131165209; - // aapt resource value: 0x7f06008f - public const int menu_about = 2131099791; + // aapt resource value: 0x7f070094 + public const int list_size_summary = 2131165332; - // aapt resource value: 0x7f060094 - public const int menu_app_settings = 2131099796; + // aapt resource value: 0x7f070093 + public const int list_size_title = 2131165331; - // aapt resource value: 0x7f060090 - public const int menu_change_key = 2131099792; + // aapt resource value: 0x7f070095 + public const int loading_database = 2131165333; - // aapt resource value: 0x7f060091 - public const int menu_copy_pass = 2131099793; + // aapt resource value: 0x7f070096 + public const int lowercase = 2131165334; - // aapt resource value: 0x7f060092 - public const int menu_copy_user = 2131099794; + // aapt resource value: 0x7f070017 + public const int maskpass_key = 2131165207; - // aapt resource value: 0x7f060093 - public const int menu_create = 2131099795; + // aapt resource value: 0x7f070099 + public const int maskpass_summary = 2131165337; - // aapt resource value: 0x7f060095 - public const int menu_db_settings = 2131099797; + // aapt resource value: 0x7f070098 + public const int maskpass_title = 2131165336; - // aapt resource value: 0x7f060096 - public const int menu_delete = 2131099798; + // aapt resource value: 0x7f07009a + public const int menu_about = 2131165338; - // aapt resource value: 0x7f060097 - public const int menu_donate = 2131099799; + // aapt resource value: 0x7f07009f + public const int menu_app_settings = 2131165343; - // aapt resource value: 0x7f060098 - public const int menu_edit = 2131099800; + // aapt resource value: 0x7f07009b + public const int menu_change_key = 2131165339; - // aapt resource value: 0x7f060099 - public const int menu_hide_password = 2131099801; + // aapt resource value: 0x7f07009c + public const int menu_copy_pass = 2131165340; - // aapt resource value: 0x7f06009a - public const int menu_homepage = 2131099802; + // aapt resource value: 0x7f07009d + public const int menu_copy_user = 2131165341; - // aapt resource value: 0x7f06009b - public const int menu_lock = 2131099803; + // aapt resource value: 0x7f07009e + public const int menu_create = 2131165342; - // aapt resource value: 0x7f06009c - public const int menu_open = 2131099804; + // aapt resource value: 0x7f0700a0 + public const int menu_db_settings = 2131165344; - // aapt resource value: 0x7f06009d - public const int menu_rename = 2131099805; + // aapt resource value: 0x7f0700a1 + public const int menu_delete = 2131165345; - // aapt resource value: 0x7f06009e - public const int menu_search = 2131099806; + // aapt resource value: 0x7f0700a2 + public const int menu_donate = 2131165346; - // aapt resource value: 0x7f06009f - public const int menu_url = 2131099807; + // aapt resource value: 0x7f0700a3 + public const int menu_edit = 2131165347; - // aapt resource value: 0x7f0600a0 - public const int minus = 2131099808; + // aapt resource value: 0x7f0700a4 + public const int menu_hide_password = 2131165348; - // aapt resource value: 0x7f0600a1 - public const int never = 2131099809; + // aapt resource value: 0x7f0700a5 + public const int menu_homepage = 2131165349; - // aapt resource value: 0x7f0600a3 - public const int no = 2131099811; + // aapt resource value: 0x7f0700a6 + public const int menu_lock = 2131165350; - // aapt resource value: 0x7f0600a4 - public const int no_keys = 2131099812; + // aapt resource value: 0x7f0700a7 + public const int menu_open = 2131165351; - // aapt resource value: 0x7f0600a5 - public const int no_results = 2131099813; + // aapt resource value: 0x7f0700a8 + public const int menu_rename = 2131165352; - // aapt resource value: 0x7f0600a6 - public const int no_url_handler = 2131099814; + // aapt resource value: 0x7f0700a9 + public const int menu_search = 2131165353; - // aapt resource value: 0x7f060006 - public const int oi_filemanager_market = 2131099654; + // aapt resource value: 0x7f0700aa + public const int menu_url = 2131165354; - // aapt resource value: 0x7f060007 - public const int oi_filemanager_web = 2131099655; + // aapt resource value: 0x7f0700ab + public const int minus = 2131165355; - // aapt resource value: 0x7f060010 - public const int omitbackup_key = 2131099664; + // aapt resource value: 0x7f0700ac + public const int never = 2131165356; - // aapt resource value: 0x7f0600a9 - public const int omitbackup_summary = 2131099817; + // aapt resource value: 0x7f0700ae + public const int no = 2131165358; - // aapt resource value: 0x7f0600a8 - public const int omitbackup_title = 2131099816; + // aapt resource value: 0x7f0700af + public const int no_keys = 2131165359; - // aapt resource value: 0x7f0600a7 - public const int open_recent = 2131099815; + // aapt resource value: 0x7f0700b0 + public const int no_results = 2131165360; - // aapt resource value: 0x7f0600aa - public const int pass_filename = 2131099818; + // aapt resource value: 0x7f0700b1 + public const int no_url_handler = 2131165361; - // aapt resource value: 0x7f0600ab - public const int password_title = 2131099819; + // aapt resource value: 0x7f070047 + public const int not_possible_im_picker = 2131165255; - // aapt resource value: 0x7f0600ac - public const int progress_create = 2131099820; + // aapt resource value: 0x7f07000e + public const int oi_filemanager_market = 2131165198; - // aapt resource value: 0x7f0600ad - public const int progress_title = 2131099821; + // aapt resource value: 0x7f07000f + public const int oi_filemanager_web = 2131165199; - // aapt resource value: 0x7f0600e6 - public const int protection = 2131099878; + // aapt resource value: 0x7f070018 + public const int omitbackup_key = 2131165208; - // aapt resource value: 0x7f0600fb - public const int rate_app = 2131099899; + // aapt resource value: 0x7f0700b4 + public const int omitbackup_summary = 2131165364; - // aapt resource value: 0x7f0600c8 - public const int regular_expression = 2131099848; + // aapt resource value: 0x7f0700b3 + public const int omitbackup_title = 2131165363; - // aapt resource value: 0x7f0600ae - public const int remember_keyfile_summary = 2131099822; + // aapt resource value: 0x7f070003 + public const int open_entry = 2131165187; - // aapt resource value: 0x7f0600af - public const int remember_keyfile_title = 2131099823; + // aapt resource value: 0x7f0700b2 + public const int open_recent = 2131165362; - // aapt resource value: 0x7f0600b0 - public const int remove_from_filelist = 2131099824; + // aapt resource value: 0x7f0700b5 + public const int pass_filename = 2131165365; - // aapt resource value: 0x7f0600b1 - public const int rijndael = 2131099825; + // aapt resource value: 0x7f0700b6 + public const int password_title = 2131165366; - // aapt resource value: 0x7f0600b2 - public const int root = 2131099826; + // aapt resource value: 0x7f070048 + public const int please_activate_keyboard = 2131165256; - // aapt resource value: 0x7f0600b3 - public const int rounds = 2131099827; + // aapt resource value: 0x7f0700b7 + public const int progress_create = 2131165367; - // aapt resource value: 0x7f0600b4 - public const int rounds_explaination = 2131099828; + // aapt resource value: 0x7f0700b8 + public const int progress_title = 2131165368; - // aapt resource value: 0x7f0600b5 - public const int rounds_hint = 2131099829; + // aapt resource value: 0x7f0700f1 + public const int protection = 2131165425; - // aapt resource value: 0x7f06000d - public const int rounds_key = 2131099661; + // aapt resource value: 0x7f070106 + public const int rate_app = 2131165446; - // aapt resource value: 0x7f0600b7 - public const int saving_database = 2131099831; + // aapt resource value: 0x7f0700d3 + public const int regular_expression = 2131165395; - // aapt resource value: 0x7f0600be - public const int search_hint = 2131099838; + // aapt resource value: 0x7f0700b9 + public const int remember_keyfile_summary = 2131165369; - // aapt resource value: 0x7f0600c0 - public const int search_in = 2131099840; + // aapt resource value: 0x7f0700ba + public const int remember_keyfile_title = 2131165370; - // aapt resource value: 0x7f0600b9 - public const int search_label = 2131099833; + // aapt resource value: 0x7f0700bb + public const int remove_from_filelist = 2131165371; - // aapt resource value: 0x7f0600cd - public const int search_options = 2131099853; + // aapt resource value: 0x7f0700bc + public const int rijndael = 2131165372; - // aapt resource value: 0x7f0600bf - public const int search_results = 2131099839; + // aapt resource value: 0x7f0700bd + public const int root = 2131165373; - // aapt resource value: 0x7f06002e - public const int short_app_name = 2131099694; + // aapt resource value: 0x7f0700be + public const int rounds = 2131165374; - // aapt resource value: 0x7f060030 - public const int short_app_name_nonet = 2131099696; + // aapt resource value: 0x7f0700bf + public const int rounds_explaination = 2131165375; - // aapt resource value: 0x7f0600ba - public const int show_password = 2131099834; + // aapt resource value: 0x7f0700c0 + public const int rounds_hint = 2131165376; - // aapt resource value: 0x7f0600bc - public const int sort_db = 2131099836; + // aapt resource value: 0x7f070015 + public const int rounds_key = 2131165205; - // aapt resource value: 0x7f060012 - public const int sort_key = 2131099666; + // aapt resource value: 0x7f0700c2 + public const int saving_database = 2131165378; - // aapt resource value: 0x7f0600bb - public const int sort_name = 2131099835; + // aapt resource value: 0x7f0700c9 + public const int search_hint = 2131165385; - // aapt resource value: 0x7f0600b8 - public const int space = 2131099832; + // aapt resource value: 0x7f0700cb + public const int search_in = 2131165387; - // aapt resource value: 0x7f0600bd - public const int special = 2131099837; + // aapt resource value: 0x7f0700c4 + public const int search_label = 2131165380; - // aapt resource value: 0x7f0600d0 - public const int start_create = 2131099856; + // aapt resource value: 0x7f0700d8 + public const int search_options = 2131165400; - // aapt resource value: 0x7f0600d2 - public const int start_create_import = 2131099858; + // aapt resource value: 0x7f0700ca + public const int search_results = 2131165386; - // aapt resource value: 0x7f0600cf - public const int start_open_file = 2131099855; + // aapt resource value: 0x7f070036 + public const int short_app_name = 2131165238; - // aapt resource value: 0x7f0600d1 - public const int start_open_url = 2131099857; + // aapt resource value: 0x7f070038 + public const int short_app_name_nonet = 2131165240; - // aapt resource value: 0x7f0600fa - public const int suggest_improvements = 2131099898; + // aapt resource value: 0x7f0700c5 + public const int show_password = 2131165381; - // aapt resource value: 0x7f060013 - public const int timeout_key = 2131099667; + // aapt resource value: 0x7f0700c7 + public const int sort_db = 2131165383; - // aapt resource value: 0x7f0600fc - public const int translate_app = 2131099900; + // aapt resource value: 0x7f07001a + public const int sort_key = 2131165210; - // aapt resource value: 0x7f0600c1 - public const int twofish = 2131099841; + // aapt resource value: 0x7f0700c6 + public const int sort_name = 2131165382; - // aapt resource value: 0x7f0600c2 - public const int underline = 2131099842; + // aapt resource value: 0x7f0700c3 + public const int space = 2131165379; - // aapt resource value: 0x7f0600c3 - public const int unsupported_db_version = 2131099843; + // aapt resource value: 0x7f0700c8 + public const int special = 2131165384; - // aapt resource value: 0x7f0600c4 - public const int uppercase = 2131099844; + // aapt resource value: 0x7f0700db + public const int start_create = 2131165403; - // aapt resource value: 0x7f0600c7 - public const int version_label = 2131099847; + // aapt resource value: 0x7f0700dd + public const int start_create_import = 2131165405; - // aapt resource value: 0x7f0600c5 - public const int warning_read_only = 2131099845; + // aapt resource value: 0x7f0700da + public const int start_open_file = 2131165402; - // aapt resource value: 0x7f0600c6 - public const int warning_unmounted = 2131099846; + // aapt resource value: 0x7f0700dc + public const int start_open_url = 2131165404; - // aapt resource value: 0x7f0600a2 - public const int yes = 2131099810; + // aapt resource value: 0x7f070105 + public const int suggest_improvements = 2131165445; + + // aapt resource value: 0x7f07001b + public const int timeout_key = 2131165211; + + // aapt resource value: 0x7f070107 + public const int translate_app = 2131165447; + + // aapt resource value: 0x7f0700cc + public const int twofish = 2131165388; + + // aapt resource value: 0x7f0700cd + public const int underline = 2131165389; + + // aapt resource value: 0x7f0700ce + public const int unsupported_db_version = 2131165390; + + // aapt resource value: 0x7f0700cf + public const int uppercase = 2131165391; + + // aapt resource value: 0x7f0700d2 + public const int version_label = 2131165394; + + // aapt resource value: 0x7f0700d0 + public const int warning_read_only = 2131165392; + + // aapt resource value: 0x7f0700d1 + public const int warning_unmounted = 2131165393; + + // aapt resource value: 0x7f070001 + public const int word_separators = 2131165185; + + // aapt resource value: 0x7f0700ad + public const int yes = 2131165357; private String() { @@ -1779,59 +1874,59 @@ namespace keepass2android public partial class Style { - // aapt resource value: 0x7f090011 - public const int Base = 2131296273; + // aapt resource value: 0x7f0a0011 + public const int Base = 2131361809; - // aapt resource value: 0x7f090001 - public const int Dialog = 2131296257; + // aapt resource value: 0x7f0a0001 + public const int Dialog = 2131361793; - // aapt resource value: 0x7f090006 - public const int ElementText = 2131296262; + // aapt resource value: 0x7f0a0006 + public const int ElementText = 2131361798; - // aapt resource value: 0x7f090007 - public const int ElementTextLarge = 2131296263; + // aapt resource value: 0x7f0a0007 + public const int ElementTextLarge = 2131361799; - // aapt resource value: 0x7f090005 - public const int ElementTextSmall = 2131296261; + // aapt resource value: 0x7f0a0005 + public const int ElementTextSmall = 2131361797; - // aapt resource value: 0x7f09000e - public const int ElementTextTitle = 2131296270; + // aapt resource value: 0x7f0a000e + public const int ElementTextTitle = 2131361806; - // aapt resource value: 0x7f09000d - public const int EntryFieldHeader = 2131296269; + // aapt resource value: 0x7f0a000d + public const int EntryFieldHeader = 2131361805; - // aapt resource value: 0x7f09000f - public const int EntryItem = 2131296271; + // aapt resource value: 0x7f0a000f + public const int EntryItem = 2131361807; - // aapt resource value: 0x7f090010 - public const int ExtraFieldHeader = 2131296272; + // aapt resource value: 0x7f0a0010 + public const int ExtraFieldHeader = 2131361808; - // aapt resource value: 0x7f09000a - public const int GroupAndEntryHeader = 2131296266; + // aapt resource value: 0x7f0a000a + public const int GroupAndEntryHeader = 2131361802; - // aapt resource value: 0x7f090008 - public const int GroupLabel = 2131296264; + // aapt resource value: 0x7f0a0008 + public const int GroupLabel = 2131361800; - // aapt resource value: 0x7f090003 - public const int GroupText = 2131296259; + // aapt resource value: 0x7f0a0003 + public const int GroupText = 2131361795; - // aapt resource value: 0x7f090004 - public const int GroupTextLarge = 2131296260; + // aapt resource value: 0x7f0a0004 + public const int GroupTextLarge = 2131361796; - // aapt resource value: 0x7f090002 - public const int GroupTextSmall = 2131296258; + // aapt resource value: 0x7f0a0002 + public const int GroupTextSmall = 2131361794; - // aapt resource value: 0x7f090000 - public const int NoTitleBar = 2131296256; + // aapt resource value: 0x7f0a0000 + public const int NoTitleBar = 2131361792; - // aapt resource value: 0x7f090009 - public const int WhiteOnBlack = 2131296265; + // aapt resource value: 0x7f0a0009 + public const int WhiteOnBlack = 2131361801; - // aapt resource value: 0x7f09000b - public const int WhiteOnBlackSmall = 2131296267; + // aapt resource value: 0x7f0a000b + public const int WhiteOnBlackSmall = 2131361803; - // aapt resource value: 0x7f09000c - public const int WhiteOnDarkSmall = 2131296268; + // aapt resource value: 0x7f0a000c + public const int WhiteOnDarkSmall = 2131361804; private Style() { @@ -1842,10 +1937,22 @@ namespace keepass2android { // aapt resource value: 0x7f040000 - public const int preferences = 2130968576; + public const int method = 2130968576; // aapt resource value: 0x7f040001 - public const int searchable = 2130968577; + public const int preferences = 2130968577; + + // aapt resource value: 0x7f040002 + public const int qwerty = 2130968578; + + // aapt resource value: 0x7f040003 + public const int searchable = 2130968579; + + // aapt resource value: 0x7f040004 + public const int symbols = 2130968580; + + // aapt resource value: 0x7f040005 + public const int symbols_shift = 2130968581; private Xml() { diff --git a/src/keepass2android/Resources/drawable-hdpi/notify_keyboard.png b/src/keepass2android/Resources/drawable-hdpi/notify_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..3a38e302d6a5b2795c19fef09bd951e00b26e4dc GIT binary patch literal 1242 zcmV<01SR{4P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*h( z1Oy*WN0W{K00de|L_t(&-tAdUD12QUe(t^VX_zsyFg_x-ij9rfla!@}u(A4`P+3`t!oothTrSvbHq_VGOVXd;?*~3tw7a`Y znVFgNF)!kdnVA{ld7hk3C$+V;kz6h(xm-@|?d|mN@Ia4`k2Eqek}$tsucwof6VWJ$ z3Se0_Ve;(kY`VO>q(C4*ot>Q`E{@}BRAh%6QhX*8OI`^nAC6&1jK9+Gf4obYg# zm6buO)#Bmd0amM3#1#sKaCUYEpU(%Q(TJ+5s)YOT`Fvs*l1l&G-QCE~&&SHj3LFl{ zw|1w~iS_k$7z_q9G&D%KDty+{FGHtRt7&v}l+0!`sZ^?O?G}rL+-^6OmzV#@QCV3@ zE|-foH#g(vkAzmM6-h`IYoUXKgXrz;1pvIizhh`B_ zXb>?thGFpf`ig>r0w|SAl$MsFv9S@WtE(~b|Av?gP^;C#vqGT|wY9Xg!0Yvbh)`2g z10n*)abQ^%9LEWZ55q8cdU}H2??-KIt*C(C_$4V|XlMu=#~~C7VQg$n)aG`(q0wmm zomec3mzNiuo}R+%^`fGp0!2kd2nK^-7zRAgS*W`0QuxWB(gS69~`+j4Spkd>7s zNJb`;!R2ycdwUypyB#Kz3Dwor@cDdTSr%_^Z_w#pO0)d8`ag-QE_oGEiElkFc_rg z=Vy9(c_EL-LyL=x$>Tz6Yim%e)q;c~bAVwO7>!1ppP%FP^%a3YKo|j=%@#BNUw5JA z=4R-0x^F9aMAKjMM1;M)JxoteCx;6S4-bQ7S%kx3Fboq-vLGVd-rh>$LZa<-w9b7_UteFsN5YPdj;Q?6Y&2#G>GgWy`SZ5n>xvo=3JMCM@=GQmv)K%pOomV>gz@ol zAwM}e37t+Cw}b+LfQaWO{A?NBL#NZx#>R$d z5;MVIkmA*EQvF)|?8T{uot+&(p-|Ao#02p?PpJZ)=V^U?oeTy8rTpLN&-Vk0k98px z?gv5u_>V~a8yYD%*e`2J_#@~K-$Z2l^_w)(NFxFK1N;4jn=>gBd;kCd07*qoM6N<$ Eg03 literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable/notify_keyboard.png b/src/keepass2android/Resources/drawable/notify_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9c1beb5af7224553458364020acb68e96826f5 GIT binary patch literal 896 zcmV-`1AqL9P)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i*h( z1O*Z)?cQ<#00RI?L_t(o!|j%_OKV9K#(#5@tdJ)u5>ammLO{)*V6%;l_$OGX5LB=c zt&D<&ScqUyw6(DDiNVTJ(9T91TO$?{V?q$rkmSaM%styY^UTv|vdg-=tRLLw-1%m{ zIp>=*17G;U{~ZeW9ryKj;ik_aH zhWU4QcZ`mX!uk2RG>fydGs)-kl1L;Z7K=$TnUricD@R91P0e$7cqmFl1mNJ{fTg7+ zlu{q6-`d*3=kqZ?KTkX!Clm^?xVT6nksuO@)aCtHifA-Se}8{9C_h9r^!fdMxxc@c zm6es6`1<;~JUl!|Fc@rTp6a^I3RqrVmUKETU0q!@@lYrvx3{-4H8s_g0B5~)IUEk6 z(I~cUGdnwr)|$4qHUT<7=}TqRO0FBiNV1^wzsz_7K=oqQMA@X zA`!IKZy&>F5BysDKp;Ro9>=zAdV70Gr_*$IcN2@nux%Tq6qQPaOeTZZ>&5MMBO+un z8OF!QaX1{W_;2~4ZU&OcBx7S^Xsv6=9*+mxwsE;!TwY!h4u_eWn`3x*7|XIK7K?~T zUH-3dzUTJ6y}dW%hGC$T!s&F<+S-cC<@%XYrK;Ji$8Si$vj<+*(6TH}PEHUJ48y>( zEc*KTC=?1DA0JbxRLEwtl*{Ee`G461ot>R5EG$qimw)cS=|pQ?t!b%LVs&*Dx7*#2 z2kHs{7#bQvYt8=t{-0|0@9`TF@OR?FQ{Zqon4X?SMA+EaKqw(Yt~-t2^dKtL?Zl6*cde!pK#)0A8;_u&PT%jLv0%^JRGn$35@WHQOb z!~|MvQmGUGlarHlbaYgA{>srxkxHeihI{6}*9ZPR9@yF0VQp>gLm?tkcg%bLUXH1` zvQJM><)6aE#f2!3$0NJDyR^5re`*OHA0G*a!_`Nr8)*6DM`;3 WpdJrY!Time before clearing clipboard after copying username or password Select to copy username to clipboard Select to copy password to clipboard + Entry is available through KP2A Keyboard + Could not open dialog to select input method. Please activate keyboard manually. + Please enable the Keepass2Android keyboard in your system settings. Creating database key… Current Group Current Group: Root diff --git a/src/keepass2android/intents/Intents.cs b/src/keepass2android/intents/Intents.cs index d37a3b96..2d168e96 100644 --- a/src/keepass2android/intents/Intents.cs +++ b/src/keepass2android/intents/Intents.cs @@ -35,6 +35,7 @@ namespace keepass2android public const String COPY_USERNAME = "keepass2android.copy_username"; public const String COPY_PASSWORD = "keepass2android.copy_password"; + public const String CHECK_KEYBOARD = "keepass2android.check_keyboard"; public const String FILE_BROWSE = "org.openintents.action.PICK_FILE"; public const int REQUEST_CODE_FILE_BROWSE = 987321; diff --git a/src/keepass2android/keepass2android.csproj b/src/keepass2android/keepass2android.csproj index ef573a15..72cfdace 100644 --- a/src/keepass2android/keepass2android.csproj +++ b/src/keepass2android/keepass2android.csproj @@ -583,6 +583,8 @@ + + @@ -644,6 +646,10 @@ {A57B3ACE-5634-469A-88C4-858BB409F356} kp2akeytransform + + {A8779D4D-7C49-4C2F-82BD-2CDC448391DA} + Kp2aKeyboardBinding + diff --git a/src/keepass2android/services/CopyToClipboardService.cs b/src/keepass2android/services/CopyToClipboardService.cs index 239e472b..74ae3e0b 100644 --- a/src/keepass2android/services/CopyToClipboardService.cs +++ b/src/keepass2android/services/CopyToClipboardService.cs @@ -30,6 +30,7 @@ using Android.Widget; using Android.Preferences; using KeePassLib; using KeePassLib.Utility; +using Android.Views.InputMethods; namespace keepass2android { @@ -40,6 +41,8 @@ namespace keepass2android public const int NOTIFY_USERNAME = 1; public const int NOTIFY_PASSWORD = 2; + public const int NOTIFY_KEYBOARD = 3; + public const int CLEAR_CLIPBOARD = 4; public CopyToClipboardService (IntPtr javaReference, JniHandleOwnership transfer) @@ -68,7 +71,7 @@ namespace keepass2android public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) { - Android.Util.Log.Debug("DEBUG","Received intent to copy to clipboard"); + Android.Util.Log.Debug("DEBUG","Received intent to provide access to entry"); String uuidBytes = intent.GetStringExtra(EntryActivity.KEY_ENTRY); @@ -95,7 +98,8 @@ namespace keepass2android return StartCommandResult.NotSticky; } - displayCopyNotifications(entry); + displayAccessNotifications(entry); + return StartCommandResult.RedeliverIntent; } @@ -117,6 +121,7 @@ namespace keepass2android if ( mNM != null ) { mNM.CancelAll(); mNumElementsToWaitFor= 0; + clearKeyboard(); } Android.Util.Log.Debug("DEBUG", "Destroyed Show-Notification-Receiver."); @@ -131,27 +136,30 @@ namespace keepass2android PendingIntent createDeleteIntent(int requestCode) { Intent intent = new Intent(ACTION_NOTIFICATION_CANCELLED); + Bundle extra = new Bundle(); + extra.PutInt("requestCode", requestCode); + intent.PutExtras(extra); return PendingIntent.GetBroadcast(this, requestCode, intent, PendingIntentFlags.CancelCurrent); } - public void displayCopyNotifications(PwEntry entry) + public void displayAccessNotifications(PwEntry entry) { // Notification Manager mNM = (NotificationManager)GetSystemService(NotificationService); mNM.CancelAll(); mNumElementsToWaitFor = 0; - + clearKeyboard(); String entryName = entry.Strings.ReadSafe(PwDefs.TitleField); if (entry.Strings.ReadSafe(PwDefs.PasswordField).Length > 0) { // only show notification if password is available - Notification password = GetNotification(Intents.COPY_PASSWORD, Resource.String.copy_password, entryName); + Notification password = GetNotification(Intents.COPY_PASSWORD, Resource.String.copy_password, Resource.Drawable.notify, entryName); - password.DeleteIntent = createDeleteIntent(0); + password.DeleteIntent = createDeleteIntent(NOTIFY_PASSWORD); mNM.Notify(NOTIFY_PASSWORD, password); mNumElementsToWaitFor++; @@ -160,12 +168,22 @@ namespace keepass2android if (entry.Strings.ReadSafe(PwDefs.UserNameField).Length > 0) { // only show notification if username is available - Notification username = GetNotification(Intents.COPY_USERNAME, Resource.String.copy_username, entryName); - username.DeleteIntent = createDeleteIntent(1); + Notification username = GetNotification(Intents.COPY_USERNAME, Resource.String.copy_username, Resource.Drawable.notify, entryName); + username.DeleteIntent = createDeleteIntent(NOTIFY_USERNAME); mNumElementsToWaitFor++; mNM.Notify(NOTIFY_USERNAME, username); } + //keyboard + if (makeAccessibleForKeyboard(entry)) + { + // only show notification if username is available + Notification keyboard = GetNotification(Intents.CHECK_KEYBOARD, Resource.String.available_through_keyboard, Resource.Drawable.notify_keyboard, entryName); + keyboard.DeleteIntent = createDeleteIntent(NOTIFY_KEYBOARD); + mNumElementsToWaitFor++; + mNM.Notify(NOTIFY_KEYBOARD, keyboard); + } + if (mNumElementsToWaitFor == 0) { StopSelf(); @@ -177,6 +195,7 @@ namespace keepass2android IntentFilter filter = new IntentFilter(); filter.AddAction(Intents.COPY_USERNAME); filter.AddAction(Intents.COPY_PASSWORD); + filter.AddAction(Intents.CHECK_KEYBOARD); RegisterReceiver(mCopyToClipBroadcastReceiver, filter); //register receiver to get notified when notifications are discarded in which case we can shutdown the service @@ -186,15 +205,72 @@ namespace keepass2android RegisterReceiver(mNotificationDeletedBroadcastReceiver, deletefilter); } - public void OnWaitElementDeleted() + bool makeAccessibleForKeyboard(PwEntry entry) + { + bool hasData = false; + Keepass2android.Kbbridge.KeyboardDataBuilder kbdataBuilder = new Keepass2android.Kbbridge.KeyboardDataBuilder(); + + String[] keys = {PwDefs.UserNameField, + PwDefs.PasswordField, + PwDefs.UrlField, + PwDefs.NotesField, + PwDefs.TitleField + }; + int[] resIds = {Resource.String.entry_user_name, + Resource.String.entry_password, + Resource.String.entry_url, + Resource.String.entry_comment, + Resource.String.entry_title }; + + //add standard fields: + int i=0; + foreach (string key in keys) + { + String value = entry.Strings.ReadSafe(key); + if (value.Length > 0) + { + kbdataBuilder.AddPair(GetString(resIds[i]), value); + hasData = true; + } + i++; + } + //add additional fields: + foreach (var pair in entry.Strings) + { + String key = pair.Key; + + if (!PwDefs.IsStandardField(key)) { + kbdataBuilder.AddPair(pair.Key, entry.Strings.ReadSafe(pair.Key)); + } + } + + + kbdataBuilder.Commit(); + Keepass2android.Kbbridge.KeyboardData.EntryName = entry.Strings.ReadSafe(PwDefs.TitleField); + + return hasData; + + } + + public void OnWaitElementDeleted(int itemId) { mNumElementsToWaitFor--; if (mNumElementsToWaitFor <= 0) { StopSelf(); } + if (itemId == NOTIFY_KEYBOARD) + { + //keyboard notification was deleted -> clear entries in keyboard + clearKeyboard(); + } } + void clearKeyboard() + { + Keepass2android.Kbbridge.KeyboardData.AvailableFields.Clear(); + Keepass2android.Kbbridge.KeyboardData.EntryName = null; + } private Timer mTimer = new Timer(); @@ -227,7 +303,7 @@ namespace keepass2android public override void Run() { String currentClip = Util.getClipboard(mService); - handler.Post( () => { mService.OnWaitElementDeleted(); }); + handler.Post( () => { mService.OnWaitElementDeleted(CLEAR_CLIPBOARD); }); if ( currentClip.Equals(mClearText) ) { Util.copyToClipboard(mService, ""); handler.Post( () => { @@ -241,7 +317,7 @@ namespace keepass2android // Setup to allow the toast to happen in the foreground Handler uiThreadCallback = new Handler(); - private Notification GetNotification(String intentText, int descResId, String entryName) { + private Notification GetNotification(String intentText, int descResId, int drawableResId, String entryName) { String desc = GetString(descResId); String title = GetString(Resource.String.app_name); @@ -249,10 +325,10 @@ namespace keepass2android title += " (" + entryName +")"; - Notification notify = new Notification(Resource.Drawable.notify, desc, Java.Lang.JavaSystem.CurrentTimeMillis()); + Notification notify = new Notification(drawableResId, desc, Java.Lang.JavaSystem.CurrentTimeMillis()); Intent intent = new Intent(intentText); - PendingIntent pending = PendingIntent.GetBroadcast(this, 0, intent, PendingIntentFlags.CancelCurrent); + PendingIntent pending = PendingIntent.GetBroadcast(this, descResId, intent, PendingIntentFlags.CancelCurrent); notify.SetLatestEventInfo(this, title, desc, pending); @@ -273,19 +349,57 @@ namespace keepass2android PwEntry mEntry; - public override void OnReceive(Context context, Intent intent) { + public override void OnReceive(Context context, Intent intent) + { String action = intent.Action; - if ( action.Equals(Intents.COPY_USERNAME) ) { - String username = mEntry.Strings.ReadSafe (PwDefs.UserNameField); - if ( username.Length > 0 ) { + if (action.Equals(Intents.COPY_USERNAME)) + { + String username = mEntry.Strings.ReadSafe(PwDefs.UserNameField); + if (username.Length > 0) + { mService.timeoutCopyToClipboard(username); } - } else if ( action.Equals(Intents.COPY_PASSWORD) ) { + } else if (action.Equals(Intents.COPY_PASSWORD)) + { String password = mEntry.Strings.ReadSafe(PwDefs.PasswordField); - if ( password.Length > 0 ) { + if (password.Length > 0) + { mService.timeoutCopyToClipboard(password); } + } else if (action.Equals(Intents.CHECK_KEYBOARD)) + { + string currentIme = Android.Provider.Settings.Secure.GetString( + mService.ContentResolver, + Android.Provider.Settings.Secure.DefaultInputMethod); + + string kp2aIme = mService.PackageName+"/keepass2android.softkeyboard.KP2AKeyboard"; + + InputMethodManager imeManager = (InputMethodManager)mService.ApplicationContext.GetSystemService(Context.InputMethodService); + + if (currentIme == kp2aIme) + { + imeManager.ToggleSoftInput(ShowSoftInputFlags.Explicit, HideSoftInputFlags.None); + return; + } + + IList inputMethodProperties = imeManager.EnabledInputMethodList; + + if (!inputMethodProperties.Any(imi => imi.Id.Equals(kp2aIme))) + { + Toast.MakeText(mService, Resource.String.please_activate_keyboard, ToastLength.Long).Show(); + Intent settingsIntent = new Intent(Android.Provider.Settings.ActionInputMethodSettings); + settingsIntent.SetFlags(ActivityFlags.NewTask); + mService.StartActivity(settingsIntent); + } + else + { + if (imeManager != null) { + imeManager.ShowInputMethodPicker(); + } else { + Toast.MakeText(mService, Resource.String.not_possible_im_picker, ToastLength.Long).Show(); + } + } } } }; @@ -303,7 +417,7 @@ namespace keepass2android { if (intent.Action == CopyToClipboardService.ACTION_NOTIFICATION_CANCELLED) { - mService.OnWaitElementDeleted(); + mService.OnWaitElementDeleted(intent.Extras.GetInt("requestCode")); } } #endregion