From f736d9d676b7a99016f54362281c472c2847ccef Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Fri, 26 Apr 2013 10:10:46 +0200 Subject: [PATCH] Upgrade to ICS style Database name can be set through DB prefs QuickUnlock screen shows database name instead of file name (if a name exists) EntryEditActivity: removed bugs related to activity state (occured when using file picker/password generator after making changes in the entry) Added KeeValueTest as test project for UI problems --- src/KeePass.sln | 20 + src/KeyValueTest/Activity1.cs | 95 ++ src/KeyValueTest/Assets/AboutAssets.txt | 19 + src/KeyValueTest/EntrySection.cs | 75 + src/KeyValueTest/KeyValueTest.csproj | 69 + src/KeyValueTest/Properties/AssemblyInfo.cs | 28 + src/KeyValueTest/Resources/AboutResources.txt | 44 + .../Resources/Resource.designer.cs | 109 ++ src/KeyValueTest/Resources/drawable/Icon.png | Bin 0 -> 2574 bytes .../Resources/layout-v14/Main.axml | 12 + .../Resources/layout-v14/entry_section.xml | 17 + src/KeyValueTest/Resources/layout/Main.axml | 49 + .../Resources/layout/entry_section.xml | 18 + src/KeyValueTest/Resources/values/Strings.xml | 5 + src/keepass2android/EntryActivity.cs | 241 +-- src/keepass2android/EntryEditActivity.cs | 658 +++++--- src/keepass2android/EntryEditActivityState.cs | 37 + .../GeneratePasswordActivity.cs | 4 +- src/keepass2android/PasswordActivity.cs | 4 +- src/keepass2android/QuickUnlock.cs | 9 +- .../Resources/Resource.designer.cs | 1458 +++++++++-------- .../drawable-hdpi/collections_collection.png | Bin 0 -> 1604 bytes .../drawable-hdpi/collections_new_label.png | Bin 0 -> 1995 bytes .../device_access_not_secure.png | Bin 0 -> 1542 bytes .../ic_menu_remove_field_holo_light.png | Bin 0 -> 1157 bytes .../drawable-hdpi/location_web_site.png | Bin 0 -> 3291 bytes .../drawable-ldpi/collections_collection.png | Bin 0 -> 1307 bytes .../drawable-ldpi/collections_new_label.png | Bin 0 -> 1427 bytes .../device_access_not_secure.png | Bin 0 -> 1269 bytes .../ic_menu_remove_field_holo_light.png | Bin 0 -> 433 bytes .../drawable-ldpi/location_web_site.png | Bin 0 -> 1827 bytes .../drawable-mdpi/collections_collection.png | Bin 0 -> 1443 bytes .../drawable-mdpi/collections_new_label.png | Bin 0 -> 1667 bytes .../device_access_not_secure.png | Bin 0 -> 1269 bytes .../drawable-mdpi/location_web_site.png | Bin 0 -> 2529 bytes .../Resources/drawable/btn_new_group.png | Bin 714 -> 785 bytes .../Resources/drawable/btn_new_group_dark.png | Bin 713 -> 846 bytes .../drawable/collections_collection.png | Bin 0 -> 1604 bytes .../drawable/collections_new_label.png | Bin 0 -> 1667 bytes .../drawable/device_access_new_account.png | Bin 1656 -> 1034 bytes .../drawable/device_access_not_secure.png | Bin 0 -> 785 bytes .../Resources/drawable/ic_launcher_gray.png | Bin 1379 -> 959 bytes .../drawable/ic_menu_add_field_holo_light.png | Bin 0 -> 1354 bytes .../ic_menu_remove_field_holo_light.png | Bin 0 -> 703 bytes .../Resources/drawable/location_web_site.png | Bin 0 -> 3291 bytes .../Resources/drawable/navigation_cancel.png | Bin 0 -> 1202 bytes .../Resources/drawable/section_header.xml | 2 +- .../layout-v14/QuickUnlock_Unused.xml | 70 + .../{layout-v11 => layout-v14}/SaveButton.xml | 2 +- .../{layout-v11 => layout-v14}/entry_edit.xml | 410 +++-- .../layout-v14/entry_edit_section.xml | 35 + .../{layout-v11 => layout-v14}/entry_view.xml | 5 +- .../entry_view_contents.xml | 353 ++-- .../layout-v14/generate_password.xml | 174 ++ .../group_add_entry.xml | 53 +- .../Resources/layout-v14/icon_picker.xml | 30 + .../Resources/layout-v14/password.xml | 106 ++ .../Resources/layout/InViewButton.xml | 13 + .../Resources/layout/entry_edit.xml | 3 +- .../Resources/layout/entry_edit_section.xml | 4 +- .../layout/entry_extrastring_title.xml | 7 + .../layout/entry_extrastring_value.xml | 8 + .../Resources/layout/entry_section.xml | 1 - .../Resources/layout/entry_view_test.xml | 12 + .../Resources/layout/file_selection.xml | 48 +- .../layout/file_selection_buttons.xml | 34 + .../layout/file_selection_filename.xml | 38 +- .../layout/file_selection_no_recent.xml | 61 +- .../Resources/values-v11/styles.xml | 51 - .../{values-v11 => values-v14}/colors.xml | 54 +- .../Resources/values-v14/styles.xml | 156 ++ .../Resources/values/config.xml | 3 +- .../Resources/values/strings.xml | 1 + .../Resources/values/styles.xml | 3 +- .../Resources/xml/preferences.xml | 5 + src/keepass2android/ShareUrlResults.cs | 3 +- src/keepass2android/Utils/Util.cs | 4 +- src/keepass2android/app/App.cs | 4 + .../fileselect/FileSelectActivity.cs | 351 ++-- src/keepass2android/intents/Intents.cs | 5 +- src/keepass2android/keepass2android.csproj | 73 +- src/keepass2android/search/SearchActivity.cs | 4 +- src/keepass2android/search/SearchResults.cs | 4 +- .../settings/AppSettingsActivity.cs | 26 + src/keepass2android/views/EntryEditSection.cs | 19 +- src/keepass2android/views/EntrySection.cs | 5 + .../{FileNameView.cs => FileSelectButtons.cs} | 161 +- .../views/GroupViewOnlyView.cs | 2 + 88 files changed, 3385 insertions(+), 1989 deletions(-) create mode 100644 src/KeyValueTest/Activity1.cs create mode 100644 src/KeyValueTest/Assets/AboutAssets.txt create mode 100644 src/KeyValueTest/EntrySection.cs create mode 100644 src/KeyValueTest/KeyValueTest.csproj create mode 100644 src/KeyValueTest/Properties/AssemblyInfo.cs create mode 100644 src/KeyValueTest/Resources/AboutResources.txt create mode 100644 src/KeyValueTest/Resources/Resource.designer.cs create mode 100644 src/KeyValueTest/Resources/drawable/Icon.png create mode 100644 src/KeyValueTest/Resources/layout-v14/Main.axml create mode 100644 src/KeyValueTest/Resources/layout-v14/entry_section.xml create mode 100644 src/KeyValueTest/Resources/layout/Main.axml create mode 100644 src/KeyValueTest/Resources/layout/entry_section.xml create mode 100644 src/KeyValueTest/Resources/values/Strings.xml create mode 100644 src/keepass2android/EntryEditActivityState.cs create mode 100644 src/keepass2android/Resources/drawable-hdpi/collections_collection.png create mode 100644 src/keepass2android/Resources/drawable-hdpi/collections_new_label.png create mode 100644 src/keepass2android/Resources/drawable-hdpi/device_access_not_secure.png create mode 100644 src/keepass2android/Resources/drawable-hdpi/ic_menu_remove_field_holo_light.png create mode 100644 src/keepass2android/Resources/drawable-hdpi/location_web_site.png create mode 100644 src/keepass2android/Resources/drawable-ldpi/collections_collection.png create mode 100644 src/keepass2android/Resources/drawable-ldpi/collections_new_label.png create mode 100644 src/keepass2android/Resources/drawable-ldpi/device_access_not_secure.png create mode 100644 src/keepass2android/Resources/drawable-ldpi/ic_menu_remove_field_holo_light.png create mode 100644 src/keepass2android/Resources/drawable-ldpi/location_web_site.png create mode 100644 src/keepass2android/Resources/drawable-mdpi/collections_collection.png create mode 100644 src/keepass2android/Resources/drawable-mdpi/collections_new_label.png create mode 100644 src/keepass2android/Resources/drawable-mdpi/device_access_not_secure.png create mode 100644 src/keepass2android/Resources/drawable-mdpi/location_web_site.png create mode 100644 src/keepass2android/Resources/drawable/collections_collection.png create mode 100644 src/keepass2android/Resources/drawable/collections_new_label.png create mode 100644 src/keepass2android/Resources/drawable/device_access_not_secure.png create mode 100644 src/keepass2android/Resources/drawable/ic_menu_add_field_holo_light.png create mode 100644 src/keepass2android/Resources/drawable/ic_menu_remove_field_holo_light.png create mode 100644 src/keepass2android/Resources/drawable/location_web_site.png create mode 100644 src/keepass2android/Resources/drawable/navigation_cancel.png create mode 100644 src/keepass2android/Resources/layout-v14/QuickUnlock_Unused.xml rename src/keepass2android/Resources/{layout-v11 => layout-v14}/SaveButton.xml (91%) rename src/keepass2android/Resources/{layout-v11 => layout-v14}/entry_edit.xml (66%) create mode 100644 src/keepass2android/Resources/layout-v14/entry_edit_section.xml rename src/keepass2android/Resources/{layout-v11 => layout-v14}/entry_view.xml (93%) rename src/keepass2android/Resources/{layout-v11 => layout-v14}/entry_view_contents.xml (95%) create mode 100644 src/keepass2android/Resources/layout-v14/generate_password.xml rename src/keepass2android/Resources/{layout-v11 => layout-v14}/group_add_entry.xml (70%) create mode 100644 src/keepass2android/Resources/layout-v14/icon_picker.xml create mode 100644 src/keepass2android/Resources/layout-v14/password.xml create mode 100644 src/keepass2android/Resources/layout/InViewButton.xml create mode 100644 src/keepass2android/Resources/layout/entry_extrastring_title.xml create mode 100644 src/keepass2android/Resources/layout/entry_extrastring_value.xml create mode 100644 src/keepass2android/Resources/layout/entry_view_test.xml create mode 100644 src/keepass2android/Resources/layout/file_selection_buttons.xml delete mode 100644 src/keepass2android/Resources/values-v11/styles.xml rename src/keepass2android/Resources/{values-v11 => values-v14}/colors.xml (86%) create mode 100644 src/keepass2android/Resources/values-v14/styles.xml rename src/keepass2android/views/{FileNameView.cs => FileSelectButtons.cs} (75%) diff --git a/src/KeePass.sln b/src/KeePass.sln index 4ef49e95..7d5fcdce 100644 --- a/src/KeePass.sln +++ b/src/KeePass.sln @@ -5,6 +5,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePassLib2Android", "KeePa EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "keepass2android", "keepass2android\keepass2android.csproj", "{A6CF8A86-37C1-4197-80FE-519DE2C842F5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeyValueTest", "KeyValueTest\KeyValueTest.csproj", "{70F00DF9-6CC8-40A7-BF27-A7B8D724891E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -36,6 +38,24 @@ Global {545B4A6B-8BBA-4FBE-92FC-4AC060122A54}.Release|x64.Build.0 = Release|Any CPU {545B4A6B-8BBA-4FBE-92FC-4AC060122A54}.ReleaseNoNet|Any CPU.ActiveCfg = ReleaseNoNet|Any CPU {545B4A6B-8BBA-4FBE-92FC-4AC060122A54}.ReleaseNoNet|Any CPU.Build.0 = ReleaseNoNet|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Debug|Win32.ActiveCfg = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Debug|Win32.Build.0 = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Debug|x64.ActiveCfg = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Debug|x64.Build.0 = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Release|Any CPU.Build.0 = Release|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Release|Win32.ActiveCfg = Release|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Release|Win32.Build.0 = Release|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Release|x64.ActiveCfg = Release|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.Release|x64.Build.0 = Release|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.ReleaseNoNet|Any CPU.ActiveCfg = Debug|Any CPU + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E}.ReleaseNoNet|Any CPU.Build.0 = Debug|Any CPU {A6CF8A86-37C1-4197-80FE-519DE2C842F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A6CF8A86-37C1-4197-80FE-519DE2C842F5}.Debug|Any CPU.Build.0 = Debug|Any CPU {A6CF8A86-37C1-4197-80FE-519DE2C842F5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU diff --git a/src/KeyValueTest/Activity1.cs b/src/KeyValueTest/Activity1.cs new file mode 100644 index 00000000..dbeb6607 --- /dev/null +++ b/src/KeyValueTest/Activity1.cs @@ -0,0 +1,95 @@ +using System; + +using Android.App; +using Android.Content; +using Android.Runtime; +using Android.Views; +using Android.Widget; +using Android.OS; + +namespace KeyValueTest +{ + [Activity (Label = "KeyValueTest", MainLauncher = true)] + public class Activity1 : Activity + { + string className = null; + string ClassName + { + get { + if (className == null) + className = this.GetType().Name; + return className; + } + } + + protected override void OnResume() + { + base.OnResume(); + Android.Util.Log.Debug("DEBUG",ClassName+".OnResume"); + } + + protected override void OnStart() + { + base.OnStart(); + Android.Util.Log.Debug("DEBUG",ClassName+".OnStart"); + } + + + protected override void OnDestroy() + { + base.OnDestroy(); + Android.Util.Log.Debug("DEBUG",ClassName+".OnDestroy"+IsFinishing.ToString()); + } + + protected override void OnPause() + { + base.OnPause(); + Android.Util.Log.Debug("DEBUG",ClassName+".OnPause"); + } + + protected override void OnStop() + { + base.OnStop(); + Android.Util.Log.Debug("DEBUG",ClassName+".OnStop"); + } + + View CreateView(string key, string value) + { + LinearLayout layout = new LinearLayout(this, null); + layout.Orientation = Orientation.Vertical; + layout.LayoutParameters = new ViewGroup.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent); + TextView keyView = new TextView(this); + if (key != null) + keyView.Text = key; + layout.AddView(keyView); + TextView valueView = new TextView(this); + if (value != null) + valueView.Text = value; + valueView.SetTextIsSelectable(true); + layout.AddView(valueView); + return layout; + } + + protected override void OnCreate(Bundle bundle) + { + Android.Util.Log.Debug("DEBUG", ClassName + ".OnCreate"); + base.OnCreate(bundle); + + // Set our view from the "main" layout resource + SetContentView(Resource.Layout.Main); + + + + + FindViewById(Resource.Id.extra_strings).AddView(CreateView("key1","value1")); + + FindViewById(Resource.Id.extra_strings).AddView(CreateView("key2","value2")); + FindViewById(Resource.Id.extra_strings).AddView(CreateView("key3","value3")); + + + + } + } +} + + diff --git a/src/KeyValueTest/Assets/AboutAssets.txt b/src/KeyValueTest/Assets/AboutAssets.txt new file mode 100644 index 00000000..72f5729a --- /dev/null +++ b/src/KeyValueTest/Assets/AboutAssets.txt @@ -0,0 +1,19 @@ +Any raw assets you want to be deployed with your application can be placed in +this directory (and child directories) and given a Build Action of "AndroidAsset". + +These files will be deployed with you package and will be accessible using Android's +AssetManager, like this: + +public class ReadAsset : Activity +{ + protected override void OnCreate (Bundle bundle) + { + base.OnCreate (bundle); + + InputStream input = Assets.Open ("my_asset.txt"); + } +} + +Additionally, some Android functions will automatically load asset files: + +Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); \ No newline at end of file diff --git a/src/KeyValueTest/EntrySection.cs b/src/KeyValueTest/EntrySection.cs new file mode 100644 index 00000000..5927c085 --- /dev/null +++ b/src/KeyValueTest/EntrySection.cs @@ -0,0 +1,75 @@ +/* +This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file is based on Keepassdroid, Copyright Brian Pellin. + + Keepass2Android is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + Keepass2Android is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Keepass2Android. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Android.App; +using Android.Content; +using Android.OS; +using Android.Runtime; +using Android.Views; +using Android.Widget; +using Android.Util; + +namespace KeyValueTest +{ + + public class EntrySection : LinearLayout { + + public EntrySection(Context context): base(context, null) { + inflate (context,null, null); + } + + public EntrySection(Context context, IAttributeSet attrs): base(context, attrs) { + inflate (context,null, null); + } + + public EntrySection(Context context, IAttributeSet attrs, String title, String value): base(context, attrs) { + + inflate(context, title, value); + } + + public EntrySection (IntPtr javaReference, JniHandleOwnership transfer) + : base(javaReference, transfer) + { + + } + + + private void inflate(Context context, String title, String value) { + LayoutInflater inflater = (LayoutInflater) Context.GetSystemService(Context.LayoutInflaterService); + inflater.Inflate(Resource.Layout.entry_section, this); + + setText(Resource.Id.title, title); + setText(Resource.Id.value, value); + } + + private void setText(int resId, String str) { + if (str != null) { + TextView tvTitle = (TextView) FindViewById(resId); + tvTitle.Text = str; + Android.Util.Log.Debug("DEBUG", "Setting " + resId+"=" + str); + } + + } + } + +} + diff --git a/src/KeyValueTest/KeyValueTest.csproj b/src/KeyValueTest/KeyValueTest.csproj new file mode 100644 index 00000000..3545540b --- /dev/null +++ b/src/KeyValueTest/KeyValueTest.csproj @@ -0,0 +1,69 @@ + + + + Debug + AnyCPU + 10.0.0 + 2.0 + {70F00DF9-6CC8-40A7-BF27-A7B8D724891E} + {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + KeyValueTest + Resources + Assets + Resource + True + Resources\Resource.designer.cs + KeyValueTest + v4.0 + + + True + full + False + bin\Debug + DEBUG; + prompt + 4 + False + None + + + none + True + bin\Release + prompt + 4 + False + False + SdkOnly + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/KeyValueTest/Properties/AssemblyInfo.cs b/src/KeyValueTest/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..9ca46797 --- /dev/null +++ b/src/KeyValueTest/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("KeyValueTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("crocoll")] +[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/KeyValueTest/Resources/AboutResources.txt b/src/KeyValueTest/Resources/AboutResources.txt new file mode 100644 index 00000000..54c2267a --- /dev/null +++ b/src/KeyValueTest/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/KeyValueTest/Resources/Resource.designer.cs b/src/KeyValueTest/Resources/Resource.designer.cs new file mode 100644 index 00000000..5cdc7008 --- /dev/null +++ b/src/KeyValueTest/Resources/Resource.designer.cs @@ -0,0 +1,109 @@ +#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("KeyValueTest.Resource", IsApplication=true)] + +namespace KeyValueTest +{ + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Novell.MonoDroid.Build.Tasks", "1.0.0.0")] + public partial class Resource + { + + public static void UpdateIdValues() + { + } + + public partial class Attribute + { + + private Attribute() + { + } + } + + public partial class Drawable + { + + // aapt resource value: 0x7f020000 + public const int Icon = 2130837504; + + private Drawable() + { + } + } + + public partial class Id + { + + // aapt resource value: 0x7f050003 + public const int bottom_bar = 2131034115; + + // aapt resource value: 0x7f050007 + public const int entry_contents = 2131034119; + + // aapt resource value: 0x7f050005 + public const int entry_divider2 = 2131034117; + + // aapt resource value: 0x7f050004 + public const int entry_edit = 2131034116; + + // aapt resource value: 0x7f050006 + public const int entry_scroll = 2131034118; + + // aapt resource value: 0x7f050008 + public const int extra_strings = 2131034120; + + // aapt resource value: 0x7f050000 + public const int title = 2131034112; + + // aapt resource value: 0x7f050002 + public const int top = 2131034114; + + // aapt resource value: 0x7f050001 + public const int value = 2131034113; + + private Id() + { + } + } + + public partial class Layout + { + + // aapt resource value: 0x7f030000 + public const int entry_section = 2130903040; + + // aapt resource value: 0x7f030001 + public const int Main = 2130903041; + + private Layout() + { + } + } + + public partial class String + { + + // aapt resource value: 0x7f040001 + public const int app_name = 2130968577; + + // aapt resource value: 0x7f040000 + public const int hello = 2130968576; + + private String() + { + } + } + } +} +#pragma warning restore 1591 diff --git a/src/KeyValueTest/Resources/drawable/Icon.png b/src/KeyValueTest/Resources/drawable/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a07c69fa5a0f4da5d5efe96eea12a543154dbab6 GIT binary patch literal 2574 zcmV+p3i0)cP)Q`Og{P|8RRXpj5bgrSmEzSMfBn+{{vpNxw?;5UX;iv9sYxy_`IQHs$i<61a_iv^L>h8s-`D(`e@|IgS*Fj zNGM876Gf;3D8*1UX9a%v>yJKD*QkCwW2AirU(L{qNA)JghmGItc;(H<$!ABY&gBy1vJIEUj-b8%el*o|VkG)LqNx#TG>Jvj^jIte!!+RY z)T4j$7+PoF1AkRBf}R#^T=-q|PaK1$c<4UH)Hpq3$4WA|xtr!ZQLC=*vNE>O6E9kp+5X0eKB$6>C(lPwI@3#oY zhS_%x7e|j!$yG?ECXmh~EH~^OeuK}+sWoJse3Z3?ha3n`MM9KvA?uqpEnBg4Q46)7 zM$p%a$@l;+O}vfvx%XjH`}a{(-HHth9!JaUwV0*VqGR48^gWNYN<&~7x)y$e!X>e` zZ5!6KZoxbKuV9XUDI%#M1~IVh?pNSdeb~6@$y`v|yk=XK+fHxnDqnUK4&=QRNyIVf zYbDM*cI>~qIy*a7=z7uqkw@agd(<=y-Q7L!ty_23SGdXmahO<;N=wB+j;lNm%=OHC zy zU|>La6h%92y4IPufI$9>Xu!@y`TaNgtg&41@PwMwBdmSm7)xAWDLoqjZ==P2#*k7! z3o1)cVSI3KP_!?d8G^Lg0FtLXC~JYdxi|c%h~lXEixY=%VSFF@!*3&&9>(Rb|iK54Cx5;s~PY5iaV1het%w`dgQFBAJ;aFK zImQC}(|QaCFYUm1JVfzSc)ebv=)ObI)0jwJb``}Zj9J0n0Xgn*Zc(rFM9$xh_makZbm-at_v5^SW zM1y1SW@%+FuIy*WR)i3A2N_q;(YO`O!A|Ts^%z}9ZepCj3ytlw#x%N_fNrKKtPh`< z|1{UqF`4LxHaCQ79+E=uUXCOZ35jAMRz%R%0(P!0FMv=sk>Nr8%+OzY^c-M9@+fz=G`qa@v4sF5u-2289-#$**LWnyNNDwDf1( zkUiMnw|y$tn>pQP=Vn!#|17L^5AGrjtBkN$D@v)Z7LXc5EFhLB4<;7Wehh)CMqX|W zqsiZaO^benJ_hwa&V0ub$-_HUk**?g6fm9|!@kguU6*zhK)$qn-<3*kFrYPIaqR=V zUaUvk>@F_89b@tHs8R!*QKY;INJ<2_U+K6Ca3e9Gsl2{qY0%a7J?uICWgHuLfj+MB z=GkAN1&ifT#2u}B+2S#~$5jA(Qn^;H%CCmIae4AE-Dsng|Hl*Ov!z72k3ZnJs{pp| z+pW`DDueC#mEWOf=ucJ!dTL}hzOeiS-i?m2E;`EKz4<&Lu~NnW?peqVU^@<+T3KKu z{yrI%Qy-Z%HEvLUz}n^~m?7x`xuCtNR#L2En!T>dQtIKdS#V-Hzt3RtwTeYtmQ&dR z6qXZvac*oc@BUYEH%@Ylv_1&tSjkbzzU6*h1(3^C`;1z;g_SmOtclS?KWk2VYE zM*oS<=C483XckW?GN|1jfh3Ro(h + + + + \ No newline at end of file diff --git a/src/KeyValueTest/Resources/layout-v14/entry_section.xml b/src/KeyValueTest/Resources/layout-v14/entry_section.xml new file mode 100644 index 00000000..c1ef4333 --- /dev/null +++ b/src/KeyValueTest/Resources/layout-v14/entry_section.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/src/KeyValueTest/Resources/layout/Main.axml b/src/KeyValueTest/Resources/layout/Main.axml new file mode 100644 index 00000000..c17b3e4d --- /dev/null +++ b/src/KeyValueTest/Resources/layout/Main.axml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/KeyValueTest/Resources/layout/entry_section.xml b/src/KeyValueTest/Resources/layout/entry_section.xml new file mode 100644 index 00000000..fbb506dc --- /dev/null +++ b/src/KeyValueTest/Resources/layout/entry_section.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/src/KeyValueTest/Resources/values/Strings.xml b/src/KeyValueTest/Resources/values/Strings.xml new file mode 100644 index 00000000..94b78440 --- /dev/null +++ b/src/KeyValueTest/Resources/values/Strings.xml @@ -0,0 +1,5 @@ + + + Hello World, Click Me! + KeyValueTest + diff --git a/src/keepass2android/EntryActivity.cs b/src/keepass2android/EntryActivity.cs index 02ac7f39..8530299e 100644 --- a/src/keepass2android/EntryActivity.cs +++ b/src/keepass2android/EntryActivity.cs @@ -38,6 +38,7 @@ using Android.Content.PM; using KeePassLib.Security; using keepass2android.view; using Android.Webkit; +using Android.Graphics; namespace keepass2android { @@ -46,11 +47,11 @@ namespace keepass2android public const String KEY_ENTRY = "entry"; public const String KEY_REFRESH_POS = "refresh_pos"; public const String KEY_CLOSE_AFTER_CREATE = "close_after_create"; - + public static void Launch(Activity act, PwEntry pw, int pos) { Launch(act, pw, pos, false); } - + public static void Launch(Activity act, PwEntry pw, int pos, bool closeAfterCreate) { Intent i; @@ -63,14 +64,14 @@ namespace keepass2android act.StartActivityForResult(i,0); } - + protected PwEntry mEntry; - + private bool mShowPassword; private int mPos; - - + + protected void setEntryView() { SetContentView(Resource.Layout.entry_view); } @@ -78,28 +79,28 @@ namespace keepass2android protected void setupEditButtons() { View edit = FindViewById(Resource.Id.entry_edit); edit.Click += (sender, e) => { - EntryEditActivity.Launch(this, mEntry); + EntryEditActivity.Launch(this, mEntry); }; } protected override void OnCreate(Bundle savedInstanceState) { ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this); - + long usageCount = prefs.GetLong(GetString(Resource.String.UsageCount_key), 0); - + ISharedPreferencesEditor edit = prefs.Edit(); edit.PutLong(GetString(Resource.String.UsageCount_key), usageCount+1); EditorCompat.apply(edit); - + mShowPassword = ! prefs.GetBoolean(GetString(Resource.String.maskpass_key), Resources.GetBoolean(Resource.Boolean.maskpass_default)); base.OnCreate(savedInstanceState); setEntryView(); Context appCtx = ApplicationContext; - - + + Database db = App.getDB(); // Likely the app has been killed exit the activity if (! db.Loaded) @@ -113,11 +114,11 @@ namespace keepass2android Intent i = Intent; PwUuid uuid = new PwUuid(MemUtil.HexStringToByteArray(i.GetStringExtra(KEY_ENTRY))); mPos = i.GetIntExtra(KEY_REFRESH_POS, -1); - + bool closeAfterCreate = i.GetBooleanExtra(KEY_CLOSE_AFTER_CREATE, false); - + mEntry = db.entries [uuid]; - + // Refresh Menu contents in case onCreateMenuOptions was called before mEntry was set @@ -141,26 +142,26 @@ namespace keepass2android fillData(false); setupEditButtons(); - + Intent showNotIntent = new Intent(this, typeof(CopyToClipboardService)); Intent.SetAction(Intents.SHOW_NOTIFICATION); showNotIntent.PutExtra(KEY_ENTRY, mEntry.Uuid.ToHexString()); - + StartService(showNotIntent); - + Android.Util.Log.Debug("DEBUG", "Requesting copy to clipboard for Uuid=" + mEntry.Uuid.ToHexString()); - + /*foreach (PwUuid key in App.getDB().entries.Keys) { Android.Util.Log.Debug("DEBUG",key.ToHexString() + " -> " + App.getDB().entries[key].Uuid.ToHexString()); }*/ - + if (closeAfterCreate) { Finish(); } } - + private class AfterSave : OnFinish { public AfterSave(Handler handler):base(handler) { @@ -168,18 +169,18 @@ namespace keepass2android } public override void run() { - + base.run(); } }; - + private String getDateTime(System.DateTime dt) { return dt.ToString ("g", CultureInfo.CurrentUICulture); } - + String concatTags(List tags) { StringBuilder sb = new StringBuilder(); @@ -192,7 +193,7 @@ namespace keepass2android sb.Remove(sb.Length-2,2); return sb.ToString(); } - + void populateExtraStrings(bool trimList) { ViewGroup extraGroup = (ViewGroup)FindViewById(Resource.Id.extra_strings); @@ -206,7 +207,8 @@ namespace keepass2android String key = pair.Key; if (!PwDefs.IsStandardField(key)) { - View view = new EntrySection(this, null, key, pair.Value.ReadString()); + //View view = new EntrySection(this, null, key, pair.Value.ReadString()); + View view = CreateEditSection(key, pair.Value.ReadString()); extraGroup.AddView(view); hasExtraFields = true; } @@ -214,16 +216,38 @@ namespace keepass2android FindViewById(Resource.Id.entry_extra_strings_label).Visibility = hasExtraFields ? ViewStates.Visible : ViewStates.Gone; } + View CreateEditSection(string key, string value) + { + LinearLayout layout = new LinearLayout(this, null); + layout.Orientation = Orientation.Vertical; + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent); + layoutParams.SetMargins(10,0,0,0); + layout.LayoutParameters = layoutParams; + View viewInflated = LayoutInflater.Inflate(Resource.Layout.entry_extrastring_title,null); + TextView keyView = (TextView)viewInflated; + if (key != null) + keyView.Text = key; + + layout.AddView(keyView); + TextView valueView = (TextView)LayoutInflater.Inflate(Resource.Layout.entry_extrastring_value, null); + if (value != null) + valueView.Text = value; + valueView.Typeface = Typeface.Monospace; + valueView.SetTextIsSelectable(true); + layout.AddView(valueView); + return layout; + } + string writeBinaryToFile(string key) { ProtectedBinary pb = mEntry.Binaries.Get(key); System.Diagnostics.Debug.Assert(pb != null); if(pb == null) throw new ArgumentException(); - + ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this); string binaryDirectory = prefs.GetString(GetString(Resource.String.BinaryDirectory_key),GetString(Resource.String.BinaryDirectory_default)); - + var targetFile = new Java.IO.File(binaryDirectory,key); - + Java.IO.File parent = targetFile.ParentFile; if (parent == null || (parent.Exists() && ! parent.IsDirectory)) @@ -247,24 +271,24 @@ namespace keepass2android } } string filename = targetFile.AbsolutePath; - + byte[] pbData = pb.ReadData(); try { System.IO.File.WriteAllBytes(filename, pbData); } catch(Exception exWrite) { Toast.MakeText(this, GetString(Resource.String.SaveAttachment_Failed, new Java.Lang.Object[]{ filename}) - +exWrite.Message,ToastLength.Long).Show(); + +exWrite.Message,ToastLength.Long).Show(); return null; } finally { MemUtil.ZeroByteArray(pbData); } - + return filename; - + } - + void openBinaryFile(string filename) { String theMIMEType = getMimeType(filename); @@ -284,7 +308,7 @@ namespace keepass2android } } } - + void populateBinaries(bool trimList) { ViewGroup binariesGroup = (ViewGroup)FindViewById(Resource.Id.binaries); @@ -303,21 +327,21 @@ namespace keepass2android { Button btnSender = (Button)(sender); string newFilename = writeBinaryToFile(btnSender.Text); - + if (newFilename != null) { Toast.MakeText(this, GetString(Resource.String.SaveAttachment_doneMessage, new Java.Lang.Object[]{newFilename}), ToastLength.Short).Show(); openBinaryFile(newFilename); } - + }; binariesGroup.AddView(binaryButton,layoutParams); - + } FindViewById(Resource.Id.entry_binaries_label).Visibility = mEntry.Binaries.UCount > 0 ? ViewStates.Visible : ViewStates.Gone; } - + // url = file path or whatever suitable URL you want. public static String getMimeType(String url) { @@ -346,6 +370,11 @@ namespace keepass2android button.Click += (object sender, EventArgs e) => { Finish(); }; } + if (ActionBar != null) + { + ActionBar.Title = mEntry.Strings.ReadSafe(PwDefs.TitleField); + ActionBar.SetDisplayHomeAsUpEnabled(true); + } populateText(Resource.Id.entry_user_name, Resource.Id.entry_user_name_label, mEntry.Strings.ReadSafe(PwDefs.UserNameField)); populateText(Resource.Id.entry_url, Resource.Id.entry_url_label, mEntry.Strings.ReadSafe(PwDefs.UrlField)); @@ -364,22 +393,22 @@ namespace keepass2android populateText(Resource.Id.entry_expires, Resource.Id.entry_expires_label, Resource.String.never); } populateText(Resource.Id.entry_comment, Resource.Id.entry_comment_label, mEntry.Strings.ReadSafe(PwDefs.NotesField)); - + populateText(Resource.Id.entry_tags, Resource.Id.entry_tags_label, concatTags(mEntry.Tags)); - + populateText(Resource.Id.entry_override_url, Resource.Id.entry_override_url_label, mEntry.OverrideUrl); - + populateExtraStrings(trimList); - + populateBinaries(trimList); - - + + } private void populateText(int viewId, int headerViewId,int resId) { View header = FindViewById(headerViewId); TextView tv = (TextView)FindViewById(viewId); - + header.Visibility = tv.Visibility = ViewStates.Visible; tv.SetText (resId); } @@ -396,10 +425,10 @@ namespace keepass2android { header.Visibility = tv.Visibility = ViewStates.Visible; tv.Text = text; - + } } - + void requiresRefresh () { Intent ret = new Intent (); @@ -419,7 +448,7 @@ namespace keepass2android public override bool OnCreateOptionsMenu(IMenu menu) { base.OnCreateOptionsMenu(menu); - + MenuInflater inflater = MenuInflater; inflater.Inflate(Resource.Menu.entry, menu); @@ -429,7 +458,7 @@ namespace keepass2android } else { togglePassword.SetTitle(Resource.String.show_password); } - + IMenuItem gotoUrl = menu.FindItem(Resource.Id.menu_goto_url); //Disabled IMenuItem copyUser = menu.FindItem(Resource.Id.menu_copy_user); //Disabled IMenuItem copyPass = menu.FindItem(Resource.Id.menu_copy_pass); @@ -471,7 +500,7 @@ namespace keepass2android public override bool OnOptionsItemSelected(IMenuItem item) { switch ( item.ItemId ) { - /*case Resource.Id.menu_donate: + /*case Resource.Id.menu_donate: try { Util.gotoUrl(this, Resource.String.donate_url); } catch (ActivityNotFoundException) { @@ -480,34 +509,34 @@ namespace keepass2android } return true;*/ - case Resource.Id.menu_toggle_pass: - if ( mShowPassword ) { - item.SetTitle(Resource.String.show_password); - mShowPassword = false; - } else { - item.SetTitle(Resource.String.menu_hide_password); - mShowPassword = true; - } - setPasswordStyle(); - - return true; - - case Resource.Id.menu_goto_url: - String url; - url = mEntry.Strings.ReadSafe (PwDefs.UserNameField); - - // Default http:// if no protocol specified - if ( ! url.Contains("://") ) { - url = "http://" + url; - } - - try { - Util.gotoUrl(this, url); - } catch (ActivityNotFoundException) { - Toast.MakeText(this, Resource.String.no_url_handler, ToastLength.Long).Show(); - } - return true; - /* TODO: required? + case Resource.Id.menu_toggle_pass: + if ( mShowPassword ) { + item.SetTitle(Resource.String.show_password); + mShowPassword = false; + } else { + item.SetTitle(Resource.String.menu_hide_password); + mShowPassword = true; + } + setPasswordStyle(); + + return true; + + case Resource.Id.menu_goto_url: + String url; + url = mEntry.Strings.ReadSafe (PwDefs.UserNameField); + + // Default http:// if no protocol specified + if ( ! url.Contains("://") ) { + url = "http://" + url; + } + + try { + Util.gotoUrl(this, url); + } catch (ActivityNotFoundException) { + Toast.MakeText(this, Resource.String.no_url_handler, ToastLength.Long).Show(); + } + return true; + /* TODO: required? case Resource.Id.menu_copy_user: timeoutCopyToClipboard(mEntry.Strings.ReadSafe (PwDefs.UserNameField)); return true; @@ -516,38 +545,44 @@ namespace keepass2android timeoutCopyToClipboard(mEntry.Strings.ReadSafe (PwDefs.UserNameField)); return true; */ - case Resource.Id.menu_rate: - try { + case Resource.Id.menu_rate: + try { Util.gotoMarket(this); - } catch (ActivityNotFoundException) { - Toast.MakeText(this, Resource.String.no_url_handler, ToastLength.Long).Show(); - } + } catch (ActivityNotFoundException) { + Toast.MakeText(this, Resource.String.no_url_handler, ToastLength.Long).Show(); + } return true; - case Resource.Id.menu_suggest_improvements: - try { + case Resource.Id.menu_suggest_improvements: + try { Util.gotoUrl(this, Resource.String.SuggestionsURL); - } catch (ActivityNotFoundException) { - Toast.MakeText(this, Resource.String.no_url_handler, ToastLength.Long).Show(); - } + } catch (ActivityNotFoundException) { + Toast.MakeText(this, Resource.String.no_url_handler, ToastLength.Long).Show(); + } + return true; + case Resource.Id.menu_lock: + App.setShutdown(); + SetResult(KeePass.EXIT_LOCK); + Finish(); + return true; + case Resource.Id.menu_translate: + try { + Util.gotoUrl(this, Resource.String.TranslationURL); + } catch (ActivityNotFoundException) { + Toast.MakeText(this, Resource.String.no_url_handler, ToastLength.Long).Show(); + } + return true; + case Android.Resource.Id.Home: + //Currently the action bar only displays the home button when we come from a previous activity. + //So we can simply Finish. See this page for information on how to do this in more general (future?) cases: + //http://developer.android.com/training/implementing-navigation/ancestral.html + Finish(); return true; - case Resource.Id.menu_lock: - App.setShutdown(); - SetResult(KeePass.EXIT_LOCK); - Finish(); - return true; - case Resource.Id.menu_translate: - try { - Util.gotoUrl(this, Resource.String.TranslationURL); - } catch (ActivityNotFoundException) { - Toast.MakeText(this, Resource.String.no_url_handler, ToastLength.Long).Show(); - } - return true; } - + return base.OnOptionsItemSelected(item); } } - + } diff --git a/src/keepass2android/EntryEditActivity.cs b/src/keepass2android/EntryEditActivity.cs index 70b249de..bc95ecf3 100644 --- a/src/keepass2android/EntryEditActivity.cs +++ b/src/keepass2android/EntryEditActivity.cs @@ -45,16 +45,14 @@ namespace keepass2android public const int RESULT_OK_ICON_PICKER = (int)Result.FirstUser + 1000; public const int RESULT_OK_PASSWORD_GENERATOR = RESULT_OK_ICON_PICKER + 1; - - private PwEntry mEntry, mEntryInDatabase; - private bool mShowPassword = false; - private bool mIsNew; - private PwIcon mSelectedIconID; - private PwUuid mSelectedCustomIconID = PwUuid.Zero; - private bool mSelectedIcon = false; - bool mEntryModified; - + const string Intent_ContinueWithEditing = "ContinueWithEditing"; + + EntryEditActivityState State + { + get { return App.entryEditActivityState; } + } + public static void Launch(Activity act, PwEntry pw) { Intent i = new Intent(act, typeof(EntryEditActivity)); @@ -73,16 +71,24 @@ namespace keepass2android } private ScrollView scroll; + + bool mCloseForReload; protected override void OnCreate(Bundle savedInstanceState) { - ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this); - mShowPassword = ! prefs.GetBoolean(GetString(Resource.String.maskpass_key), Resources.GetBoolean(Resource.Boolean.maskpass_default)); - base.OnCreate(savedInstanceState); + + if (this.LastNonConfigurationInstance != null) + { + //bug in Mono for Android or whatever: after config change the extra fields are wrong + // -> reload: + reload(); + return; + } + SetContentView(Resource.Layout.entry_edit); - SetResult(KeePass.EXIT_NORMAL); - + mCloseForReload = false; + // Likely the app has been killed exit the activity Database db = App.getDB(); if (! db.Open) @@ -90,26 +96,38 @@ namespace keepass2android Finish(); return; } - - Intent i = Intent; - String uuidBytes = i.GetStringExtra(KEY_ENTRY); - PwUuid entryId = PwUuid.Zero; - if (uuidBytes != null) - entryId = new KeePassLib.PwUuid(MemUtil.HexStringToByteArray(uuidBytes)); - PwGroup parentGroup = null; - if (entryId == PwUuid.Zero) + if (Intent.GetBooleanExtra(Intent_ContinueWithEditing, false)) { - String groupId = i.GetStringExtra(KEY_PARENT); + //property "State" will return the state - parentGroup = db.groups [new PwUuid(MemUtil.HexStringToByteArray(groupId))]; - mEntryInDatabase = new PwEntry(true, true); - mEntryInDatabase.Strings.Set(PwDefs.UserNameField, new ProtectedString( - db.pm.MemoryProtection.ProtectUserName, db.pm.DefaultUserName)); - - /*KPDesktop + } else + { + App.entryEditActivityState = new EntryEditActivityState(); + ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this); + State.mShowPassword = ! prefs.GetBoolean(GetString(Resource.String.maskpass_key), Resources.GetBoolean(Resource.Boolean.maskpass_default)); + + Intent i = Intent; + String uuidBytes = i.GetStringExtra(KEY_ENTRY); + + PwUuid entryId = PwUuid.Zero; + if (uuidBytes != null) + entryId = new KeePassLib.PwUuid(MemUtil.HexStringToByteArray(uuidBytes)); + + State.parentGroup = null; + if (entryId == PwUuid.Zero) + { + String groupId = i.GetStringExtra(KEY_PARENT); + + State.parentGroup = db.groups [new PwUuid(MemUtil.HexStringToByteArray(groupId))]; + + State.mEntryInDatabase = new PwEntry(true, true); + State.mEntryInDatabase.Strings.Set(PwDefs.UserNameField, new ProtectedString( + db.pm.MemoryProtection.ProtectUserName, db.pm.DefaultUserName)); + + /*KPDesktop * ProtectedString psAutoGen; PwGenerator.Generate(out psAutoGen, Program.Config.PasswordGenerator.AutoGeneratedPasswordsProfile, null, Program.PwGeneratorPool); @@ -122,15 +140,15 @@ namespace keepass2android pwe.Expires = true; pwe.ExpiryTime = DateTime.Now.AddDays(nExpireDays); }*/ - - if ((parentGroup.IconId != PwIcon.Folder) && (parentGroup.IconId != PwIcon.FolderOpen) && - (parentGroup.IconId != PwIcon.FolderPackage)) - { - mEntryInDatabase.IconId = parentGroup.IconId; // Inherit icon from group - } - mEntryInDatabase.CustomIconUuid = parentGroup.CustomIconUuid; - - /* + + if ((State.parentGroup.IconId != PwIcon.Folder) && (State.parentGroup.IconId != PwIcon.FolderOpen) && + (State.parentGroup.IconId != PwIcon.FolderPackage)) + { + State.mEntryInDatabase.IconId = State.parentGroup.IconId; // Inherit icon from group + } + State.mEntryInDatabase.CustomIconUuid = State.parentGroup.CustomIconUuid; + + /* * KPDesktop if(strDefaultSeq.Length == 0) { @@ -148,28 +166,43 @@ namespace keepass2android } } }*/ - mIsNew = true; - mEntryModified = true; - - } else - { - - System.Diagnostics.Debug.Assert(entryId != null); - - mEntryInDatabase = db.entries [entryId]; - mIsNew = false; + State.mIsNew = true; + State.mEntryModified = true; + + } else + { + + System.Diagnostics.Debug.Assert(entryId != null); + + State.mEntryInDatabase = db.entries [entryId]; + State.mIsNew = false; + + + } + State.mEntry = State.mEntryInDatabase.CloneDeep(); - } + } + + if (!State.mEntryModified) + SetResult(KeePass.EXIT_NORMAL); + else + SetResult(KeePass.EXIT_REFRESH_TITLE); - mEntry = mEntryInDatabase.CloneDeep(); fillData(); View scrollView = FindViewById(Resource.Id.entry_scroll); scrollView.ScrollBarStyle = ScrollbarStyles.InsideInset; ImageButton iconButton = (ImageButton)FindViewById(Resource.Id.icon_button); + + if (State.mSelectedIcon) + { + //TODO: custom image + iconButton.SetImageResource(Icons.iconToResId(State.mSelectedIconID)); + } iconButton.Click += (sender, evt) => { + UpdateEntryFromUi(State.mEntry); IconPickerActivity.Launch(this); }; @@ -177,7 +210,7 @@ namespace keepass2android // Generate password button Button generatePassword = (Button)FindViewById(Resource.Id.generate_button); generatePassword.Click += (object sender, EventArgs e) => { - + UpdateEntryFromUi(State.mEntry); GeneratePasswordActivity.Launch(this); }; @@ -201,161 +234,14 @@ namespace keepass2android } save.Click += (object sender, EventArgs e) => { - - EntryEditActivity act = this; - - if (!validateBeforeSaving()) - return; + OnFinish onFinish = new AfterSave(new Handler(), this); - PwEntry initialEntry = mEntryInDatabase.CloneDeep(); + SaveEntry(onFinish); - PwEntry newEntry = mEntryInDatabase; - - //Clone history and re-assign: - newEntry.History = newEntry.History.CloneDeep(); - - //Based on KeePass Desktop - bool bCreateBackup = (!mIsNew); - if(bCreateBackup) newEntry.CreateBackup(null); - - if (mSelectedIcon == false) { - if (mIsNew) { - newEntry.IconId = PwIcon.Key; - } else { - // Keep previous icon, if no new one was selected - } - } - else { - newEntry.IconId = mSelectedIconID; - newEntry.CustomIconUuid = mSelectedCustomIconID; - } - /* KPDesktop - if(m_cbCustomForegroundColor.Checked) - newEntry.ForegroundColor = m_clrForeground; - else newEntry.ForegroundColor = Color.Empty; - if(m_cbCustomBackgroundColor.Checked) - newEntry.BackgroundColor = m_clrBackground; - else newEntry.BackgroundColor = Color.Empty; - - */ - - - newEntry.Strings.Set(PwDefs.TitleField, new ProtectedString(db.pm.MemoryProtection.ProtectTitle, - Util.getEditText(act, Resource.Id.entry_title))); - newEntry.Strings.Set(PwDefs.UserNameField, new ProtectedString(db.pm.MemoryProtection.ProtectUserName, - Util.getEditText(act, Resource.Id.entry_user_name))); - - String pass = Util.getEditText(act, Resource.Id.entry_password); - byte[] password = StrUtil.Utf8.GetBytes(pass); - newEntry.Strings.Set(PwDefs.PasswordField, new ProtectedString(db.pm.MemoryProtection.ProtectPassword, - password)); - MemUtil.ZeroByteArray(password); - - newEntry.Strings.Set(PwDefs.UrlField, new ProtectedString(db.pm.MemoryProtection.ProtectUrl, - Util.getEditText(act, Resource.Id.entry_url))); - newEntry.Strings.Set(PwDefs.NotesField, new ProtectedString(db.pm.MemoryProtection.ProtectNotes, - Util.getEditText(act, Resource.Id.entry_comment))); - - // Delete all non standard strings - var keys = newEntry.Strings.GetKeys(); - foreach (String key in keys) - if (PwDefs.IsStandardField(key) == false) - newEntry.Strings.Remove(key); - - LinearLayout container = (LinearLayout) FindViewById(Resource.Id.advanced_container); - - for (int index = 0; index < container.ChildCount; index++) { - View view = container.GetChildAt(index); - - TextView keyView = (TextView)view.FindViewById(Resource.Id.title); - String key = keyView.Text; - - TextView valueView = (TextView)view.FindViewById(Resource.Id.value); - String value = valueView.Text; - - CheckBox cb = (CheckBox)view.FindViewById(Resource.Id.protection); - bool protect = cb.Checked; - - newEntry.Strings.Set(key, new ProtectedString(protect, value)); - } - - newEntry.Binaries = mEntry.Binaries; - newEntry.Expires = mEntry.Expires; - if (newEntry.Expires) - { - newEntry.ExpiryTime = mEntry.ExpiryTime; - } - - newEntry.OverrideUrl = Util.getEditText(this,Resource.Id.entry_override_url); - - List vNewTags = StrUtil.StringToTags(Util.getEditText(this,Resource.Id.entry_tags)); - newEntry.Tags.Clear(); - foreach(string strTag in vNewTags) newEntry.AddTag(strTag); - - /*KPDesktop - - - m_atConfig.Enabled = m_cbAutoTypeEnabled.Checked; - m_atConfig.ObfuscationOptions = (m_cbAutoTypeObfuscation.Checked ? - AutoTypeObfuscationOptions.UseClipboard : - AutoTypeObfuscationOptions.None); - - SaveDefaultSeq(); - - newEntry.AutoType = m_atConfig; - */ - - - newEntry.Touch(true, false); // Touch *after* backup - - StrUtil.NormalizeNewLines(newEntry.Strings, true); - - bool bUndoBackup = false; - PwCompareOptions cmpOpt = (PwCompareOptions.NullEmptyEquivStd | - PwCompareOptions.IgnoreTimes); - if(bCreateBackup) cmpOpt |= PwCompareOptions.IgnoreLastBackup; - if(newEntry.EqualsEntry(initialEntry, cmpOpt, MemProtCmpMode.CustomOnly)) - { - // No modifications at all => restore last mod time and undo backup - newEntry.LastModificationTime = initialEntry.LastModificationTime; - bUndoBackup = bCreateBackup; - } - else if(bCreateBackup) - { - // If only history items have been modified (deleted) => undo - // backup, but without restoring the last mod time - PwCompareOptions cmpOptNH = (cmpOpt | PwCompareOptions.IgnoreHistory); - if(newEntry.EqualsEntry(initialEntry, cmpOptNH, MemProtCmpMode.CustomOnly)) - bUndoBackup = true; - } - if(bUndoBackup) newEntry.History.RemoveAt(newEntry.History.UCount - 1); - - newEntry.MaintainBackups(db.pm); - - - - //if ( newEntry.Strings.ReadSafe (PwDefs.TitleField).Equals(mEntry.Strings.ReadSafe (PwDefs.TitleField)) ) { - // SetResult(KeePass.EXIT_REFRESH); - //} else { - //it's safer to always update the title as we might add further information in the title like expiry etc. - SetResult(KeePass.EXIT_REFRESH_TITLE); - //} - - RunnableOnFinish task; - OnFinish onFinish = new AfterSave(new Handler(), act); - - if ( mIsNew ) { - task = AddEntry.getInstance(this, App.getDB(), newEntry, parentGroup, onFinish); - } else { - task = new UpdateEntry(this, App.getDB(), initialEntry, newEntry, onFinish); - } - ProgressTask pt = new ProgressTask(act, task, Resource.String.saving_database); - pt.run(); }; - // Respect mask password setting - if (mShowPassword) { + if (State.mShowPassword) { EditText pass = (EditText) FindViewById(Resource.Id.entry_password); EditText conf = (EditText) FindViewById(Resource.Id.entry_confpassword); @@ -370,42 +256,225 @@ namespace keepass2android addButton.Click += (object sender, EventArgs e) => { LinearLayout container = (LinearLayout) FindViewById(Resource.Id.advanced_container); - - EntryEditSection ees = (EntryEditSection) LayoutInflater.Inflate(Resource.Layout.entry_edit_section, null); - ees.setData("", new ProtectedString(false, "")); - ees.getDeleteButton().Click += (senderEes, eEes) => deleteAdvancedString((View)senderEes); + + KeyValuePair pair = new KeyValuePair("" , new ProtectedString(true, "")); + LinearLayout ees = CreateExtraStringView(pair); container.AddView(ees); - mEntryModified = true; + State.mEntryModified = true; - // Scroll bottom - scroll.Post(() => { - scroll.FullScroll(FocusSearchDirection.Down); - }); + TextView keyView = (TextView) ees.FindViewById(Resource.Id.title); + keyView.RequestFocus(); }; ((CheckBox)FindViewById(Resource.Id.entry_expires_checkbox)).CheckedChange += (object sender, CompoundButton.CheckedChangeEventArgs e) => { - mEntry.Expires = e.IsChecked; + State.mEntry.Expires = e.IsChecked; if (e.IsChecked) { - if (mEntry.ExpiryTime < DateTime.Now) - mEntry.ExpiryTime = DateTime.Now; + if (State.mEntry.ExpiryTime < DateTime.Now) + State.mEntry.ExpiryTime = DateTime.Now; } updateExpires(); - mEntryModified = true; + State.mEntryModified = true; }; } + void SaveEntry(OnFinish onFinish) + { + Database db = App.getDB(); + EntryEditActivity act = this; + + if (!validateBeforeSaving()) + return; + + PwEntry initialEntry = State.mEntryInDatabase.CloneDeep(); + + PwEntry newEntry = State.mEntryInDatabase; + + //Clone history and re-assign: + newEntry.History = newEntry.History.CloneDeep(); + + //Based on KeePass Desktop + bool bCreateBackup = (!State.mIsNew); + if(bCreateBackup) newEntry.CreateBackup(null); + + if (State.mSelectedIcon == false) { + if (State.mIsNew) { + newEntry.IconId = PwIcon.Key; + } else { + // Keep previous icon, if no new one was selected + } + } + else { + newEntry.IconId = State.mSelectedIconID; + newEntry.CustomIconUuid = State.mSelectedCustomIconID; + } + /* KPDesktop + if(m_cbCustomForegroundColor.Checked) + newEntry.ForegroundColor = m_clrForeground; + else newEntry.ForegroundColor = Color.Empty; + if(m_cbCustomBackgroundColor.Checked) + newEntry.BackgroundColor = m_clrBackground; + else newEntry.BackgroundColor = Color.Empty; + + */ + + UpdateEntryFromUi(newEntry); + newEntry.Binaries = State.mEntry.Binaries; + newEntry.Expires = State.mEntry.Expires; + if (newEntry.Expires) + { + newEntry.ExpiryTime = State.mEntry.ExpiryTime; + } + + + newEntry.Touch(true, false); // Touch *after* backup + + StrUtil.NormalizeNewLines(newEntry.Strings, true); + + bool bUndoBackup = false; + PwCompareOptions cmpOpt = (PwCompareOptions.NullEmptyEquivStd | + PwCompareOptions.IgnoreTimes); + if(bCreateBackup) cmpOpt |= PwCompareOptions.IgnoreLastBackup; + if(newEntry.EqualsEntry(initialEntry, cmpOpt, MemProtCmpMode.CustomOnly)) + { + // No modifications at all => restore last mod time and undo backup + newEntry.LastModificationTime = initialEntry.LastModificationTime; + bUndoBackup = bCreateBackup; + } + else if(bCreateBackup) + { + // If only history items have been modified (deleted) => undo + // backup, but without restoring the last mod time + PwCompareOptions cmpOptNH = (cmpOpt | PwCompareOptions.IgnoreHistory); + if(newEntry.EqualsEntry(initialEntry, cmpOptNH, MemProtCmpMode.CustomOnly)) + bUndoBackup = true; + } + if(bUndoBackup) newEntry.History.RemoveAt(newEntry.History.UCount - 1); + + newEntry.MaintainBackups(db.pm); + + + + //if ( newEntry.Strings.ReadSafe (PwDefs.TitleField).Equals(State.mEntry.Strings.ReadSafe (PwDefs.TitleField)) ) { + // SetResult(KeePass.EXIT_REFRESH); + //} else { + //it's safer to always update the title as we might add further information in the title like expiry etc. + SetResult(KeePass.EXIT_REFRESH_TITLE); + //} + + RunnableOnFinish task; + + + if ( State.mIsNew ) { + task = AddEntry.getInstance(this, App.getDB(), newEntry, State.parentGroup, onFinish); + } else { + task = new UpdateEntry(this, App.getDB(), initialEntry, newEntry, onFinish); + } + ProgressTask pt = new ProgressTask(act, task, Resource.String.saving_database); + pt.run(); + + + } + + void UpdateEntryFromUi(PwEntry entry) + { + Database db = App.getDB(); + EntryEditActivity act = this; + + entry.Strings.Set(PwDefs.TitleField, new ProtectedString(db.pm.MemoryProtection.ProtectTitle, + Util.getEditText(act, Resource.Id.entry_title))); + entry.Strings.Set(PwDefs.UserNameField, new ProtectedString(db.pm.MemoryProtection.ProtectUserName, + Util.getEditText(act, Resource.Id.entry_user_name))); + + String pass = Util.getEditText(act, Resource.Id.entry_password); + byte[] password = StrUtil.Utf8.GetBytes(pass); + entry.Strings.Set(PwDefs.PasswordField, new ProtectedString(db.pm.MemoryProtection.ProtectPassword, + password)); + MemUtil.ZeroByteArray(password); + + entry.Strings.Set(PwDefs.UrlField, new ProtectedString(db.pm.MemoryProtection.ProtectUrl, + Util.getEditText(act, Resource.Id.entry_url))); + entry.Strings.Set(PwDefs.NotesField, new ProtectedString(db.pm.MemoryProtection.ProtectNotes, + Util.getEditText(act, Resource.Id.entry_comment))); + + // Validate expiry date + DateTime newExpiry = new DateTime(); + if ((State.mEntry.Expires) && (!DateTime.TryParse( Util.getEditText(this,Resource.Id.entry_expires), out newExpiry))) + { + //ignore here + } + else + { + State.mEntry.ExpiryTime = newExpiry; + } + + // Delete all non standard strings + var keys = entry.Strings.GetKeys(); + foreach (String key in keys) + if (PwDefs.IsStandardField(key) == false) + entry.Strings.Remove(key); + + LinearLayout container = (LinearLayout) FindViewById(Resource.Id.advanced_container); + + for (int index = 0; index < container.ChildCount; index++) { + View view = container.GetChildAt(index); + + TextView keyView = (TextView)view.FindViewById(Resource.Id.title); + String key = keyView.Text; + Android.Util.Log.Debug("DEBUG","------------- " + index.ToString()+ " " + key); + + if (String.IsNullOrEmpty(key)) + continue; + + TextView valueView = (TextView)view.FindViewById(Resource.Id.value); + String value = valueView.Text; + + CheckBox cb = (CheckBox)view.FindViewById(Resource.Id.protection); + + bool protect = true; + ProtectedString initialString = State.mEntryInDatabase.Strings.Get(key); + if (initialString != null) + protect = initialString.IsProtected; + if (cb != null) //Checkbox removed for ICS (for clarity) + { + protect = cb.Checked; + } + entry.Strings.Set(key, new ProtectedString(protect, value)); + } + + + entry.OverrideUrl = Util.getEditText(this,Resource.Id.entry_override_url); + + List vNewTags = StrUtil.StringToTags(Util.getEditText(this,Resource.Id.entry_tags)); + entry.Tags.Clear(); + foreach(string strTag in vNewTags) entry.AddTag(strTag); + + /*KPDesktop + + + m_atConfig.Enabled = m_cbAutoTypeEnabled.Checked; + m_atConfig.ObfuscationOptions = (m_cbAutoTypeObfuscation.Checked ? + AutoTypeObfuscationOptions.UseClipboard : + AutoTypeObfuscationOptions.None); + + SaveDefaultSeq(); + + newEntry.AutoType = m_atConfig; + */ + + } + void addBinaryOrAsk(string filename) { string strItem = UrlUtil.GetFileName(filename); - if(mEntry.Binaries.Get(strItem) != null) + if(State.mEntry.Binaries.Get(strItem) != null) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.SetTitle(GetString(Resource.String.AskOverwriteBinary_title)); @@ -446,7 +515,7 @@ namespace keepass2android while(true) { string strNewName = strFileName + nTry.ToString() + strExtension; - if(mEntry.Binaries.Get(strNewName) == null) + if(State.mEntry.Binaries.Get(strNewName) == null) { strItem = strNewName; break; @@ -461,20 +530,20 @@ namespace keepass2android if(vBytes != null) { ProtectedBinary pb = new ProtectedBinary(false, vBytes); - mEntry.Binaries.Set(strItem, pb); + State.mEntry.Binaries.Set(strItem, pb); } } catch(Exception exAttach) { Toast.MakeText(this, GetString(Resource.String.AttachFailed)+" "+exAttach.Message, ToastLength.Long).Show(); } - mEntryModified = true; + State.mEntryModified = true; populateBinaries(); } public override void OnBackPressed() { - if (mEntryModified == false) + if (State.mEntryModified == false) { base.OnBackPressed(); } else @@ -501,35 +570,50 @@ namespace keepass2android } } + + public void reload() { + //this reload ìs necessary to overcome a strange problem with the extra string fields which get lost + //somehow after re-creating the activity. Maybe a Mono for Android bug? + Intent intent = Intent; + intent.PutExtra(Intent_ContinueWithEditing, true); + OverridePendingTransition(0, 0); + intent.AddFlags(ActivityFlags.NoAnimation); + mCloseForReload = true; + SetResult(KeePass.EXIT_REFRESH_TITLE); //probably the entry will be modified -> let the EditActivity refresh to be safe + Finish(); + + OverridePendingTransition(0, 0); + StartActivity(intent); + } protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { switch ((int)resultCode) { case RESULT_OK_ICON_PICKER: - mSelectedIconID = (PwIcon) data.Extras.GetInt(IconPickerActivity.KEY_ICON_ID); - mSelectedCustomIconID = PwUuid.Zero; + State.mSelectedIconID = (PwIcon) data.Extras.GetInt(IconPickerActivity.KEY_ICON_ID); + State.mSelectedCustomIconID = PwUuid.Zero; String customIconIdString = data.Extras.GetString(IconPickerActivity.KEY_CUSTOM_ICON_ID); if (!String.IsNullOrEmpty(customIconIdString)) - mSelectedCustomIconID = new PwUuid(MemUtil.HexStringToByteArray(customIconIdString)); - mSelectedIcon = true; - ImageButton currIconButton = (ImageButton) FindViewById(Resource.Id.icon_button); - //TODO: custom image - currIconButton.SetImageResource(Icons.iconToResId(mSelectedIconID)); - mEntryModified = true; + State.mSelectedCustomIconID = new PwUuid(MemUtil.HexStringToByteArray(customIconIdString)); + State.mSelectedIcon = true; + State.mEntryModified = true; + reload(); break; case RESULT_OK_PASSWORD_GENERATOR: String generatedPassword = data.GetStringExtra("keepass2android.password.generated_password"); - EditText password = (EditText) FindViewById(Resource.Id.entry_password); - EditText confPassword = (EditText) FindViewById(Resource.Id.entry_confpassword); - password.Text = generatedPassword; - confPassword.Text = generatedPassword; - mEntryModified = true; + byte[] password = StrUtil.Utf8.GetBytes(generatedPassword); + State.mEntry.Strings.Set(PwDefs.PasswordField, new ProtectedString(App.getDB().pm.MemoryProtection.ProtectPassword, + password)); + MemUtil.ZeroByteArray(password); + + State.mEntryModified = true; + reload(); break; case (int)Result.Ok: - if (requestCode == Intents.REQUEST_CODE_FILE_BROWSE) + if (requestCode == Intents.REQUEST_CODE_FILE_BROWSE_FOR_BINARY) { String filename = data.DataString; if (filename != null) { @@ -541,10 +625,12 @@ namespace keepass2android addBinaryOrAsk(filename); } } + reload(); break; case (int)Result.Canceled: + reload(); break; default: break; @@ -556,7 +642,7 @@ namespace keepass2android ViewGroup binariesGroup = (ViewGroup)FindViewById(Resource.Id.binaries); binariesGroup.RemoveAllViews(); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FillParent, RelativeLayout.LayoutParams.WrapContent); - foreach (KeyValuePair pair in mEntry.Binaries) + foreach (KeyValuePair pair in State.mEntry.Binaries) { String key = pair.Key; Button binaryButton = new Button(this); @@ -565,9 +651,9 @@ namespace keepass2android binaryButton.SetCompoundDrawablesWithIntrinsicBounds( Resources.GetDrawable(Android.Resource.Drawable.IcMenuDelete),null, null, null); binaryButton.Click += (object sender, EventArgs e) => { - mEntryModified = true; + State.mEntryModified = true; Button btnSender = (Button)(sender); - mEntry.Binaries.Remove(key); + State.mEntry.Binaries.Remove(key); populateBinaries(); }; @@ -581,11 +667,14 @@ namespace keepass2android addBinaryButton.SetCompoundDrawablesWithIntrinsicBounds( Resources.GetDrawable(Android.Resource.Drawable.IcMenuAdd) , null, null, null); addBinaryButton.Click += (object sender, EventArgs e) => { - Util.showBrowseDialog("/mnt/sdcard", this); + Util.showBrowseDialog("/mnt/sdcard", this, Intents.REQUEST_CODE_FILE_BROWSE_FOR_BINARY); + }; binariesGroup.AddView(addBinaryButton,layoutParams); - FindViewById(Resource.Id.entry_binaries_label).Visibility = mEntry.Binaries.UCount > 0 ? ViewStates.Visible : ViewStates.Gone; + var binariesLabel = FindViewById(Resource.Id.entry_binaries_label); + if (binariesLabel != null) + binariesLabel.Visibility = State.mEntry.Binaries.UCount > 0 ? ViewStates.Visible : ViewStates.Gone; } public override bool OnCreateOptionsMenu(IMenu menu) { base.OnCreateOptionsMenu(menu); @@ -595,7 +684,7 @@ namespace keepass2android IMenuItem togglePassword = menu.FindItem(Resource.Id.menu_toggle_pass); - if ( mShowPassword ) { + if ( State.mShowPassword ) { togglePassword.SetTitle(Resource.String.menu_hide_password); } else { togglePassword.SetTitle(Resource.String.show_password); @@ -616,12 +705,12 @@ namespace keepass2android return true;*/ case Resource.Id.menu_toggle_pass: - if ( mShowPassword ) { + if ( State.mShowPassword ) { item.SetTitle(Resource.String.show_password); - mShowPassword = false; + State.mShowPassword = false; } else { item.SetTitle(Resource.String.menu_hide_password); - mShowPassword = true; + State.mShowPassword = true; } setPasswordStyle(); return true; @@ -661,7 +750,7 @@ namespace keepass2android TextView password = (TextView) FindViewById(Resource.Id.entry_password); TextView confpassword = (TextView) FindViewById(Resource.Id.entry_confpassword); - if ( mShowPassword ) { + if ( State.mShowPassword ) { password.InputType = InputTypes.ClassText | InputTypes.TextVariationVisiblePassword; confpassword.InputType = InputTypes.ClassText | InputTypes.TextVariationVisiblePassword; @@ -673,52 +762,76 @@ namespace keepass2android void updateExpires() { - if (mEntry.Expires) + if (State.mEntry.Expires) { - populateText(Resource.Id.entry_expires, getDateTime(mEntry.ExpiryTime)); + populateText(Resource.Id.entry_expires, getDateTime(State.mEntry.ExpiryTime)); } else { populateText(Resource.Id.entry_expires, GetString(Resource.String.never)); } - ((CheckBox)FindViewById(Resource.Id.entry_expires_checkbox)).Checked = mEntry.Expires; - ((EditText)FindViewById(Resource.Id.entry_expires)).Enabled = mEntry.Expires; + ((CheckBox)FindViewById(Resource.Id.entry_expires_checkbox)).Checked = State.mEntry.Expires; + ((EditText)FindViewById(Resource.Id.entry_expires)).Enabled = State.mEntry.Expires; + } + + public override Java.Lang.Object OnRetainNonConfigurationInstance() + { + UpdateEntryFromUi(State.mEntry); + return this; + } + + LinearLayout CreateExtraStringView(KeyValuePair pair) + { + LinearLayout ees = (LinearLayout)LayoutInflater.Inflate(Resource.Layout.entry_edit_section, null); + ((TextView)ees.FindViewById(Resource.Id.title)).Text = pair.Key; + ((TextView)ees.FindViewById(Resource.Id.title)).TextChanged += (sender, e) => State.mEntryModified = true; + ((TextView)ees.FindViewById(Resource.Id.value)).Text = pair.Value.ReadString(); + ((TextView)ees.FindViewById(Resource.Id.value)).TextChanged += (sender, e) => State.mEntryModified = true; + ees.FindViewById(Resource.Id.delete).Click += (sender, e) => deleteAdvancedString((View)sender); + CheckBox cb = (CheckBox)ees.FindViewById(Resource.Id.protection); + if (cb != null) + { + cb.Checked = pair.Value.IsProtected; + cb.CheckedChange += (sender, e) => + { + State.mEntryModified = true; + }; + } + return ees; } private void fillData() { ImageButton currIconButton = (ImageButton) FindViewById(Resource.Id.icon_button); - App.getDB().drawFactory.assignDrawableTo(currIconButton, Resources, App.getDB().pm, mEntry.IconId, mEntry.CustomIconUuid); + App.getDB().drawFactory.assignDrawableTo(currIconButton, Resources, App.getDB().pm, State.mEntry.IconId, State.mEntry.CustomIconUuid); - populateText(Resource.Id.entry_title, mEntry.Strings.ReadSafe (PwDefs.TitleField)); - populateText(Resource.Id.entry_user_name, mEntry.Strings.ReadSafe (PwDefs.UserNameField)); - populateText(Resource.Id.entry_url, mEntry.Strings.ReadSafe (PwDefs.UrlField)); + populateText(Resource.Id.entry_title, State.mEntry.Strings.ReadSafe (PwDefs.TitleField)); + populateText(Resource.Id.entry_user_name, State.mEntry.Strings.ReadSafe (PwDefs.UserNameField)); + populateText(Resource.Id.entry_url, State.mEntry.Strings.ReadSafe (PwDefs.UrlField)); - String password = mEntry.Strings.ReadSafe(PwDefs.PasswordField); + String password = State.mEntry.Strings.ReadSafe(PwDefs.PasswordField); populateText(Resource.Id.entry_password, password); populateText(Resource.Id.entry_confpassword, password); setPasswordStyle(); - populateText(Resource.Id.entry_comment, mEntry.Strings.ReadSafe (PwDefs.NotesField)); + populateText(Resource.Id.entry_comment, State.mEntry.Strings.ReadSafe (PwDefs.NotesField)); LinearLayout container = (LinearLayout) FindViewById(Resource.Id.advanced_container); - foreach (var pair in mEntry.Strings) + foreach (var pair in State.mEntry.Strings) { String key = pair.Key; if (!PwDefs.IsStandardField(key)) { - EntryEditSection ees = (EntryEditSection) LayoutInflater.Inflate(Resource.Layout.entry_edit_section, null); - ees.setData(key, pair.Value); - ees.ContentChanged += (sender, e) => {mEntryModified=true;}; - ees.getDeleteButton().Click += (sender, e) => deleteAdvancedString((View)sender); + var ees = CreateExtraStringView(pair); + Android.Util.Log.Debug("DEBUG", "aiding key " +key); container.AddView(ees); } } populateBinaries(); - populateText(Resource.Id.entry_override_url, mEntry.OverrideUrl); - populateText(Resource.Id.entry_tags, StrUtil.TagsToString(mEntry.Tags, true)); + populateText(Resource.Id.entry_override_url, State.mEntry.OverrideUrl); + populateText(Resource.Id.entry_tags, StrUtil.TagsToString(State.mEntry.Tags, true)); updateExpires(); } @@ -728,11 +841,11 @@ namespace keepass2android public void deleteAdvancedString(View view) { - EntryEditSection section = (EntryEditSection) view.Parent; + var section = view.Parent; LinearLayout container = (LinearLayout) FindViewById(Resource.Id.advanced_container); - mEntryModified = true; + State.mEntryModified = true; for (int i = 0; i < container.ChildCount; i++) { - EntryEditSection ees = (EntryEditSection) container.GetChildAt(i); + var ees = container.GetChildAt(i); if (ees == section) { container.RemoveViewAt(i); container.Invalidate(); @@ -760,20 +873,20 @@ namespace keepass2android // Validate expiry date DateTime newExpiry = new DateTime(); - if ((mEntry.Expires) && (!DateTime.TryParse( Util.getEditText(this,Resource.Id.entry_expires), out newExpiry))) + if ((State.mEntry.Expires) && (!DateTime.TryParse( Util.getEditText(this,Resource.Id.entry_expires), out newExpiry))) { Toast.MakeText(this, Resource.String.error_invalid_expiry_date, ToastLength.Long).Show(); return false; } else { - mEntry.ExpiryTime = newExpiry; + State.mEntry.ExpiryTime = newExpiry; } LinearLayout container = (LinearLayout) FindViewById(Resource.Id.advanced_container); for (int i = 0; i < container.ChildCount; i++) { - EntryEditSection ees = (EntryEditSection) container.GetChildAt(i); + View ees = container.GetChildAt(i); TextView keyView = (TextView) ees.FindViewById(Resource.Id.title); string key = keyView.Text; @@ -792,9 +905,18 @@ namespace keepass2android private void populateText(int viewId, String text) { TextView tv = (TextView) FindViewById(viewId); tv.Text = text; - tv.TextChanged += (sender, e) => {mEntryModified = true;}; + tv.TextChanged += (sender, e) => {State.mEntryModified = true;}; } - + + protected override void OnPause() + { + if (!mCloseForReload) + UpdateEntryFromUi(State.mEntry); + + base.OnPause(); + + } + private class AfterSave : OnFinish { Activity act; public AfterSave(Handler handler, Activity act): base(handler) { diff --git a/src/keepass2android/EntryEditActivityState.cs b/src/keepass2android/EntryEditActivityState.cs new file mode 100644 index 00000000..3e151b1e --- /dev/null +++ b/src/keepass2android/EntryEditActivityState.cs @@ -0,0 +1,37 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Android.App; +using Android.Content; +using Android.OS; +using Android.Runtime; +using Android.Views; +using Android.Widget; +using KeePassLib; + +namespace keepass2android +{ + /// + /// Holds the state of the EntrryEditActivity. This is required to be able to keep a partially modified entry in memory + /// through the App variable. Serializing this state (especially the mEntry/mEntryInDatabase) can be a performance problem + /// when there are big attachements. + /// + internal class EntryEditActivityState + { + internal PwEntry mEntry, mEntryInDatabase; + internal bool mShowPassword = false; + internal bool mIsNew; + internal PwIcon mSelectedIconID; + internal PwUuid mSelectedCustomIconID = PwUuid.Zero; + internal bool mSelectedIcon = false; + + internal PwGroup parentGroup; + + internal bool mEntryModified; + + } +} + diff --git a/src/keepass2android/GeneratePasswordActivity.cs b/src/keepass2android/GeneratePasswordActivity.cs index fb697d26..fa614020 100644 --- a/src/keepass2android/GeneratePasswordActivity.cs +++ b/src/keepass2android/GeneratePasswordActivity.cs @@ -67,7 +67,7 @@ namespace keepass2android - Button acceptButton = (Button) FindViewById(Resource.Id.accept_button); + View acceptButton = FindViewById(Resource.Id.accept_button); acceptButton.Click += (object sender, EventArgs e) => { EditText password = (EditText) FindViewById(Resource.Id.password); @@ -80,7 +80,7 @@ namespace keepass2android }; - Button cancelButton = (Button) FindViewById(Resource.Id.cancel_button); + View cancelButton = FindViewById(Resource.Id.cancel_button); cancelButton.Click += (object sender, EventArgs e) => { SetResult(Result.Canceled); diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index ba222c57..34ada2cb 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -266,7 +266,7 @@ namespace keepass2android unloadDatabase(); break; case Android.App.Result.Ok: - if (requestCode == Intents.REQUEST_CODE_FILE_BROWSE) { + if (requestCode == Intents.REQUEST_CODE_FILE_BROWSE_FOR_KEYFILE) { String filename = data.DataString; if (filename != null) { if (filename.StartsWith("file://")) { @@ -447,7 +447,7 @@ namespace keepass2android try { - StartActivityForResult(intent, Intents.REQUEST_CODE_FILE_BROWSE); + StartActivityForResult(intent, Intents.REQUEST_CODE_FILE_BROWSE_FOR_KEYFILE); } catch (ActivityNotFoundException) { BrowserDialog diag = new BrowserDialog(this); diff --git a/src/keepass2android/QuickUnlock.cs b/src/keepass2android/QuickUnlock.cs index 46f45f4e..c37e2d5d 100644 --- a/src/keepass2android/QuickUnlock.cs +++ b/src/keepass2android/QuickUnlock.cs @@ -55,7 +55,14 @@ namespace keepass2android SetContentView(Resource.Layout.QuickUnlock); - ((TextView)FindViewById(Resource.Id.qu_filename)).Text = mIoc.GetDisplayName(); + if (App.getDB().pm.Name != "") + { + FindViewById(Resource.Id.filename_label).Visibility = ViewStates.Invisible; + ((TextView)FindViewById(Resource.Id.qu_filename)).Text = App.getDB().pm.Name; + } else + { + ((TextView)FindViewById(Resource.Id.qu_filename)).Text = mIoc.Path; + } TextView txtLabel = (TextView)FindViewById(Resource.Id.QuickUnlock_label); diff --git a/src/keepass2android/Resources/Resource.designer.cs b/src/keepass2android/Resources/Resource.designer.cs index 4215fa13..f29703f9 100644 --- a/src/keepass2android/Resources/Resource.designer.cs +++ b/src/keepass2android/Resources/Resource.designer.cs @@ -87,6 +87,9 @@ namespace keepass2android // aapt resource value: 0x7f060000 public const int blue_highlight = 2131099648; + // aapt resource value: 0x7f060009 + public const int dark_gray = 2131099657; + // aapt resource value: 0x7f060005 public const int emphasis = 2131099653; @@ -105,6 +108,9 @@ namespace keepass2android // aapt resource value: 0x7f060003 public const int icon_text = 2131099651; + // aapt resource value: 0x7f060008 + public const int light_gray = 2131099656; + private Color() { } @@ -123,274 +129,295 @@ namespace keepass2android public const int btn_new_group_dark = 2130837506; // aapt resource value: 0x7f020003 - public const int device_access_new_account = 2130837507; + public const int collections_collection = 2130837507; // aapt resource value: 0x7f020004 - public const int device_access_new_account_dark = 2130837508; + public const int collections_new_label = 2130837508; // aapt resource value: 0x7f020005 - public const int EntryFieldHeaderBackground = 2130837509; + public const int device_access_new_account = 2130837509; // aapt resource value: 0x7f020006 - public const int extra_string_header = 2130837510; + public const int device_access_new_account_dark = 2130837510; // aapt resource value: 0x7f020007 - public const int GreenButton = 2130837511; + public const int device_access_not_secure = 2130837511; // aapt resource value: 0x7f020008 - public const int HeaderButtonBackground = 2130837512; + public const int EntryFieldHeaderBackground = 2130837512; // aapt resource value: 0x7f020009 - public const int ic00 = 2130837513; + public const int extra_string_header = 2130837513; // aapt resource value: 0x7f02000a - public const int ic01 = 2130837514; + public const int GreenButton = 2130837514; // aapt resource value: 0x7f02000b - public const int ic02 = 2130837515; + public const int HeaderButtonBackground = 2130837515; // aapt resource value: 0x7f02000c - public const int ic03 = 2130837516; + public const int ic00 = 2130837516; // aapt resource value: 0x7f02000d - public const int ic04 = 2130837517; + public const int ic01 = 2130837517; // aapt resource value: 0x7f02000e - public const int ic05 = 2130837518; + public const int ic02 = 2130837518; // aapt resource value: 0x7f02000f - public const int ic06 = 2130837519; + public const int ic03 = 2130837519; // aapt resource value: 0x7f020010 - public const int ic07 = 2130837520; + public const int ic04 = 2130837520; // aapt resource value: 0x7f020011 - public const int ic08 = 2130837521; + public const int ic05 = 2130837521; // aapt resource value: 0x7f020012 - public const int ic09 = 2130837522; + public const int ic06 = 2130837522; // aapt resource value: 0x7f020013 - public const int ic10 = 2130837523; + public const int ic07 = 2130837523; // aapt resource value: 0x7f020014 - public const int ic11 = 2130837524; + public const int ic08 = 2130837524; // aapt resource value: 0x7f020015 - public const int ic12 = 2130837525; + public const int ic09 = 2130837525; // aapt resource value: 0x7f020016 - public const int ic13 = 2130837526; + public const int ic10 = 2130837526; // aapt resource value: 0x7f020017 - public const int ic14 = 2130837527; + public const int ic11 = 2130837527; // aapt resource value: 0x7f020018 - public const int ic15 = 2130837528; + public const int ic12 = 2130837528; // aapt resource value: 0x7f020019 - public const int ic16 = 2130837529; + public const int ic13 = 2130837529; // aapt resource value: 0x7f02001a - public const int ic17 = 2130837530; + public const int ic14 = 2130837530; // aapt resource value: 0x7f02001b - public const int ic18 = 2130837531; + public const int ic15 = 2130837531; // aapt resource value: 0x7f02001c - public const int ic19 = 2130837532; + public const int ic16 = 2130837532; // aapt resource value: 0x7f02001d - public const int ic20 = 2130837533; + public const int ic17 = 2130837533; // aapt resource value: 0x7f02001e - public const int ic21 = 2130837534; + public const int ic18 = 2130837534; // aapt resource value: 0x7f02001f - public const int ic22 = 2130837535; + public const int ic19 = 2130837535; // aapt resource value: 0x7f020020 - public const int ic23 = 2130837536; + public const int ic20 = 2130837536; // aapt resource value: 0x7f020021 - public const int ic24 = 2130837537; + public const int ic21 = 2130837537; // aapt resource value: 0x7f020022 - public const int ic25 = 2130837538; + public const int ic22 = 2130837538; // aapt resource value: 0x7f020023 - public const int ic26 = 2130837539; + public const int ic23 = 2130837539; // aapt resource value: 0x7f020024 - public const int ic27 = 2130837540; + public const int ic24 = 2130837540; // aapt resource value: 0x7f020025 - public const int ic28 = 2130837541; + public const int ic25 = 2130837541; // aapt resource value: 0x7f020026 - public const int ic29 = 2130837542; + public const int ic26 = 2130837542; // aapt resource value: 0x7f020027 - public const int ic30 = 2130837543; + public const int ic27 = 2130837543; // aapt resource value: 0x7f020028 - public const int ic31 = 2130837544; + public const int ic28 = 2130837544; // aapt resource value: 0x7f020029 - public const int ic32 = 2130837545; + public const int ic29 = 2130837545; // aapt resource value: 0x7f02002a - public const int ic33 = 2130837546; + public const int ic30 = 2130837546; // aapt resource value: 0x7f02002b - public const int ic34 = 2130837547; + public const int ic31 = 2130837547; // aapt resource value: 0x7f02002c - public const int ic35 = 2130837548; + public const int ic32 = 2130837548; // aapt resource value: 0x7f02002d - public const int ic36 = 2130837549; + public const int ic33 = 2130837549; // aapt resource value: 0x7f02002e - public const int ic37 = 2130837550; + public const int ic34 = 2130837550; // aapt resource value: 0x7f02002f - public const int ic38 = 2130837551; + public const int ic35 = 2130837551; // aapt resource value: 0x7f020030 - public const int ic39 = 2130837552; + public const int ic36 = 2130837552; // aapt resource value: 0x7f020031 - public const int ic40 = 2130837553; + public const int ic37 = 2130837553; // aapt resource value: 0x7f020032 - public const int ic41 = 2130837554; + public const int ic38 = 2130837554; // aapt resource value: 0x7f020033 - public const int ic42 = 2130837555; + public const int ic39 = 2130837555; // aapt resource value: 0x7f020034 - public const int ic43 = 2130837556; + public const int ic40 = 2130837556; // aapt resource value: 0x7f020035 - public const int ic44 = 2130837557; + public const int ic41 = 2130837557; // aapt resource value: 0x7f020036 - public const int ic45 = 2130837558; + public const int ic42 = 2130837558; // aapt resource value: 0x7f020037 - public const int ic46 = 2130837559; + public const int ic43 = 2130837559; // aapt resource value: 0x7f020038 - public const int ic47 = 2130837560; + public const int ic44 = 2130837560; // aapt resource value: 0x7f020039 - public const int ic48 = 2130837561; + public const int ic45 = 2130837561; // aapt resource value: 0x7f02003a - public const int ic49 = 2130837562; + public const int ic46 = 2130837562; // aapt resource value: 0x7f02003b - public const int ic50 = 2130837563; + public const int ic47 = 2130837563; // aapt resource value: 0x7f02003c - public const int ic51 = 2130837564; + public const int ic48 = 2130837564; // aapt resource value: 0x7f02003d - public const int ic52 = 2130837565; + public const int ic49 = 2130837565; // aapt resource value: 0x7f02003e - public const int ic53 = 2130837566; + public const int ic50 = 2130837566; // aapt resource value: 0x7f02003f - public const int ic54 = 2130837567; + public const int ic51 = 2130837567; // aapt resource value: 0x7f020040 - public const int ic55 = 2130837568; + public const int ic52 = 2130837568; // aapt resource value: 0x7f020041 - public const int ic56 = 2130837569; + public const int ic53 = 2130837569; // aapt resource value: 0x7f020042 - public const int ic57 = 2130837570; + public const int ic54 = 2130837570; // aapt resource value: 0x7f020043 - public const int ic58 = 2130837571; + public const int ic55 = 2130837571; // aapt resource value: 0x7f020044 - public const int ic59 = 2130837572; + public const int ic56 = 2130837572; // aapt resource value: 0x7f020045 - public const int ic60 = 2130837573; + public const int ic57 = 2130837573; // aapt resource value: 0x7f020046 - public const int ic61 = 2130837574; + public const int ic58 = 2130837574; // aapt resource value: 0x7f020047 - public const int ic62 = 2130837575; + public const int ic59 = 2130837575; // aapt resource value: 0x7f020048 - public const int ic63 = 2130837576; + public const int ic60 = 2130837576; // aapt resource value: 0x7f020049 - public const int ic64 = 2130837577; + public const int ic61 = 2130837577; // aapt resource value: 0x7f02004a - public const int ic65 = 2130837578; + public const int ic62 = 2130837578; // aapt resource value: 0x7f02004b - public const int ic66 = 2130837579; + public const int ic63 = 2130837579; // aapt resource value: 0x7f02004c - public const int ic67 = 2130837580; + public const int ic64 = 2130837580; // aapt resource value: 0x7f02004d - public const int ic68 = 2130837581; + public const int ic65 = 2130837581; // aapt resource value: 0x7f02004e - public const int ic99_blank = 2130837582; + public const int ic66 = 2130837582; // aapt resource value: 0x7f02004f - public const int ic_action_eye_open = 2130837583; + public const int ic67 = 2130837583; // aapt resource value: 0x7f020050 - public const int ic_action_search = 2130837584; + public const int ic68 = 2130837584; // aapt resource value: 0x7f020051 - public const int ic_launcher = 2130837585; + public const int ic99_blank = 2130837585; // aapt resource value: 0x7f020052 - public const int ic_launcher_folder_small = 2130837586; + public const int ic_action_eye_open = 2130837586; // aapt resource value: 0x7f020053 - public const int ic_launcher_gray = 2130837587; + public const int ic_action_search = 2130837587; // aapt resource value: 0x7f020054 - public const int ic_menu_view = 2130837588; + public const int ic_launcher = 2130837588; // aapt resource value: 0x7f020055 - public const int navigation_accept = 2130837589; + public const int ic_launcher_folder_small = 2130837589; // aapt resource value: 0x7f020056 - public const int navigation_accept_dark = 2130837590; + public const int ic_launcher_gray = 2130837590; // aapt resource value: 0x7f020057 - public const int navigation_previous_item = 2130837591; + public const int ic_menu_add_field_holo_light = 2130837591; // aapt resource value: 0x7f020058 - public const int navigation_previous_item_dark = 2130837592; + public const int ic_menu_remove_field_holo_light = 2130837592; // aapt resource value: 0x7f020059 - public const int notify = 2130837593; + public const int ic_menu_view = 2130837593; // aapt resource value: 0x7f02005a - public const int RedButton = 2130837594; + public const int location_web_site = 2130837594; // aapt resource value: 0x7f02005b - public const int section_header = 2130837595; + public const int navigation_accept = 2130837595; // aapt resource value: 0x7f02005c - public const int YellowButton = 2130837596; + public const int navigation_accept_dark = 2130837596; + + // aapt resource value: 0x7f02005d + public const int navigation_cancel = 2130837597; + + // aapt resource value: 0x7f02005e + public const int navigation_previous_item = 2130837598; + + // aapt resource value: 0x7f02005f + public const int navigation_previous_item_dark = 2130837599; + + // aapt resource value: 0x7f020060 + public const int notify = 2130837600; + + // aapt resource value: 0x7f020061 + public const int RedButton = 2130837601; + + // aapt resource value: 0x7f020062 + public const int section_header = 2130837602; + + // aapt resource value: 0x7f020063 + public const int YellowButton = 2130837603; private Drawable() { @@ -406,17 +433,17 @@ namespace keepass2android // aapt resource value: 0x7f0b0071 public const int IconGridView = 2131427441; + // aapt resource value: 0x7f0b0080 + public const int QuickUnlock_button = 2131427456; + + // aapt resource value: 0x7f0b0081 + public const int QuickUnlock_buttonLock = 2131427457; + // aapt resource value: 0x7f0b007e - public const int QuickUnlock_button = 2131427454; + public const int QuickUnlock_label = 2131427454; // aapt resource value: 0x7f0b007f - public const int QuickUnlock_buttonLock = 2131427455; - - // aapt resource value: 0x7f0b007c - public const int QuickUnlock_label = 2131427452; - - // aapt resource value: 0x7f0b007d - public const int QuickUnlock_password = 2131427453; + public const int QuickUnlock_password = 2131427455; // aapt resource value: 0x7f0b0055 public const int RelativeLayout = 2131427413; @@ -451,11 +478,11 @@ namespace keepass2android // aapt resource value: 0x7f0b0036 public const int bottom_bar = 2131427382; - // aapt resource value: 0x7f0b0051 - public const int bottom_layout = 2131427409; + // aapt resource value: 0x7f0b0050 + public const int bottom_layout = 2131427408; - // aapt resource value: 0x7f0b0049 - public const int browse_button = 2131427401; + // aapt resource value: 0x7f0b004b + public const int browse_button = 2131427403; // aapt resource value: 0x7f0b005a public const int btn_length12 = 2131427418; @@ -475,38 +502,38 @@ namespace keepass2android // aapt resource value: 0x7f0b0053 public const int cancel_button = 2131427411; - // aapt resource value: 0x7f0b008f - public const int cbCaseSensitive = 2131427471; + // aapt resource value: 0x7f0b0091 + public const int cbCaseSensitive = 2131427473; - // aapt resource value: 0x7f0b0090 - public const int cbExcludeExpiredEntries = 2131427472; - - // aapt resource value: 0x7f0b0085 - public const int cbRegEx = 2131427461; - - // aapt resource value: 0x7f0b008e - public const int cbSearchInGroupName = 2131427470; - - // aapt resource value: 0x7f0b008b - public const int cbSearchInNotes = 2131427467; - - // aapt resource value: 0x7f0b008c - public const int cbSearchInOtherStrings = 2131427468; - - // aapt resource value: 0x7f0b008a - public const int cbSearchInPassword = 2131427466; - - // aapt resource value: 0x7f0b008d - public const int cbSearchInTags = 2131427469; + // aapt resource value: 0x7f0b0092 + public const int cbExcludeExpiredEntries = 2131427474; // aapt resource value: 0x7f0b0087 - public const int cbSearchInTitle = 2131427463; + public const int cbRegEx = 2131427463; - // aapt resource value: 0x7f0b0088 - public const int cbSearchInUrl = 2131427464; + // aapt resource value: 0x7f0b0090 + public const int cbSearchInGroupName = 2131427472; + + // aapt resource value: 0x7f0b008d + public const int cbSearchInNotes = 2131427469; + + // aapt resource value: 0x7f0b008e + public const int cbSearchInOtherStrings = 2131427470; + + // aapt resource value: 0x7f0b008c + public const int cbSearchInPassword = 2131427468; + + // aapt resource value: 0x7f0b008f + public const int cbSearchInTags = 2131427471; // aapt resource value: 0x7f0b0089 - public const int cbSearchInUsername = 2131427465; + public const int cbSearchInTitle = 2131427465; + + // aapt resource value: 0x7f0b008a + public const int cbSearchInUrl = 2131427466; + + // aapt resource value: 0x7f0b008b + public const int cbSearchInUsername = 2131427467; // aapt resource value: 0x7f0b0065 public const int cb_brackets = 2131427429; @@ -532,17 +559,17 @@ namespace keepass2android // aapt resource value: 0x7f0b005e public const int cb_uppercase = 2131427422; - // aapt resource value: 0x7f0b004c - public const int create = 2131427404; + // aapt resource value: 0x7f0b004e + public const int create = 2131427406; - // aapt resource value: 0x7f0b0095 - public const int cred_password = 2131427477; + // aapt resource value: 0x7f0b0097 + public const int cred_password = 2131427479; + + // aapt resource value: 0x7f0b0098 + public const int cred_remember_mode = 2131427480; // aapt resource value: 0x7f0b0096 - public const int cred_remember_mode = 2131427478; - - // aapt resource value: 0x7f0b0094 - public const int cred_username = 2131427476; + public const int cred_username = 2131427478; // aapt resource value: 0x7f0b0079 public const int default_database = 2131427449; @@ -688,14 +715,14 @@ namespace keepass2android // aapt resource value: 0x7f0b0044 public const int file_listtop = 2131427396; - // aapt resource value: 0x7f0b0045 - public const int file_select = 2131427397; + // aapt resource value: 0x7f0b0051 + public const int file_select = 2131427409; // aapt resource value: 0x7f0b0074 public const int filename = 2131427444; - // aapt resource value: 0x7f0b0046 - public const int filename_form = 2131427398; + // aapt resource value: 0x7f0b0049 + public const int filename_form = 2131427401; // aapt resource value: 0x7f0b0072 public const int filename_label = 2131427442; @@ -703,8 +730,8 @@ namespace keepass2android // aapt resource value: 0x7f0b0073 public const int filenamescroll = 2131427443; - // aapt resource value: 0x7f0b004d - public const int fnv_cancel = 2131427405; + // aapt resource value: 0x7f0b004f + public const int fnv_cancel = 2131427407; // aapt resource value: 0x7f0b001c public const int generate_button = 2131427356; @@ -748,14 +775,17 @@ namespace keepass2android // aapt resource value: 0x7f0b000d public const int install_web = 2131427341; - // aapt resource value: 0x7f0b0048 - public const int label_open_by_filename = 2131427400; + // aapt resource value: 0x7f0b007c + public const int keyfileLine = 2131427452; // aapt resource value: 0x7f0b004a - public const int label_open_by_filename_details = 2131427402; + public const int label_open_by_filename = 2131427402; - // aapt resource value: 0x7f0b0047 - public const int label_warning = 2131427399; + // aapt resource value: 0x7f0b004c + public const int label_open_by_filename_details = 2131427404; + + // aapt resource value: 0x7f0b0045 + public const int label_warning = 2131427397; // aapt resource value: 0x7f0b005d public const int length = 2131427421; @@ -763,53 +793,53 @@ namespace keepass2android // aapt resource value: 0x7f0b0058 public const int length_label = 2131427416; - // aapt resource value: 0x7f0b0084 - public const int linearLayout1 = 2131427460; - - // aapt resource value: 0x7f0b009f - public const int menu_about = 2131427487; - - // aapt resource value: 0x7f0b009e - public const int menu_app_settings = 2131427486; - - // aapt resource value: 0x7f0b009d - public const int menu_cancel_edit = 2131427485; + // aapt resource value: 0x7f0b0086 + public const int linearLayout1 = 2131427462; // aapt resource value: 0x7f0b00a1 - public const int menu_change_master_key = 2131427489; - - // aapt resource value: 0x7f0b0098 - public const int menu_goto_url = 2131427480; - - // aapt resource value: 0x7f0b0099 - public const int menu_lock = 2131427481; - - // aapt resource value: 0x7f0b009b - public const int menu_rate = 2131427483; + public const int menu_about = 2131427489; // aapt resource value: 0x7f0b00a0 - public const int menu_search = 2131427488; + public const int menu_app_settings = 2131427488; - // aapt resource value: 0x7f0b00a2 - public const int menu_sort = 2131427490; + // aapt resource value: 0x7f0b009f + public const int menu_cancel_edit = 2131427487; + + // aapt resource value: 0x7f0b00a3 + public const int menu_change_master_key = 2131427491; // aapt resource value: 0x7f0b009a - public const int menu_suggest_improvements = 2131427482; + public const int menu_goto_url = 2131427482; - // aapt resource value: 0x7f0b0097 - public const int menu_toggle_pass = 2131427479; + // aapt resource value: 0x7f0b009b + public const int menu_lock = 2131427483; + + // aapt resource value: 0x7f0b009d + public const int menu_rate = 2131427485; + + // aapt resource value: 0x7f0b00a2 + public const int menu_search = 2131427490; + + // aapt resource value: 0x7f0b00a4 + public const int menu_sort = 2131427492; // aapt resource value: 0x7f0b009c - public const int menu_translate = 2131427484; + public const int menu_suggest_improvements = 2131427484; + + // aapt resource value: 0x7f0b0099 + public const int menu_toggle_pass = 2131427481; + + // aapt resource value: 0x7f0b009e + public const int menu_translate = 2131427486; // aapt resource value: 0x7f0b0069 public const int ok = 2131427433; - // aapt resource value: 0x7f0b004b - public const int open = 2131427403; + // aapt resource value: 0x7f0b004d + public const int open = 2131427405; - // aapt resource value: 0x7f0b0092 - public const int pass_conf_password = 2131427474; + // aapt resource value: 0x7f0b0094 + public const int pass_conf_password = 2131427476; // aapt resource value: 0x7f0b0077 public const int pass_keyfile = 2131427447; @@ -817,20 +847,23 @@ namespace keepass2android // aapt resource value: 0x7f0b0078 public const int pass_ok = 2131427448; - // aapt resource value: 0x7f0b0091 - public const int pass_password = 2131427473; + // aapt resource value: 0x7f0b0093 + public const int pass_password = 2131427475; // aapt resource value: 0x7f0b0056 public const int password = 2131427414; + // aapt resource value: 0x7f0b007b + public const int passwordLine = 2131427451; + // aapt resource value: 0x7f0b0075 public const int password_label = 2131427445; // aapt resource value: 0x7f0b002f public const int protection = 2131427375; - // aapt resource value: 0x7f0b007b - public const int qu_filename = 2131427451; + // aapt resource value: 0x7f0b007d + public const int qu_filename = 2131427453; // aapt resource value: 0x7f0b000f public const int rounds = 2131427343; @@ -838,32 +871,32 @@ namespace keepass2android // aapt resource value: 0x7f0b0010 public const int rounds_explaination = 2131427344; + // aapt resource value: 0x7f0b0085 + public const int scrollView1 = 2131427461; + + // aapt resource value: 0x7f0b0084 + public const int searchEditText = 2131427460; + // aapt resource value: 0x7f0b0083 - public const int scrollView1 = 2131427459; + public const int search_button = 2131427459; + + // aapt resource value: 0x7f0b0088 + public const int search_in_label = 2131427464; // aapt resource value: 0x7f0b0082 - public const int searchEditText = 2131427458; + public const int search_label = 2131427458; - // aapt resource value: 0x7f0b0081 - public const int search_button = 2131427457; + // aapt resource value: 0x7f0b0048 + public const int start_create = 2131427400; - // aapt resource value: 0x7f0b0086 - public const int search_in_label = 2131427462; + // aapt resource value: 0x7f0b0095 + public const int start_create_import = 2131427477; - // aapt resource value: 0x7f0b0080 - public const int search_label = 2131427456; + // aapt resource value: 0x7f0b0046 + public const int start_open_file = 2131427398; - // aapt resource value: 0x7f0b0050 - public const int start_create = 2131427408; - - // aapt resource value: 0x7f0b0093 - public const int start_create_import = 2131427475; - - // aapt resource value: 0x7f0b004e - public const int start_open_file = 2131427406; - - // aapt resource value: 0x7f0b004f - public const int start_open_url = 2131427407; + // aapt resource value: 0x7f0b0047 + public const int start_open_url = 2131427399; // aapt resource value: 0x7f0b000b public const int text = 2131427339; @@ -913,73 +946,91 @@ namespace keepass2android public const int entry_edit_section = 2130903044; // aapt resource value: 0x7f030005 - public const int entry_list_entry = 2130903045; + public const int entry_extrastring_title = 2130903045; // aapt resource value: 0x7f030006 - public const int entry_section = 2130903046; + public const int entry_extrastring_value = 2130903046; // aapt resource value: 0x7f030007 - public const int entry_view = 2130903047; + public const int entry_list_entry = 2130903047; // aapt resource value: 0x7f030008 - public const int entry_view_contents = 2130903048; + public const int entry_section = 2130903048; // aapt resource value: 0x7f030009 - public const int file_row = 2130903049; + public const int entry_view = 2130903049; // aapt resource value: 0x7f03000a - public const int file_selection = 2130903050; + public const int entry_view_contents = 2130903050; // aapt resource value: 0x7f03000b - public const int file_selection_filename = 2130903051; + public const int entry_view_test = 2130903051; // aapt resource value: 0x7f03000c - public const int file_selection_no_recent = 2130903052; + public const int file_row = 2130903052; // aapt resource value: 0x7f03000d - public const int generate_password = 2130903053; + public const int file_selection = 2130903053; // aapt resource value: 0x7f03000e - public const int group_add_entry = 2130903054; + public const int file_selection_buttons = 2130903054; // aapt resource value: 0x7f03000f - public const int group_edit = 2130903055; + public const int file_selection_filename = 2130903055; // aapt resource value: 0x7f030010 - public const int group_empty = 2130903056; + public const int file_selection_no_recent = 2130903056; // aapt resource value: 0x7f030011 - public const int group_header = 2130903057; + public const int generate_password = 2130903057; // aapt resource value: 0x7f030012 - public const int group_list_entry = 2130903058; + public const int group_add_entry = 2130903058; // aapt resource value: 0x7f030013 - public const int icon = 2130903059; + public const int group_edit = 2130903059; // aapt resource value: 0x7f030014 - public const int icon_picker = 2130903060; + public const int group_empty = 2130903060; // aapt resource value: 0x7f030015 - public const int password = 2130903061; + public const int group_header = 2130903061; // aapt resource value: 0x7f030016 - public const int QuickUnlock = 2130903062; + public const int group_list_entry = 2130903062; // aapt resource value: 0x7f030017 - public const int SaveButton = 2130903063; + public const int icon = 2130903063; // aapt resource value: 0x7f030018 - public const int search = 2130903064; + public const int icon_picker = 2130903064; // aapt resource value: 0x7f030019 - public const int set_password = 2130903065; + public const int InViewButton = 2130903065; // aapt resource value: 0x7f03001a - public const int StartScreenButtons = 2130903066; + public const int password = 2130903066; // aapt resource value: 0x7f03001b - public const int url_credentials = 2130903067; + public const int QuickUnlock = 2130903067; + + // aapt resource value: 0x7f03001c + public const int QuickUnlock_Unused = 2130903068; + + // aapt resource value: 0x7f03001d + public const int SaveButton = 2130903069; + + // aapt resource value: 0x7f03001e + public const int search = 2130903070; + + // aapt resource value: 0x7f03001f + public const int set_password = 2130903071; + + // aapt resource value: 0x7f030020 + public const int StartScreenButtons = 2130903072; + + // aapt resource value: 0x7f030021 + public const int url_credentials = 2130903073; private Layout() { @@ -1012,182 +1063,182 @@ namespace keepass2android public partial class String { - // aapt resource value: 0x7f050025 - public const int AboutText = 2131034149; - - // aapt resource value: 0x7f0500f3 - public const int AskDeletePermanentlyEntry = 2131034355; - - // aapt resource value: 0x7f0500f4 - public const int AskDeletePermanentlyGroup = 2131034356; + // aapt resource value: 0x7f050026 + public const int AboutText = 2131034150; // aapt resource value: 0x7f0500f5 - public const int AskDeletePermanently_title = 2131034357; - - // aapt resource value: 0x7f0500f8 - public const int AskDiscardChanges = 2131034360; - - // aapt resource value: 0x7f0500f9 - public const int AskDiscardChanges_title = 2131034361; - - // aapt resource value: 0x7f0500ed - public const int AskOverwriteBinary = 2131034349; - - // aapt resource value: 0x7f0500f0 - public const int AskOverwriteBinary_no = 2131034352; - - // aapt resource value: 0x7f0500ee - public const int AskOverwriteBinary_title = 2131034350; - - // aapt resource value: 0x7f0500ef - public const int AskOverwriteBinary_yes = 2131034351; - - // aapt resource value: 0x7f0500f7 - public const int AskReloadFile = 2131034359; + public const int AskDeletePermanentlyEntry = 2131034357; // aapt resource value: 0x7f0500f6 - public const int AskReloadFile_title = 2131034358; + public const int AskDeletePermanentlyGroup = 2131034358; - // aapt resource value: 0x7f0500f1 - public const int AttachFailed = 2131034353; + // aapt resource value: 0x7f0500f7 + public const int AskDeletePermanently_title = 2131034359; - // aapt resource value: 0x7f050017 - public const int BinaryDirectory_default = 2131034135; + // aapt resource value: 0x7f0500fa + public const int AskDiscardChanges = 2131034362; - // aapt resource value: 0x7f050016 - public const int BinaryDirectory_key = 2131034134; + // aapt resource value: 0x7f0500fb + public const int AskDiscardChanges_title = 2131034363; - // aapt resource value: 0x7f0500df - public const int BinaryDirectory_summary = 2131034335; - - // aapt resource value: 0x7f0500de - public const int BinaryDirectory_title = 2131034334; - - // aapt resource value: 0x7f0500fe - public const int ChangeLog = 2131034366; - - // aapt resource value: 0x7f0500fd - public const int ChangeLog_title = 2131034365; - - // aapt resource value: 0x7f050039 - public const int ClearClipboard = 2131034169; - - // aapt resource value: 0x7f050026 - public const int CreditsText = 2131034150; - - // aapt resource value: 0x7f05006f - public const int FileNotFound = 2131034223; - - // aapt resource value: 0x7f050082 - public const int InvalidPassword = 2131034242; - - // aapt resource value: 0x7f05001c - public const int LastInfoVersionCode_key = 2131034140; - - // aapt resource value: 0x7f05001e - public const int MarketURL = 2131034142; - - // aapt resource value: 0x7f05008c - public const int MaskedPassword = 2131034252; - - // aapt resource value: 0x7f050018 - public const int QuickUnlockDefaultEnabled_key = 2131034136; - - // aapt resource value: 0x7f0500da - public const int QuickUnlockDefaultEnabled_summary = 2131034330; - - // aapt resource value: 0x7f0500d9 - public const int QuickUnlockDefaultEnabled_title = 2131034329; - - // aapt resource value: 0x7f05001a - public const int QuickUnlockLength_default = 2131034138; - - // aapt resource value: 0x7f050019 - public const int QuickUnlockLength_key = 2131034137; - - // aapt resource value: 0x7f0500dc - public const int QuickUnlockLength_summary = 2131034332; - - // aapt resource value: 0x7f0500db - public const int QuickUnlockLength_title = 2131034331; - - // aapt resource value: 0x7f0500d7 - public const int QuickUnlock_button = 2131034327; - - // aapt resource value: 0x7f0500dd - public const int QuickUnlock_fail = 2131034333; - - // aapt resource value: 0x7f0500d6 - public const int QuickUnlock_label = 2131034326; - - // aapt resource value: 0x7f0500d8 - public const int QuickUnlock_lockButton = 2131034328; + // aapt resource value: 0x7f0500ef + public const int AskOverwriteBinary = 2131034351; // aapt resource value: 0x7f0500f2 - public const int RecycleBin = 2131034354; + public const int AskOverwriteBinary_no = 2131034354; + + // aapt resource value: 0x7f0500f0 + public const int AskOverwriteBinary_title = 2131034352; + + // aapt resource value: 0x7f0500f1 + public const int AskOverwriteBinary_yes = 2131034353; + + // aapt resource value: 0x7f0500f9 + public const int AskReloadFile = 2131034361; + + // aapt resource value: 0x7f0500f8 + public const int AskReloadFile_title = 2131034360; + + // aapt resource value: 0x7f0500f3 + public const int AttachFailed = 2131034355; + + // aapt resource value: 0x7f050018 + public const int BinaryDirectory_default = 2131034136; + + // aapt resource value: 0x7f050017 + public const int BinaryDirectory_key = 2131034135; // aapt resource value: 0x7f0500e1 - public const int SaveAttachment_Failed = 2131034337; + public const int BinaryDirectory_summary = 2131034337; // aapt resource value: 0x7f0500e0 - public const int SaveAttachment_doneMessage = 2131034336; + public const int BinaryDirectory_title = 2131034336; + + // aapt resource value: 0x7f050100 + public const int ChangeLog = 2131034368; + + // aapt resource value: 0x7f0500ff + public const int ChangeLog_title = 2131034367; + + // aapt resource value: 0x7f05003a + public const int ClearClipboard = 2131034170; + + // aapt resource value: 0x7f050027 + public const int CreditsText = 2131034151; + + // aapt resource value: 0x7f050070 + public const int FileNotFound = 2131034224; + + // aapt resource value: 0x7f050083 + public const int InvalidPassword = 2131034243; + + // aapt resource value: 0x7f05001d + public const int LastInfoVersionCode_key = 2131034141; // aapt resource value: 0x7f05001f - public const int SuggestionsURL = 2131034143; + public const int MarketURL = 2131034143; + + // aapt resource value: 0x7f05008d + public const int MaskedPassword = 2131034253; + + // aapt resource value: 0x7f050019 + public const int QuickUnlockDefaultEnabled_key = 2131034137; + + // aapt resource value: 0x7f0500dc + public const int QuickUnlockDefaultEnabled_summary = 2131034332; + + // aapt resource value: 0x7f0500db + public const int QuickUnlockDefaultEnabled_title = 2131034331; + + // aapt resource value: 0x7f05001b + public const int QuickUnlockLength_default = 2131034139; + + // aapt resource value: 0x7f05001a + public const int QuickUnlockLength_key = 2131034138; + + // aapt resource value: 0x7f0500de + public const int QuickUnlockLength_summary = 2131034334; + + // aapt resource value: 0x7f0500dd + public const int QuickUnlockLength_title = 2131034333; + + // aapt resource value: 0x7f0500d9 + public const int QuickUnlock_button = 2131034329; + + // aapt resource value: 0x7f0500df + public const int QuickUnlock_fail = 2131034335; + + // aapt resource value: 0x7f0500d8 + public const int QuickUnlock_label = 2131034328; + + // aapt resource value: 0x7f0500da + public const int QuickUnlock_lockButton = 2131034330; + + // aapt resource value: 0x7f0500f4 + public const int RecycleBin = 2131034356; + + // aapt resource value: 0x7f0500e3 + public const int SaveAttachment_Failed = 2131034339; + + // aapt resource value: 0x7f0500e2 + public const int SaveAttachment_doneMessage = 2131034338; + + // aapt resource value: 0x7f050020 + public const int SuggestionsURL = 2131034144; // aapt resource value: 0x7f050014 public const int TanExpiresOnUse_key = 2131034132; - // aapt resource value: 0x7f0500ca - public const int TanExpiresOnUse_summary = 2131034314; + // aapt resource value: 0x7f0500cc + public const int TanExpiresOnUse_summary = 2131034316; - // aapt resource value: 0x7f0500c9 - public const int TanExpiresOnUse_title = 2131034313; + // aapt resource value: 0x7f0500cb + public const int TanExpiresOnUse_title = 2131034315; - // aapt resource value: 0x7f050020 - public const int TranslationURL = 2131034144; + // aapt resource value: 0x7f050021 + public const int TranslationURL = 2131034145; - // aapt resource value: 0x7f05001b - public const int UsageCount_key = 2131034139; + // aapt resource value: 0x7f05001c + public const int UsageCount_key = 2131034140; - // aapt resource value: 0x7f05001d - public const int UseFileTransactions_key = 2131034141; + // aapt resource value: 0x7f05001e + public const int UseFileTransactions_key = 2131034142; - // aapt resource value: 0x7f0500ec - public const int UseFileTransactions_summary = 2131034348; + // aapt resource value: 0x7f0500ee + public const int UseFileTransactions_summary = 2131034350; - // aapt resource value: 0x7f0500eb - public const int UseFileTransactions_title = 2131034347; - - // aapt resource value: 0x7f050023 - public const int about_feedback = 2131034147; + // aapt resource value: 0x7f0500ed + public const int UseFileTransactions_title = 2131034349; // aapt resource value: 0x7f050024 - public const int about_homepage = 2131034148; + public const int about_feedback = 2131034148; - // aapt resource value: 0x7f050027 - public const int accept = 2131034151; - - // aapt resource value: 0x7f0500e7 - public const int add_binary = 2131034343; + // aapt resource value: 0x7f050025 + public const int about_homepage = 2131034149; // aapt resource value: 0x7f050028 - public const int add_entry = 2131034152; + public const int accept = 2131034152; - // aapt resource value: 0x7f0500e8 - public const int add_extra_string = 2131034344; + // aapt resource value: 0x7f0500e9 + public const int add_binary = 2131034345; // aapt resource value: 0x7f050029 - public const int add_group = 2131034153; + public const int add_entry = 2131034153; + + // aapt resource value: 0x7f0500ea + public const int add_extra_string = 2131034346; // aapt resource value: 0x7f05002a - public const int add_group_title = 2131034154; + public const int add_group = 2131034154; // aapt resource value: 0x7f05002b - public const int algorithm = 2131034155; + public const int add_group_title = 2131034155; // aapt resource value: 0x7f05002c - public const int algorithm_colon = 2131034156; + public const int algorithm = 2131034156; + + // aapt resource value: 0x7f05002d + public const int algorithm_colon = 2131034157; // aapt resource value: 0x7f050008 public const int algorithm_key = 2131034120; @@ -1195,299 +1246,305 @@ namespace keepass2android // aapt resource value: 0x7f050009 public const int app_key = 2131034121; - // aapt resource value: 0x7f05002d - public const int app_name = 2131034157; + // aapt resource value: 0x7f05002e + public const int app_name = 2131034158; - // aapt resource value: 0x7f05002f - public const int app_name_nonet = 2131034159; + // aapt resource value: 0x7f050030 + public const int app_name_nonet = 2131034160; - // aapt resource value: 0x7f050031 - public const int app_timeout = 2131034161; + // aapt resource value: 0x7f050032 + public const int app_timeout = 2131034162; // aapt resource value: 0x7f05000a public const int app_timeout_key = 2131034122; - // aapt resource value: 0x7f050032 - public const int app_timeout_summary = 2131034162; - // aapt resource value: 0x7f050033 - public const int application = 2131034163; + public const int app_timeout_summary = 2131034163; // aapt resource value: 0x7f050034 - public const int application_settings = 2131034164; + public const int application = 2131034164; // aapt resource value: 0x7f050035 - public const int brackets = 2131034165; + public const int application_settings = 2131034165; // aapt resource value: 0x7f050036 - public const int browser_intall_text = 2131034166; + public const int brackets = 2131034166; // aapt resource value: 0x7f050037 - public const int building_search_idx = 2131034167; + public const int browser_intall_text = 2131034167; // aapt resource value: 0x7f050038 - public const int cancel = 2131034168; + public const int building_search_idx = 2131034168; - // aapt resource value: 0x7f0500ce - public const int caseSensitive = 2131034318; + // aapt resource value: 0x7f050039 + public const int cancel = 2131034169; - // aapt resource value: 0x7f05003a - public const int clipboard_timeout = 2131034170; + // aapt resource value: 0x7f0500d0 + public const int caseSensitive = 2131034320; - // aapt resource value: 0x7f050021 - public const int clipboard_timeout_default = 2131034145; + // aapt resource value: 0x7f05003b + public const int clipboard_timeout = 2131034171; + + // aapt resource value: 0x7f050022 + public const int clipboard_timeout_default = 2131034146; // aapt resource value: 0x7f05000b public const int clipboard_timeout_key = 2131034123; - // aapt resource value: 0x7f05003b - public const int clipboard_timeout_summary = 2131034171; - - // aapt resource value: 0x7f05003d - public const int copy_password = 2131034173; - // aapt resource value: 0x7f05003c - public const int copy_username = 2131034172; + public const int clipboard_timeout_summary = 2131034172; // aapt resource value: 0x7f05003e - public const int creating_db_key = 2131034174; + public const int copy_password = 2131034174; - // aapt resource value: 0x7f0500ea - public const int credentials_dialog_title = 2131034346; + // aapt resource value: 0x7f05003d + public const int copy_username = 2131034173; // aapt resource value: 0x7f05003f - public const int current_group = 2131034175; + public const int creating_db_key = 2131034175; + + // aapt resource value: 0x7f0500ec + public const int credentials_dialog_title = 2131034348; // aapt resource value: 0x7f050040 - public const int current_group_root = 2131034176; + public const int current_group = 2131034176; // aapt resource value: 0x7f050041 - public const int database = 2131034177; + public const int current_group_root = 2131034177; - // aapt resource value: 0x7f0500e9 - public const int database_loaded_quickunlock_enabled = 2131034345; + // aapt resource value: 0x7f050042 + public const int database = 2131034178; + + // aapt resource value: 0x7f0500eb + public const int database_loaded_quickunlock_enabled = 2131034347; + + // aapt resource value: 0x7f0500b7 + public const int database_name = 2131034295; + + // aapt resource value: 0x7f050016 + public const int database_name_key = 2131034134; // aapt resource value: 0x7f05000c public const int db_key = 2131034124; - // aapt resource value: 0x7f050042 - public const int decrypting_db = 2131034178; - // aapt resource value: 0x7f050043 - public const int decrypting_entry = 2131034179; + public const int decrypting_db = 2131034179; // aapt resource value: 0x7f050044 - public const int default_checkbox = 2131034180; + public const int decrypting_entry = 2131034180; + + // aapt resource value: 0x7f050045 + public const int default_checkbox = 2131034181; // aapt resource value: 0x7f050001 public const int default_file_path = 2131034113; - // aapt resource value: 0x7f0500b6 - public const int default_username = 2131034294; + // aapt resource value: 0x7f0500b8 + public const int default_username = 2131034296; // aapt resource value: 0x7f050015 public const int default_username_key = 2131034133; - // aapt resource value: 0x7f050045 - public const int digits = 2131034181; - // aapt resource value: 0x7f050046 - public const int disclaimer_formal = 2131034182; + public const int digits = 2131034182; + + // aapt resource value: 0x7f050047 + public const int disclaimer_formal = 2131034183; // aapt resource value: 0x7f050002 public const int donate_url = 2131034114; - // aapt resource value: 0x7f050047 - public const int ellipsis = 2131034183; - - // aapt resource value: 0x7f0500d5 - public const int enable_quickunlock = 2131034325; - // aapt resource value: 0x7f050048 - public const int enter_filename = 2131034184; + public const int ellipsis = 2131034184; - // aapt resource value: 0x7f0500d4 - public const int enter_filename_details_create_import = 2131034324; - - // aapt resource value: 0x7f0500d3 - public const int enter_filename_details_url = 2131034323; + // aapt resource value: 0x7f0500d7 + public const int enable_quickunlock = 2131034327; // aapt resource value: 0x7f050049 - public const int entry_accessed = 2131034185; + public const int enter_filename = 2131034185; + + // aapt resource value: 0x7f0500d6 + public const int enter_filename_details_create_import = 2131034326; + + // aapt resource value: 0x7f0500d5 + public const int enter_filename_details_url = 2131034325; // aapt resource value: 0x7f05004a - public const int entry_and_or = 2131034186; - - // aapt resource value: 0x7f05005a - public const int entry_binaries = 2131034202; + public const int entry_accessed = 2131034186; // aapt resource value: 0x7f05004b - public const int entry_cancel = 2131034187; - - // aapt resource value: 0x7f05004c - public const int entry_comment = 2131034188; - - // aapt resource value: 0x7f05004f - public const int entry_confpassword = 2131034191; - - // aapt resource value: 0x7f050050 - public const int entry_created = 2131034192; - - // aapt resource value: 0x7f050051 - public const int entry_expires = 2131034193; - - // aapt resource value: 0x7f050059 - public const int entry_extra_strings = 2131034201; - - // aapt resource value: 0x7f050052 - public const int entry_keyfile = 2131034194; - - // aapt resource value: 0x7f050053 - public const int entry_modified = 2131034195; - - // aapt resource value: 0x7f05004e - public const int entry_override_url = 2131034190; - - // aapt resource value: 0x7f050054 - public const int entry_password = 2131034196; - - // aapt resource value: 0x7f050055 - public const int entry_save = 2131034197; - - // aapt resource value: 0x7f05004d - public const int entry_tags = 2131034189; - - // aapt resource value: 0x7f050056 - public const int entry_title = 2131034198; - - // aapt resource value: 0x7f050057 - public const int entry_url = 2131034199; - - // aapt resource value: 0x7f050058 - public const int entry_user_name = 2131034200; + public const int entry_and_or = 2131034187; // aapt resource value: 0x7f05005b - public const int error_arc4 = 2131034203; + public const int entry_binaries = 2131034203; + + // aapt resource value: 0x7f05004c + public const int entry_cancel = 2131034188; + + // aapt resource value: 0x7f05004d + public const int entry_comment = 2131034189; + + // aapt resource value: 0x7f050050 + public const int entry_confpassword = 2131034192; + + // aapt resource value: 0x7f050051 + public const int entry_created = 2131034193; + + // aapt resource value: 0x7f050052 + public const int entry_expires = 2131034194; + + // aapt resource value: 0x7f05005a + public const int entry_extra_strings = 2131034202; + + // aapt resource value: 0x7f050053 + public const int entry_keyfile = 2131034195; + + // aapt resource value: 0x7f050054 + public const int entry_modified = 2131034196; + + // aapt resource value: 0x7f05004f + public const int entry_override_url = 2131034191; + + // aapt resource value: 0x7f050055 + public const int entry_password = 2131034197; + + // aapt resource value: 0x7f050056 + public const int entry_save = 2131034198; + + // aapt resource value: 0x7f05004e + public const int entry_tags = 2131034190; + + // aapt resource value: 0x7f050057 + public const int entry_title = 2131034199; + + // aapt resource value: 0x7f050058 + public const int entry_url = 2131034200; + + // aapt resource value: 0x7f050059 + public const int entry_user_name = 2131034201; // aapt resource value: 0x7f05005c - public const int error_can_not_handle_uri = 2131034204; + public const int error_arc4 = 2131034204; // aapt resource value: 0x7f05005d - public const int error_could_not_create_group = 2131034205; + public const int error_can_not_handle_uri = 2131034205; // aapt resource value: 0x7f05005e - public const int error_could_not_create_parent = 2131034206; + public const int error_could_not_create_group = 2131034206; // aapt resource value: 0x7f05005f - public const int error_database_exists = 2131034207; + public const int error_could_not_create_parent = 2131034207; // aapt resource value: 0x7f050060 - public const int error_database_settings = 2131034208; + public const int error_database_exists = 2131034208; // aapt resource value: 0x7f050061 - public const int error_failed_to_launch_link = 2131034209; - - // aapt resource value: 0x7f050063 - public const int error_file_not_create = 2131034211; + public const int error_database_settings = 2131034209; // aapt resource value: 0x7f050062 - public const int error_filename_required = 2131034210; + public const int error_failed_to_launch_link = 2131034210; // aapt resource value: 0x7f050064 - public const int error_invalid_db = 2131034212; + public const int error_file_not_create = 2131034212; - // aapt resource value: 0x7f0500e2 - public const int error_invalid_expiry_date = 2131034338; + // aapt resource value: 0x7f050063 + public const int error_filename_required = 2131034211; // aapt resource value: 0x7f050065 - public const int error_invalid_path = 2131034213; - - // aapt resource value: 0x7f050066 - public const int error_no_name = 2131034214; - - // aapt resource value: 0x7f050067 - public const int error_nopass = 2131034215; - - // aapt resource value: 0x7f050068 - public const int error_out_of_memory = 2131034216; - - // aapt resource value: 0x7f050069 - public const int error_pass_gen_type = 2131034217; - - // aapt resource value: 0x7f05006a - public const int error_pass_match = 2131034218; - - // aapt resource value: 0x7f05006b - public const int error_rounds_not_number = 2131034219; - - // aapt resource value: 0x7f05006c - public const int error_rounds_too_large = 2131034220; - - // aapt resource value: 0x7f0500e3 - public const int error_string_key = 2131034339; - - // aapt resource value: 0x7f05006d - public const int error_title_required = 2131034221; - - // aapt resource value: 0x7f05006e - public const int error_wrong_length = 2131034222; - - // aapt resource value: 0x7f0500cc - public const int excludeExpiredEntries = 2131034316; + public const int error_invalid_db = 2131034213; // aapt resource value: 0x7f0500e4 - public const int field_name = 2131034340; + public const int error_invalid_expiry_date = 2131034340; + + // aapt resource value: 0x7f050066 + public const int error_invalid_path = 2131034214; + + // aapt resource value: 0x7f050067 + public const int error_no_name = 2131034215; + + // aapt resource value: 0x7f050068 + public const int error_nopass = 2131034216; + + // aapt resource value: 0x7f050069 + public const int error_out_of_memory = 2131034217; + + // aapt resource value: 0x7f05006a + public const int error_pass_gen_type = 2131034218; + + // aapt resource value: 0x7f05006b + public const int error_pass_match = 2131034219; + + // aapt resource value: 0x7f05006c + public const int error_rounds_not_number = 2131034220; + + // aapt resource value: 0x7f05006d + public const int error_rounds_too_large = 2131034221; // aapt resource value: 0x7f0500e5 - public const int field_value = 2131034341; + public const int error_string_key = 2131034341; - // aapt resource value: 0x7f050070 - public const int file_browser = 2131034224; + // aapt resource value: 0x7f05006e + public const int error_title_required = 2131034222; + + // aapt resource value: 0x7f05006f + public const int error_wrong_length = 2131034223; + + // aapt resource value: 0x7f0500ce + public const int excludeExpiredEntries = 2131034318; + + // aapt resource value: 0x7f0500e6 + public const int field_name = 2131034342; + + // aapt resource value: 0x7f0500e7 + public const int field_value = 2131034343; // aapt resource value: 0x7f050071 - public const int generate_password = 2131034225; + public const int file_browser = 2131034225; // aapt resource value: 0x7f050072 - public const int group = 2131034226; + public const int generate_password = 2131034226; // aapt resource value: 0x7f050073 - public const int hint_comment = 2131034227; + public const int group = 2131034227; // aapt resource value: 0x7f050074 - public const int hint_conf_pass = 2131034228; + public const int hint_comment = 2131034228; // aapt resource value: 0x7f050075 - public const int hint_generated_password = 2131034229; + public const int hint_conf_pass = 2131034229; // aapt resource value: 0x7f050076 - public const int hint_group_name = 2131034230; + public const int hint_generated_password = 2131034230; // aapt resource value: 0x7f050077 - public const int hint_keyfile = 2131034231; + public const int hint_group_name = 2131034231; // aapt resource value: 0x7f050078 - public const int hint_length = 2131034232; - - // aapt resource value: 0x7f05007a - public const int hint_login_pass = 2131034234; - - // aapt resource value: 0x7f05007d - public const int hint_override_url = 2131034237; + public const int hint_keyfile = 2131034232; // aapt resource value: 0x7f050079 - public const int hint_pass = 2131034233; - - // aapt resource value: 0x7f05007e - public const int hint_tags = 2131034238; + public const int hint_length = 2131034233; // aapt resource value: 0x7f05007b - public const int hint_title = 2131034235; + public const int hint_login_pass = 2131034235; - // aapt resource value: 0x7f05007c - public const int hint_url = 2131034236; + // aapt resource value: 0x7f05007e + public const int hint_override_url = 2131034238; + + // aapt resource value: 0x7f05007a + public const int hint_pass = 2131034234; // aapt resource value: 0x7f05007f - public const int hint_username = 2131034239; + public const int hint_tags = 2131034239; + + // aapt resource value: 0x7f05007c + public const int hint_title = 2131034236; + + // aapt resource value: 0x7f05007d + public const int hint_url = 2131034237; + + // aapt resource value: 0x7f050080 + public const int hint_username = 2131034240; // aapt resource value: 0x7f050003 public const int homepage = 2131034115; @@ -1495,134 +1552,134 @@ namespace keepass2android // aapt resource value: 0x7f050004 public const int homepage_short = 2131034116; - // aapt resource value: 0x7f050080 - public const int install_from_market = 2131034240; - // aapt resource value: 0x7f050081 - public const int install_from_website = 2131034241; + public const int install_from_market = 2131034241; - // aapt resource value: 0x7f050083 - public const int invalid_algorithm = 2131034243; + // aapt resource value: 0x7f050082 + public const int install_from_website = 2131034242; // aapt resource value: 0x7f050084 - public const int invalid_db_sig = 2131034244; + public const int invalid_algorithm = 2131034244; + + // aapt resource value: 0x7f050085 + public const int invalid_db_sig = 2131034245; // aapt resource value: 0x7f050005 public const int issues = 2131034117; - // aapt resource value: 0x7f050085 - public const int keyfile_does_not_exist = 2131034245; - // aapt resource value: 0x7f050086 - public const int keyfile_is_empty = 2131034246; + public const int keyfile_does_not_exist = 2131034246; + + // aapt resource value: 0x7f050087 + public const int keyfile_is_empty = 2131034247; // aapt resource value: 0x7f05000e public const int keyfile_key = 2131034126; - // aapt resource value: 0x7f0500cb - public const int kp2a_findUrl = 2131034315; + // aapt resource value: 0x7f0500cd + public const int kp2a_findUrl = 2131034317; - // aapt resource value: 0x7f050087 - public const int length = 2131034247; + // aapt resource value: 0x7f050088 + public const int length = 2131034248; // aapt resource value: 0x7f050000 public const int library_name = 2131034112; - // aapt resource value: 0x7f050022 - public const int list_size_default = 2131034146; + // aapt resource value: 0x7f050023 + public const int list_size_default = 2131034147; // aapt resource value: 0x7f050011 public const int list_size_key = 2131034129; - // aapt resource value: 0x7f050089 - public const int list_size_summary = 2131034249; - - // aapt resource value: 0x7f050088 - public const int list_size_title = 2131034248; - // aapt resource value: 0x7f05008a - public const int loading_database = 2131034250; + public const int list_size_summary = 2131034250; + + // aapt resource value: 0x7f050089 + public const int list_size_title = 2131034249; // aapt resource value: 0x7f05008b - public const int lowercase = 2131034251; + public const int loading_database = 2131034251; + + // aapt resource value: 0x7f05008c + public const int lowercase = 2131034252; // aapt resource value: 0x7f05000f public const int maskpass_key = 2131034127; - // aapt resource value: 0x7f05008e - public const int maskpass_summary = 2131034254; - - // aapt resource value: 0x7f05008d - public const int maskpass_title = 2131034253; - // aapt resource value: 0x7f05008f - public const int menu_about = 2131034255; + public const int maskpass_summary = 2131034255; - // aapt resource value: 0x7f050094 - public const int menu_app_settings = 2131034260; + // aapt resource value: 0x7f05008e + public const int maskpass_title = 2131034254; // aapt resource value: 0x7f050090 - public const int menu_change_key = 2131034256; - - // aapt resource value: 0x7f050091 - public const int menu_copy_pass = 2131034257; - - // aapt resource value: 0x7f050092 - public const int menu_copy_user = 2131034258; - - // aapt resource value: 0x7f050093 - public const int menu_create = 2131034259; + public const int menu_about = 2131034256; // aapt resource value: 0x7f050095 - public const int menu_db_settings = 2131034261; + public const int menu_app_settings = 2131034261; + + // aapt resource value: 0x7f050091 + public const int menu_change_key = 2131034257; + + // aapt resource value: 0x7f050092 + public const int menu_copy_pass = 2131034258; + + // aapt resource value: 0x7f050093 + public const int menu_copy_user = 2131034259; + + // aapt resource value: 0x7f050094 + public const int menu_create = 2131034260; // aapt resource value: 0x7f050096 - public const int menu_delete = 2131034262; + public const int menu_db_settings = 2131034262; // aapt resource value: 0x7f050097 - public const int menu_donate = 2131034263; + public const int menu_delete = 2131034263; // aapt resource value: 0x7f050098 - public const int menu_edit = 2131034264; + public const int menu_donate = 2131034264; // aapt resource value: 0x7f050099 - public const int menu_hide_password = 2131034265; + public const int menu_edit = 2131034265; // aapt resource value: 0x7f05009a - public const int menu_homepage = 2131034266; + public const int menu_hide_password = 2131034266; // aapt resource value: 0x7f05009b - public const int menu_lock = 2131034267; + public const int menu_homepage = 2131034267; // aapt resource value: 0x7f05009c - public const int menu_open = 2131034268; + public const int menu_lock = 2131034268; // aapt resource value: 0x7f05009d - public const int menu_rename = 2131034269; + public const int menu_open = 2131034269; // aapt resource value: 0x7f05009e - public const int menu_search = 2131034270; + public const int menu_rename = 2131034270; // aapt resource value: 0x7f05009f - public const int menu_url = 2131034271; + public const int menu_search = 2131034271; // aapt resource value: 0x7f0500a0 - public const int minus = 2131034272; + public const int menu_url = 2131034272; // aapt resource value: 0x7f0500a1 - public const int never = 2131034273; + public const int minus = 2131034273; - // aapt resource value: 0x7f0500a3 - public const int no = 2131034275; + // aapt resource value: 0x7f0500a2 + public const int never = 2131034274; // aapt resource value: 0x7f0500a4 - public const int no_keys = 2131034276; + public const int no = 2131034276; // aapt resource value: 0x7f0500a5 - public const int no_results = 2131034277; + public const int no_keys = 2131034277; // aapt resource value: 0x7f0500a6 - public const int no_url_handler = 2131034278; + public const int no_results = 2131034278; + + // aapt resource value: 0x7f0500a7 + public const int no_url_handler = 2131034279; // aapt resource value: 0x7f050006 public const int oi_filemanager_market = 2131034118; @@ -1633,149 +1690,149 @@ namespace keepass2android // aapt resource value: 0x7f050010 public const int omitbackup_key = 2131034128; + // aapt resource value: 0x7f0500aa + public const int omitbackup_summary = 2131034282; + // aapt resource value: 0x7f0500a9 - public const int omitbackup_summary = 2131034281; + public const int omitbackup_title = 2131034281; // aapt resource value: 0x7f0500a8 - public const int omitbackup_title = 2131034280; - - // aapt resource value: 0x7f0500a7 - public const int open_recent = 2131034279; - - // aapt resource value: 0x7f0500aa - public const int pass_filename = 2131034282; + public const int open_recent = 2131034280; // aapt resource value: 0x7f0500ab - public const int password_title = 2131034283; + public const int pass_filename = 2131034283; // aapt resource value: 0x7f0500ac - public const int progress_create = 2131034284; + public const int password_title = 2131034284; // aapt resource value: 0x7f0500ad - public const int progress_title = 2131034285; - - // aapt resource value: 0x7f0500e6 - public const int protection = 2131034342; - - // aapt resource value: 0x7f0500fb - public const int rate_app = 2131034363; - - // aapt resource value: 0x7f0500c8 - public const int regular_expression = 2131034312; + public const int progress_create = 2131034285; // aapt resource value: 0x7f0500ae - public const int remember_keyfile_summary = 2131034286; + public const int progress_title = 2131034286; + + // aapt resource value: 0x7f0500e8 + public const int protection = 2131034344; + + // aapt resource value: 0x7f0500fd + public const int rate_app = 2131034365; + + // aapt resource value: 0x7f0500ca + public const int regular_expression = 2131034314; // aapt resource value: 0x7f0500af - public const int remember_keyfile_title = 2131034287; + public const int remember_keyfile_summary = 2131034287; // aapt resource value: 0x7f0500b0 - public const int remove_from_filelist = 2131034288; + public const int remember_keyfile_title = 2131034288; // aapt resource value: 0x7f0500b1 - public const int rijndael = 2131034289; + public const int remove_from_filelist = 2131034289; // aapt resource value: 0x7f0500b2 - public const int root = 2131034290; + public const int rijndael = 2131034290; // aapt resource value: 0x7f0500b3 - public const int rounds = 2131034291; + public const int root = 2131034291; // aapt resource value: 0x7f0500b4 - public const int rounds_explaination = 2131034292; + public const int rounds = 2131034292; // aapt resource value: 0x7f0500b5 - public const int rounds_hint = 2131034293; + public const int rounds_explaination = 2131034293; + + // aapt resource value: 0x7f0500b6 + public const int rounds_hint = 2131034294; // aapt resource value: 0x7f05000d public const int rounds_key = 2131034125; - // aapt resource value: 0x7f0500b7 - public const int saving_database = 2131034295; - - // aapt resource value: 0x7f0500be - public const int search_hint = 2131034302; + // aapt resource value: 0x7f0500b9 + public const int saving_database = 2131034297; // aapt resource value: 0x7f0500c0 - public const int search_in = 2131034304; + public const int search_hint = 2131034304; - // aapt resource value: 0x7f0500b9 - public const int search_label = 2131034297; + // aapt resource value: 0x7f0500c2 + public const int search_in = 2131034306; - // aapt resource value: 0x7f0500cd - public const int search_options = 2131034317; + // aapt resource value: 0x7f0500bb + public const int search_label = 2131034299; - // aapt resource value: 0x7f0500bf - public const int search_results = 2131034303; + // aapt resource value: 0x7f0500cf + public const int search_options = 2131034319; - // aapt resource value: 0x7f05002e - public const int short_app_name = 2131034158; + // aapt resource value: 0x7f0500c1 + public const int search_results = 2131034305; - // aapt resource value: 0x7f050030 - public const int short_app_name_nonet = 2131034160; + // aapt resource value: 0x7f05002f + public const int short_app_name = 2131034159; - // aapt resource value: 0x7f0500ba - public const int show_password = 2131034298; + // aapt resource value: 0x7f050031 + public const int short_app_name_nonet = 2131034161; // aapt resource value: 0x7f0500bc - public const int sort_db = 2131034300; + public const int show_password = 2131034300; + + // aapt resource value: 0x7f0500be + public const int sort_db = 2131034302; // aapt resource value: 0x7f050012 public const int sort_key = 2131034130; - // aapt resource value: 0x7f0500bb - public const int sort_name = 2131034299; - - // aapt resource value: 0x7f0500b8 - public const int space = 2131034296; - // aapt resource value: 0x7f0500bd - public const int special = 2131034301; + public const int sort_name = 2131034301; - // aapt resource value: 0x7f0500d0 - public const int start_create = 2131034320; + // aapt resource value: 0x7f0500ba + public const int space = 2131034298; + + // aapt resource value: 0x7f0500bf + public const int special = 2131034303; // aapt resource value: 0x7f0500d2 - public const int start_create_import = 2131034322; + public const int start_create = 2131034322; - // aapt resource value: 0x7f0500cf - public const int start_open_file = 2131034319; + // aapt resource value: 0x7f0500d4 + public const int start_create_import = 2131034324; // aapt resource value: 0x7f0500d1 - public const int start_open_url = 2131034321; + public const int start_open_file = 2131034321; - // aapt resource value: 0x7f0500fa - public const int suggest_improvements = 2131034362; + // aapt resource value: 0x7f0500d3 + public const int start_open_url = 2131034323; + + // aapt resource value: 0x7f0500fc + public const int suggest_improvements = 2131034364; // aapt resource value: 0x7f050013 public const int timeout_key = 2131034131; - // aapt resource value: 0x7f0500fc - public const int translate_app = 2131034364; - - // aapt resource value: 0x7f0500c1 - public const int twofish = 2131034305; - - // aapt resource value: 0x7f0500c2 - public const int underline = 2131034306; + // aapt resource value: 0x7f0500fe + public const int translate_app = 2131034366; // aapt resource value: 0x7f0500c3 - public const int unsupported_db_version = 2131034307; + public const int twofish = 2131034307; // aapt resource value: 0x7f0500c4 - public const int uppercase = 2131034308; - - // aapt resource value: 0x7f0500c7 - public const int version_label = 2131034311; + public const int underline = 2131034308; // aapt resource value: 0x7f0500c5 - public const int warning_read_only = 2131034309; + public const int unsupported_db_version = 2131034309; // aapt resource value: 0x7f0500c6 - public const int warning_unmounted = 2131034310; + public const int uppercase = 2131034310; - // aapt resource value: 0x7f0500a2 - public const int yes = 2131034274; + // aapt resource value: 0x7f0500c9 + public const int version_label = 2131034313; + + // aapt resource value: 0x7f0500c7 + public const int warning_read_only = 2131034311; + + // aapt resource value: 0x7f0500c8 + public const int warning_unmounted = 2131034312; + + // aapt resource value: 0x7f0500a3 + public const int yes = 2131034275; private String() { @@ -1785,12 +1842,21 @@ namespace keepass2android public partial class Style { - // aapt resource value: 0x7f090011 - public const int Base = 2131296273; + // aapt resource value: 0x7f090019 + public const int AdditionalStringLayout = 2131296281; + + // aapt resource value: 0x7f090012 + public const int Base = 2131296274; + + // aapt resource value: 0x7f090013 + public const int BottomBarActionButton = 2131296275; // aapt resource value: 0x7f090001 public const int Dialog = 2131296257; + // aapt resource value: 0x7f090010 + public const int EditEntryButton = 2131296272; + // aapt resource value: 0x7f090006 public const int ElementText = 2131296262; @@ -1809,8 +1875,8 @@ namespace keepass2android // aapt resource value: 0x7f09000f public const int EntryItem = 2131296271; - // aapt resource value: 0x7f090010 - public const int ExtraFieldHeader = 2131296272; + // aapt resource value: 0x7f090011 + public const int ExtraFieldHeader = 2131296273; // aapt resource value: 0x7f09000a public const int GroupAndEntryHeader = 2131296266; @@ -1827,9 +1893,27 @@ namespace keepass2android // aapt resource value: 0x7f090002 public const int GroupTextSmall = 2131296258; + // aapt resource value: 0x7f09001a + public const int MinusButton = 2131296282; + // aapt resource value: 0x7f090000 public const int NoTitleBar = 2131296256; + // aapt resource value: 0x7f090016 + public const int TextAppearance_EditEntry = 2131296278; + + // aapt resource value: 0x7f090015 + public const int TextAppearance_EditEntry_LabelSmall = 2131296277; + + // aapt resource value: 0x7f090014 + public const int TextAppearance_EditEntry_Small = 2131296276; + + // aapt resource value: 0x7f090017 + public const int TextAppearance_EditEntry_Value = 2131296279; + + // aapt resource value: 0x7f090018 + public const int TextAppearance_SmallHeading = 2131296280; + // aapt resource value: 0x7f090009 public const int WhiteOnBlack = 2131296265; diff --git a/src/keepass2android/Resources/drawable-hdpi/collections_collection.png b/src/keepass2android/Resources/drawable-hdpi/collections_collection.png new file mode 100644 index 0000000000000000000000000000000000000000..d1324014d0df9390f1cbe97a5afd4201471f5cbb GIT binary patch literal 1604 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=Gsgb#ptGS!0lYxt&p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaT(5-zPQ9SSkXrz>*(J3ovn(~mttdZN0qkk3Ox$j9 z!D${;ZwgMgn7iWCs}FRHJ}7FDq8cUyOg|tdJmCU4@T8xb2Tbopz=VCq$*h-wfoYqk zi(^Q|tv9oL{Y4xF+S1Er@$c=pD4{H6`0Atp?@gEFJue&gKR76VbiQKDj*8O5j@MlR zL|i!!hIVlL*tq#|bkJNMvy>P2*8BK|tNWLU&rtkaQW_qb{#fVqq6zM6m_i!30vNR% zSXVHJE?{yJ4_JSF{e!1WGg#)zy`SEYpRo50|Gf;8fBR?MIsfcHZGq&Uw;%UCPGHt) zsO1z4cwLqMtL4y3wF;F~&L^xX%nj50xa69PFR}1sO=##&unS=fJH%`tyQ;y=f`49% zmck>SPXcGAL^eo1+G}0&fBA!_6aG(^O@5$U5y-|^rg?{HySvH4^n;%hIXr$%5$*SI zc(i*>?_;}-++}V*6!!LUZm`T?EV-<@;S7`3Ra?pSoA;mpns=-;Z^k7f^9t69UgwKB zqGT>E=Q5B9ivIIcatC)E=iCpT=RCUCF=YhbWOIMOwu9xHmmH((#ERIZLX9*{tm`-ig2NhTk(-X2GO#{-4D8y4#@) zu@|0fDQBM}IEN{j?|y=9e3Ri4vQy$ z><@3Pci+&^a(RBS@sz@|HpjE;o0Oei9j@>1^Y7flB9T{f>D?j6gkOuVe80I}*01uJ z^23MoKgC^p`P9bY*FpC)v&%nkVOqFK`Qfp2;}FKS^!>7n7^MHL)-x>%O|PF_JyU^I zCFa!oHjM*q|7T^-j&NnP?>=>Z759P<@%=LU7l*hqhWy)Cr2E7t{Kb=rcmC9T@DvYR z_bmVUgjxU07CnBfpUmdKI;Vst054N##{d8T literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-hdpi/collections_new_label.png b/src/keepass2android/Resources/drawable-hdpi/collections_new_label.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c52c101378d6549f191e1af63799ad8c382461 GIT binary patch literal 1995 zcmaJ?dr%YS7EeM5;U%I#X=!B*6sNVxCLw_&HBdqjCVnKNqE6u318!EPcT<)IP{l4$a`TfrC zeCN#Uf6`JDeZ5}t!r^ef$w|TtY<xk?1pm`Dn4b} z(n0|gGCpMsTTBV$#bZ@?tE2G5502}l?j6eya5TI8UsI)vipR&ly z!}cyWNC6f@(0o4SFHzazG$0<)zyO;@r%LHj3?Pa{W3cF47WWN+NoUYO1{0)5QyFv~ zJDNvl0M8x@mQ5p*^D=}RpXI_%d`d2gs(B!&)9GlsNE)Ka0U2B_7o;;mCXS+Km*Vd#AvunaG4AetvkU^unN?HmO zi~oP9Qu#bui)O%o>;0d^+DwBQ1~XtSQmBz)jgyDDQmJ|I8W=(mO(udAEZt&SE`lQ3 zTtp4TZ(`FJfEbc0R4&gVLM-MbtF$PjlETSCJ_X~TDHJjuD=M196)>aN0=kgFNMLYT z3~mBT5FfXZ&4^|R7)w|oA}v(HDs%}e`x_g*EY>v)N;Q^Q2x}DY!m^DTL+~7Rm8mbtd0*`Jj(e@aO!1=p-WXtg{c=#=>^uJcdv=B13L@^o zTl3PlwiSOEcyX-6uedmO$2SwRmJ#or?Z;SM;gOZLeWA+AD4Vlc`!#>Q=XT}W^+NW+ zm(uUu3~XIAb7L7eu*+wkz-gQcNb`$vOX;^)RQPM%JG2G(>ejHCmyLx+(g;KTezznh z*JGP?rQWCgnE#q4=4UUnB_5x6ESQERD+Uu8GDo-h!1*oPNj7&S(CBXn*e=iNa8$SY zsJ)C$r+fxIPnU%Mdxhz$gVW%~w|!JA;g0?C@fkAysHq${O^hX_niP)UTq4vAw$R*8 z*hpV_U+^Ht6{`+@Yj6&w^Fr@D5f45P(Nj#D%}1tEMiYZ?oSYLR61$jIAN&(Zbi=Ef z&Nn;d9UTU!N<@!06`J?ezFHD{)BIjxO;wkJ2$2Tk3X7Ka=d6U}ruA7eYuQ$$mwvoSSz5WNT#;wUd!W!d* zIv!plQ&3%fFPNRRdcVIUL~p%})JqF}(#D_AOZ@uo(7aaW@Ml6qWruSFbp+PMffho4 z@y)vn?OJtn_4^6V=772oSFG;{_c(;0q)qNvaw73PSa1uTdju4 z$BEaD3sGiff0@Nmy5q{tacf*<&6Z)manAIp#*UQDnYNyrdnJN5tXO&Dfw6YS3gOWG zq6@2PKv`h6Xy8*`bzPljb~jhWt{A_dL-f-Z>G{&6_5Vb`N=n56*Y> zna`wZng`*uK%j5vqtD~f59Z{az~BPOUZ22bTchqYe@r0vmyQtG)~ucv)|(RT*0v)- zS!X>%#c0u5^6cK&4eY^J*)pKU;^z=4Pc*TbIuFvCbA~G z&*44Sl?1k(5Z5xdo+3M465W-zc4Ex9mau^cwzX8(UhnsEeqxJ+`YI0M z+&(3geN7qwrq@obx?sP9VG_Y{SFUYH6iZW~jN6Naq@xu6%&8-lK%xKEAVc6HwZ{{zvF zPw$1}M{cY+;m}2-gp;`TSL1lo##2vLmx zuUw%?S8((cv`ZwW&WEo1o-*d;ShTb+e?E_M!yT&Uu@%GU1=sI2IU!YeP9Q1%6W<{n A;Q#;t literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-hdpi/device_access_not_secure.png b/src/keepass2android/Resources/drawable-hdpi/device_access_not_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..23ee08bee74f2a027188535a359e3538e011e06d GIT binary patch literal 1542 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=uk)gSPv5BLplYxt&p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaLa!4}y`aR9TL84#CABECEH%ZgC_h&L>}jh^Y;G~M zurxL|cEf2NRBsA4w}ADU7~s^a4|I$^C~A?S8YToxKOiPN;Q~4Eq@S7xOz%a&ggxcl zl@kmMOckCkjv*Dd-psPi7IBm~{@kqGaA!wv71zOY<|2wmCpyhenAo2nsKccB$E_*i zX2gxipR6^F1+D=iO|6X5@kt8$D#zZu{UQHH-!9VcWbCHu?Qi}!%AeLXKL74dSz2D% zjalFCg<56_DKNrOv&-(g@3x=PED(%gets}>-hIaV2ep1Mef#Zs>tzXBp7UOZo8|{) z3z$tDU7S=>#A_JVANZ}5w~B-Dq2_(&?Uj3(AKZM9cT2c(PSVcE4^lSC?={voY<|GF z<6Pd{x3@A6@3nllIsHuG4jU%>PrD9k96#pY%^mWS%=r z+z(`)a~+paye|D=t&X#TPg1(icK$`?2b?!tTKuu^d00f+VVgNEJJU{^u*aD0%znZe zVeNF+blTdPo<>RMf;ch?eU7^wP>Xn{eB9{u5~ieQIa3`Eh=^O=>v`*6`)~gH4d-V3 ztj;m|euCR0yyD)MhTPA;H6BJDUnjiC=AHTZQit`d{`X4V!Va8hWASh}s@%V{V8)(f zo`;h6dNFM~;Jxmza9r|MFQ!A>r-jcl3I+6f8k|Zz`t1K^p`J6pTXpC2cpnhjG3DkD zi3T4u(Vl4a>8?Y1ntYQp=ur8eE1 zyX3~#d$E^PG!Rh;k4p&Sf5$J*EBQMP-~S^j+533g!yQcbcG=(m^;c?AL*e)D(T5wI n=AZU%VDW$;ht$X08JHR7zFP4)X2G^&ppx0s)z4*}Q$iB}x4uB1 literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-hdpi/ic_menu_remove_field_holo_light.png b/src/keepass2android/Resources/drawable-hdpi/ic_menu_remove_field_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..68b46005c7f8b579671ee03777e356a50acf1295 GIT binary patch literal 1157 zcmV;01bX|4P)z98&?p;e|PNwf#5(C>h#h^LFoU~pO3KI}RMv!8aA_QB`DmdxJSxpNM8&K>BZk3RbNKSMgcKji9Yp&;+Si>eeepOCU$2QZNTtBx!W0a!OM?n`sZ(WwV|Ep59AJ%N4GXL=%`u}qV}nfy zi?30nE;JD8++}GYmHVUvI9CGgLpet~5CttUUO4j~@|Y?fLk!?Ezyv4l z9+5|U1rvxl^XC}m5XS)nj4{q=nqTNKfh+xfk^3CuvBL(xa+`6Qe9CZ=Ur0l_09~Q@ z7FcGAI-_jygc{&;#yoZA7{X&yGaNwS3Z(Y?Gl$(z_X|BGklF7|bS|X$1=oE7lGX2x z1`aV36y))G+1{}r z1sB}@b-rYo$#k!m>K#9#Vc)9Xikb6j7Ae5vb5{8*+v}xx$1!g4r+uwK7uR!caF02B z&e&z0nl>+Te>s@){?2?Zo;Inm&Ms&8%yEw!$FK`m+A);LAo9_YOX=0m${Rmy${X#;tTr@dY%^lhr{YV`skyN4}*UI XO+$xsE#vw000000NkvXXu0mjf@PQ25 literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-hdpi/location_web_site.png b/src/keepass2android/Resources/drawable-hdpi/location_web_site.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6b8682abe8cdfd05470bd9b5b3dc6441b1ba03 GIT binary patch literal 3291 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 P`FF#?-r26$HZbl#6K$Lw literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-ldpi/collections_collection.png b/src/keepass2android/Resources/drawable-ldpi/collections_collection.png new file mode 100644 index 0000000000000000000000000000000000000000..fda13f1bebb588e4197131b72ac96e4b5cfc25ff GIT binary patch literal 1307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip)Y8@5)y%@w$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O_pUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnv1> zG!Lpb1-Dzwaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zPT$&;z`(%R>*?Yc zQgQ3e^u1opjv}qbyQGdD^E)Ea)XQbIX>F^S(v67UER`biN5wY?90_V+JvgJIUL$Ma zGL9d!6CPFZ-4ltNQ>a`$Gfltdq@HBixj8edzaKkN81q4rnf3fc?hkqj58Nf%F8`Rt zD0_N`V*o3Eq@SGY#eRk(Ha8f2Pv20w!F)R^+Cfp7@5KS58JC0(Bz<_gfYra8#YuoJIhpLdyK!CmJ*_NhlV)-}D$Z9Kf6<-gSLZq!PXvYdfMO0tZ4}SurTD0Muz%JhO4%x91~+J1RW#UWA_PG zc^Mv!X(}{$xS}gEB`);RZg+`)v8Tzn+Zm z6NILSu(CWV($;MFZOCSpIw5TSvC6*KzYWixY}wDK7sF&?9U}Ke+cQ63Ht=Y;_p!>j zgDc<0CZtT5wqTLS&RxC^(YH1(Tg2_YZhN9{(dNZ77^lX2C;z*yBmN-zz;*^^h6nqi UlsBvium%-Zp00i_>zopr0Pc&+djJ3c literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-ldpi/collections_new_label.png b/src/keepass2android/Resources/drawable-ldpi/collections_new_label.png new file mode 100644 index 0000000000000000000000000000000000000000..71dbfc4fb21ee9a99a8c2774073d4f63a36d75df GIT binary patch literal 1427 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip+`z=d)ydG*$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OnfUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dPPYJU z#_1M_-W1$!F~F%;ALtl;P}CwtHB1PYen3ok!Ub~RNk26YnBI$k3420(j41;H6RW3- zV@SoVH`A@X4+qE`y}ZRVEbt(^g@x85;TAtFKD!M+=9H8dURc;X`O%9Y*C|{|bxd>r zGVtX^vCGOFJ@|;(MSD?L?&F;WEdrO8JlmG`@lb!;?PbsJ{D1uH*z(uA9z6{Z?Qeh1 z#uPUBVZn{8T})RRy|*WIx;SYu$tJLUX$%NdP5@>MrdbZAJC;rqF8C&Hs&GU~a}P7y z37rhxZHyCta~80dIht3dX+2Bzd6JyK^TR>rOOxD$v|mP>)aLM*G?Z=NZPUC2{9qe7x=(+9>uT2AQ zS7c}Vj!*I3x34z*_^dBwqcv?uEX$@pe;5P}PTg528gyqR_mOf(u1+QEGr=)eoTXPx zF?^6dzq@XKlA@c&I?FYC-2P}L$zRdl!^U*7p z6!W+leg20hZxmb7;S{VnQ+eiH3$G0nDlh@b6Mw<&;$SmT>*Xo literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-ldpi/device_access_not_secure.png b/src/keepass2android/Resources/drawable-ldpi/device_access_not_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..84557bbee01edb36593d4cef4be7ed1b4f5b9a2d GIT binary patch literal 1269 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVi-$k5!t*wo0>$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1PCvUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfV zG!Lpb1-Dxaaq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zwrGA^%D}*w?&;zf zQgQ3e^u1n397I};C$FjJ;4({EsGuR%)%sC#jjj&s`~%ZJ@YZm8zs}X2uCbz3p<_WW z*R3C$*Znr0*BH!WWcV(nEZ9Qa?$DFCHsfMr_09k<*U+{etv&^XpSm-bWyWQ(t!a$x zlRuzZu}w5R@|l`~`m=*(5lq5+zB67sXt?9^Hs)y&Y`+s`J@$|LS}}PM-@&g6EIkde z2CQ+8vU7}=hwnc+XPqTO{65w-O{^E#+#eh{akoi)!*QwD>Sw=2bb>x8XGDDBeI|6R z%D!zEYt!xfo1R3U;k;HQzJM)I`?rnZ;ss$-h3y)(3+zqQ{|J@}@di62y_sZGrLAi_ z{n+0d6$RA`9&07A=RC3by6r;W54Z3b#^eW6_B~W_@V8)}RWEYkY1dclB%z+>*+#lA zF8#Es-L}pB)*R)U2`r3`4WA7~L^Qp00;UKmWUk)0xM4@e^lp}zhH|Mc?<-w%0$S=1 f*XuusZeV0^V05uMmKSpjR1kT(`njxgN@xNARRy&O literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-ldpi/ic_menu_remove_field_holo_light.png b/src/keepass2android/Resources/drawable-ldpi/ic_menu_remove_field_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bf251bc1eb3eda9599b2662179f67975bc7f7309 GIT binary patch literal 433 zcmV;i0Z#sjP)kdg00002VoOIv0RM-N z%)bBt010qNS#tmY3ljhU3ljkVnw%H_000McNliru-2@i}A~mh>EMEWs0YXVcK~zY` z?UX@I!ax*;zglBivU2f~F3_^DC{gA_dH^C`qzPQaTbKZq5ThPp)QxT>t-2vlrqgLK zEP1=8?f3qf`R2jCc3*1Cw+E%yo|E925Wo1KQ7x`zCYiQ&mj-=#OTQ`r3V|E0IAtQa zE{6{o(4{F4g0=xP0y83FA``LvJ?51WSz5gW$r%$7(=H+u1l$qxLc$`g-h(A#LYuR7 zibD5<@6=eDZ*G-Feu^o?(cKC#Q*c<_-Er#5BnV?kQ6*Juz)&?xHOZz>`~oy;u{04O011+yQ2B%XKVAj_h0GsZ$rL~W zbr2#~@U$2br45gkY7?ctGB98%;HP1c0!oAs0~%$L3TJ8j!BJfnxi^?;ATSCc68*uC zL5TzrKoE){0Fw%NN}P+dy)uGJWWN2HJ&Pb{J#ptHQ_1L>7#u5vyr16*8nW4ipIfAF5PNpm9Qoe2Vu! zh4JV#H9`|2IGTb<$;QRcH@H%>f-po(pjb4DCXH7yLXHwBE=ScsP!y920|K#Bp)y!T z83F-|ufhqjN{a9~{vfGARVZXEW{?j|hZ%HcAjE-TF6`?C`*OVkgV@1L*xM@*9_MmU zX^Ik25#wChCoW@Bu3;FIYSJ?Y!4w-1SulnwfzhN{ipgVvCe<6`$|jEmo|H=?gP|E( z`>$4yo5=YwY$pbnJWPx}q9W%VBL~}R*IR_VF9m!KJ6hAxR}{*NjVqxhHM^5N>D=gT?XXLF@b3u>?o@%n*_H99J<^tx;z$pEj zR{;ZdK5I@g4jG^Nqi*+k{P+F+oBDCr&fdSaWn-MIY)#hc^aUfKadB}_VgdFe7Q@`yZ8Av{3(_X@Bgjp9E$36Z9CqO(&G6*=h)LfyI51_Rn*!w zeegBpCN~bLJ{jm|Z9cs$yFte>3bAp2ll!!5K0octO|xpd=B$XCU1bzMXqz=ePrKw3 zk|fywvN0+#Wu==W*qYo=9ObwR9w0uU%B<_`Jyu zc+J1@eBj7dv?Zx#raSe~CAptvHRBYbol z?DKSa**c3pr)3=u*!Hj6pZitb$Lj75g!S4SV2>zIOYX71k?^XL1{<$mknYOcsV@{( zWTvyk%#z^h>W40u3QqSNPh!bkMD!GN_a<#~?Yh_+(`%cnURQ7muU~Xk1zdW3CcnlC zGFOarrVN~65zjo-?VBCIVRd1V5$+C25_zbtz2cNu~ z6;oR8F}Jmzk0H_C71qfajHTPG*Q0Si2diqYEU2;keg%*iR&*ym{7RlA+vi5PaOXx7 z`(j6K+J@xJ3l`6Wwl_}vcI|0*xu~JXR6}b!_Hyaos`T?8`eOgITid|(2zwgSw*=eL qQWu*sEFILd2S40W9JLzqtfRar9r=YFG6y&Ow)os|&dI=a8UFwl@6{3j literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-mdpi/collections_collection.png b/src/keepass2android/Resources/drawable-mdpi/collections_collection.png new file mode 100644 index 0000000000000000000000000000000000000000..3db304fa8d16bc1301b616ce21b3ab75680cad7f GIT binary patch literal 1443 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 literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-mdpi/location_web_site.png b/src/keepass2android/Resources/drawable-mdpi/location_web_site.png new file mode 100644 index 0000000000000000000000000000000000000000..6a2bc8857122baa03da7c29508fe5be9c6feebaa GIT binary patch literal 2529 zcmaJ@dpwi-AD^|kb#d>wBr_6W_r=C!8;Y#PMnh!H!}enr+t`T8${8o7qH-yz4w7=I zP?VZnL&{O7q+d>n(^XEXoQ^uvsm||@`aQ4L^L)SG&+GGke{S#B_w{7c*R5WtZ>bLg zffo9&@d?(fsJT~HTl3ujo>6KR3#l(l$`Hm%Wo$73BF6|f12BI+I}Qj2*fA-IJ%A?& zG|!&LWJy`HKq5!TN3iF75OTgqg9d>-SII?ePCOumZ3g0a0up?(I;kl1}; z@Bt(oF;67r2?ek@M)qc5l9UA3Wcp7De9>20f#h?WGz~+_*&-wwftoAnizAKp|6Td~ zuig@AFz|1_-z1hWQ$zqV7?22)#2n4wV(sQaiHKA&z?KTdOrbF0OBd-}p;Rd03Pms~ z1CKz%XlxEoFlYIMpwWo_0*RC@-~j$UB)EnH!Q;gc@lQ&2u=v@e=~Llb;) z6e`&dk9NaR&|k1VLQWDN5J8TA*FMn7}gufo+FzDgeuX!I`D2z$v2^n4IV zo8j+6X3B@36-OqRhM0EATKEUb=~WHPonW(}Mi|%iRM3#O5i`ef$5CXbxf$xu&9Bvk z@3x~IT94~xbBDM&L2AdX@q5f6;r07|4k3Hx+zO3ozD}us-gxic)WI>gp8l9vkCsS# zT5A5bWDl(D#mu|Id0U#uy{Ew@DPs_acZJO8;EY7o#-?3(Jie%PGEMENhAJpztzUH@ zvkDVMGFj+=6!LgemEPKv>dv)>TP-I;#-;-4hCeJg(sx)9y3dILoIbK$zcoO#@P0_Q zd7GKu2QwV`mo##HbYmG)lsPI^yDI$DO+_pAR)Kq=GFV^TXik~IvQ&r!+5+9=KK_VY z3n&^Cj};Nn28FfaVq8QIw^=1`cUDckATBWLsQ}BaMD)XS>TlnK zL@T5BYv{r1wQ}xHWx0em^m(2Nk$+8(;#bf#;2>~t0lTmh9yCfHz^7bs6TvoDx zl6luCaB@@k$QIoXpsDDt?)!=+sNRz-Rl2!@vLP;Kd6v-LaGNR4{Y41-hVIC$YAF22 z@Tkxc#Z&gX>2#jZR;qIYuQw8ok~-MMbJyc+Pb>l=8)dG4V%<`T+BKY)$T{)7^Rg zHAPRW==Wbn=1MH48j8&8x@>PDeD|MqI%}$BNqP}4d9!~so@|=&s_sRQ=UYd3$kv0b0IbV@)^Y| zZUd*Cfl%mRtJ>%3rn{a$mkmo@P}E&kBMpVu|rczSz}*_kHpG66+ZA?kA( z$^+{Kq-l|p_iFPC`d8nsoR;t|y-!cR6nWCR6HBf=AEoc(L`ig+f;^srs&|R*jGUXO z5H&=m-yIy8wYGiL$5t+;DJjnbixtMB|_zaU`|?@Qh?y6MUd5!lCmB{zs;n2Ca8 zlC#Rxr%BC2h|-0`0t3s;QQS&AcC09t#{~bzx8e z0f@Kqf$(d)-^g!t4eS>$PaDA2EX&H&w;|u&1Md$vue|!GH27`m_~ep-QdZR;^*i+a zM_PwhJ5*KtXwSf9nk^!n-P4kH`J#3_T2GU3uT;D zSqSx~e&+B5C3PtAvU|em^=7x^7wmkXm)bd-q6d#}-&kw*HfT^}7a#jPIzEe9IgjO( zHC@pn@@)ISf3zxX zB4$f>#fpifcE1nit8IrXJ!uDVH=<6C5>~Y-QGNp-lP(DIF20_scE1olFr%_Aj0#)M zJs1V)nVcBYS=6Gu-}wL!*<|6g5=_e14tb6}YCF8>x$xTK^??=eg`+1wbWc1P?AeC@ fbdhJ1KA1#V#NYmjjE+)tOk?>e6vO0?o{)yWsR literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable/btn_new_group.png b/src/keepass2android/Resources/drawable/btn_new_group.png index 44ffbbd825d8134a20783f1bbaa2304d53bd770e..748bd6e45cdbe398c35373dce663f0c155844f64 100644 GIT binary patch delta 772 zcmV+f1N;2S1(61j8Gix*007uvZqNV#00DDSM?wIu&K&6g000JJOGiWi$NOV32;bRa{vGf6951U69E94oEQKA00(qQO+^RY1PufaFvHeg^8f$>kx4{BR9M69 zn9EPoHcPh}iH1k$f`5bsBx)?7k@g%H&Fv+{ zc++V`Zo+TVX4=kto%8A`+}+(B?2?p&9n&6Y50q9cJh-mwx~`(c`GO!Qm&=-_Z5ycH z@893wbIxOzSF6?4)m5w2+P296K>13Vra6w|y6z775F$Q2JZ#%!-yti?Xf!%KJuMUp z|GYW$IUz)5K!5Z{F{W;}8yoym%jL4u=`8@h~h{*T-ZnrC)f!5{w zzHQsl-pfZBB4%PQ&beut03b12_8(}7XqqNtOz!dQfuexl6(Gjg@$vDl01?sQ;bA_X zPg`8WLVt#c>FbweS)nf@;%GElEEcs|tz0fA1G>DttW+wQWT5r6d%fOlHY*m3iGfO` zQmItR+@Cn-obyEQxo;GI5hzO2iSqR}b|_JaWm&B{9*>8^;d*T*BG+{pW6#gelgT8) zLd0Ay*KW6e7U<>WrQh#I9T^b;fDl4al-X=HoqbLt!y%#&;>UqZ)4aXCU2hGDXfPNo zm&>!WvsfPbrh~`~$S@4UFk*v~$>jb0-L~y|z5e@79Tp-0@O^)uhyE8JMBMy!@tZ)5 zF~(S;uAKcS(Dn7T=XtuW?*x#dC=$)OXS4l)cRA}Dqm`!UFK^Vt>vkA5+f=YW3L=dT8VDRN2qL+f;p&vy22;Tev-UJUG zJ$msf9uz9*LyU@0d?f)77DW?l>zZUd^jQeYrcJXm$rk4i1GCF6&+~uYXCNXXB4U;> z*~VJC2rK~o5#QEas`fs5AKx4^gI92!$rOGG-;Adu)PQm_YHAK|^7a0IvoJPA!8QS06Z zHb;z**pLp!_=oJn-!S z1N;I$0jIPlm;lNrzr>8&O)aav{gT8} zIn+l2d*};gj;NLLfSLM_p&ES-LWzx|YcZx2UDN3$s*#uzx~Q-^Ka2*VIj6qVNpwAQ$|xR^}|eTkNHbh}-wuC8KXVd0+^ z8u^e?s(1h*8h?*0h*qnW`Rs2t7z}WFdWxN$onirq2(?-bhlhu#R4T?6O4Af8D=WoH zh%tsVO|iDN2Bj3Pudj_kFvbvu;rQf+!y&e}x8eJ~IRGMp)*8O=6;5r3iCY$A?h#Bp3$=p!O*ZEcO` zMgf8#n9ynw#u&@3{me{kSr%N^MW@pNW2`U$r4*{ws*z2aI04JD@cjIYr>Cc>MV*Oo z>NpOhlx6{l2uYHl)oK}y{~s+$5(GgoAt$3zNNZiFe591{JP(X9BkO$Yg+^-)&+{OJ zF!s%F1%G%SK1&H8guwFhaybEr2#br0s8*}R6mz3GNNZhK?c@9Y*m1Si=ytn!eSO9H z`Z^koMm~Vu-CZ=B%|he<$Dh2qxDWF93LNlY7P()I-L#%g8?=-H#76V zR~ib11GugW*L5?W^?E(Lyu2U?0&Hw-l*@@nB@1H=Ns`R-z#QOzWi+jcTnYdo1cVT| z+Ax>mCjs{N_Yuc29LFgi0O#CDcW&;)bAaCt@CRPr7|Xn&!8QN@002ovPDHLkV1kTv Bbc_H1 delta 661 zcmV;G0&4xv2FV4GBo78+OGiWi{{a60|De66laW9le*yy!7Z&geFC_o~0#->xK~!ko z?U>7o6G0S)zp4ahPz056A&4L{KEd&_5YdewxR?hKAHkgu;7)Mi(xn@>;zD5r3u06R z@k#C9x(UFjaI9}23QZqE77y$T{CA|k4UNjJ{9qreg{obYWE z=!!_ce@+CNWBbd%3h;Zvw~N3d;9i{w*s=Wx7^nyG);e&`Ik!|-0xA3s9$Tqv2u(v` z2wZT^y#c#;HikT%Oqg*T?@Ddf1CmS2Fkw!z=N_qV1Qr1C*Y*^1QS4c z3%nPRFJ+fe3%mvn>Iwm`a#nQ$Fl7=jz%$_N3{_?~7y&QJZe(8L{Vi}wg_r==H(DTm z6t#Yy2NK{Ia9jz5YMvj<$}gJ-5 ze_<{p8bDh_l91DAD5PFp4LweWL;`#cO~3?F-U45NpP`01tIv%<1oi{1GpE&CbeJb#b&PSab4<(g{&<^2s6F3dr7Ln(BDv6zQO_lF8d}1Gn1ZI?Pi{xU} v1QOs+kqNk2q4Fc(AzL?qABc#E_&@Ov+QXH%{;rM@00000NkvXXu0mjfDtI3! diff --git a/src/keepass2android/Resources/drawable/collections_collection.png b/src/keepass2android/Resources/drawable/collections_collection.png new file mode 100644 index 0000000000000000000000000000000000000000..d1324014d0df9390f1cbe97a5afd4201471f5cbb GIT binary patch literal 1604 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=Gsgb#ptGS!0lYxt&p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaT(5-zPQ9SSkXrz>*(J3ovn(~mttdZN0qkk3Ox$j9 z!D${;ZwgMgn7iWCs}FRHJ}7FDq8cUyOg|tdJmCU4@T8xb2Tbopz=VCq$*h-wfoYqk zi(^Q|tv9oL{Y4xF+S1Er@$c=pD4{H6`0Atp?@gEFJue&gKR76VbiQKDj*8O5j@MlR zL|i!!hIVlL*tq#|bkJNMvy>P2*8BK|tNWLU&rtkaQW_qb{#fVqq6zM6m_i!30vNR% zSXVHJE?{yJ4_JSF{e!1WGg#)zy`SEYpRo50|Gf;8fBR?MIsfcHZGq&Uw;%UCPGHt) zsO1z4cwLqMtL4y3wF;F~&L^xX%nj50xa69PFR}1sO=##&unS=fJH%`tyQ;y=f`49% zmck>SPXcGAL^eo1+G}0&fBA!_6aG(^O@5$U5y-|^rg?{HySvH4^n;%hIXr$%5$*SI zc(i*>?_;}-++}V*6!!LUZm`T?EV-<@;S7`3Ra?pSoA;mpns=-;Z^k7f^9t69UgwKB zqGT>E=Q5B9ivIIcatC)E=iCpT=RCUCF=YhbWOIMOwu9xHmmH((#ERIZLX9*{tm`-ig2NhTk(-X2GO#{-4D8y4#@) zu@|0fDQBM}IEN{j?|y=9e3Ri4vQy$ z><@3Pci+&^a(RBS@sz@|HpjE;o0Oei9j@>1^Y7flB9T{f>D?j6gkOuVe80I}*01uJ z^23MoKgC^p`P9bY*FpC)v&%nkVOqFK`Qfp2;}FKS^!>7n7^MHL)-x>%O|PF_JyU^I zCFa!oHjM*q|7T^-j&NnP?>=>Z759P<@%=LU7l*hqhWy)Cr2E7t{Kb=rcmC9T@DvYR z_bmVUgjxU07CnBfpUmdKI;Vst054N##{d8T literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable/collections_new_label.png b/src/keepass2android/Resources/drawable/collections_new_label.png new file mode 100644 index 0000000000000000000000000000000000000000..70ad36c19915cac71f0dd49ea2914046e9d0fb72 GIT binary patch literal 1667 zcmaJ?Yfuwc6po}KAX+Ji3Rt(RgIXoK8}n`=k1Sx6AQMnh9f2iTV1Z?!EWS`M&d=d%l_7 z8WkBn#m&c!#bQlSEJIby3OimGXXYF0^lCG+%%VfpbTpYnn=k{;3f7W|IH1sB$+!x~ zw3dupxRk|W&m&^gv|1S<(U3Y0=E&igbrgeUv7~`!3e%+FG?0iV6M7l=XH6Xl5Ly`+ z%U8lmN{*)x%d!o4barHnCOb_d)`Edc0jXKS5a@6k1I)T~y-{M8fy2BKX730?ATXRl zr^&!~qSVSLKu#KPfX{&gG_U{x1UwGHgT*}YVt@-HFobX+SQvo7624FZBf!W5GSv*) zB#8z*dWMB$SQxXU=nM@qh5)Nrdh7hq>48dH8%MD;M0*n?tjhO@V#<`;mC~njk z2#O|1J>X!(63I+j1~N+DwV2`G|b?V<~mAI61f4#XwncvlIf$j7?ncOq%no00C_Z@g8)iQL+Blm zVT4jCQRs~{rq|#KR0c8}9D>kFctV)R3k^p3Aux&{p@^7=h(mcH^58H&BIJc2qga&G zWa@A|J&M)-iwzwY>o9|kVk)D!fylzOVFpqM3^y$y-ls(%6p2H)qH*~~u-fsp$j8M( zj2Or<+W(AtG{pGFu^lrma~QKeu4nviV2nMxq*23SISnY#;286dzn9!e^9-K(y{QGQ z$XBC%M+8R?=Vvzut$Y%UMlAy4t`*I=F!0Nxx`dTQUjd)G#J!l8pU~HkhOXb)-DBI~ zmV0>P*Saem1GCKDn?AWxQ)vopV>XoPO|IuRDrDBInwIjHmvlCDS}=Y)OYx`=>tj>vWoa-Ye(!b0788 zm-+ttCvLOF4oN3Q7FeaeQQffx6N_pmf1Kx;AXB?WE-yXLZ@T-UzaFGMlseB%@Em0S zTJJ-6UUGh!v2j)B1kX)_uwB_cQ#~mw-@<91A7HQOZrWYw>dW3-&!yJwAz(K_YIke) zpi6EN2A;C&Qc3nco0mwlCEn?w6`=|%V|MY1?RjfXzqav<0w)V*cDIIQdGP922kfy& z*!f+Ca-RqGzbc1HyEo*Ocfrb)EyuQORps}@8Ixt<{l>Q*fsM_v=i*tyDr=K+`?E^> zTGz5Zn@gQ&`PJp6v0Wd{Fz)GQYoeC=;<1hOtdr8M<~IWc>0+lovdmgR)U=BhRtb&| zVynw9ZQGI7RbBl2nrnmb2k7FuoKCMbHV?XbY8>~n?;-CwCg+^;gF}fDzuqcyDO_}0$agDT+g!mL4`+UeSQfiqE-EC)xdrKS8?}(4)pw_IKMeQ z^~CNwH!F+{94h)=Q1zQYC#ZT(%)-SH^MB^*q^m{o+`{jsJZ9D0EorkCf(O0CbC#X6 zev{?h9@$@;rEc!%JGpCeTU-64hy9DuoG-KgxO99l=w7|LF_T-C2&_}E<8FU`_8HZZ zdaQN*l7uaF`?hniz2VUpDjG!1H`cm`uekm+9lq|LvGcNz^~jmxN$i%Zxx{q2SKzI^ z_K1oT=%Qj?ZQkp*X2{QSu}<3fx4vq2^YyAz+Al8dFJ0h%%zd9vr=H(+VSAClxC^nl ny=cpJ+qQx4@ZOcrhTLFQFZSx&2~O2fj^BbJG!i`OV32;bRa{vGf6951U69E94oEQKA00(qQO+^RY1Pufb2quo{^8f$?ib+I4R9M69 znA=a{KorL3R@y)bL@^+hOB0R87!zLL0q}qKP2(jtUO|ut@qd<@R8ydpPG|O^*@oca zg3GMCiSt0pq?!KaoHO5iGjMNj5By6Ffq$%h1O0bE5JJL%?(XhRPEIh!qaX8q zUscs&vFQ7Lr_*s=x7lna5{b>tO|d|XF~cx8=NRMBPFa?Bc6JsP761Ut%gejFy8wWT zi;F^`5R1hGF8imaC(E)%X@c-*nikLi0J7O^DwX1#4}S)O+uK{QI`sVfOer0!RtTYO z+u>hI>0mGj-Z4#6ERf?kzsNlyrfD7>9l5UC@Avoj_ift_imc!7bIt|U(4^53LYJ49 zH#aw&^Wkt9=9Doewx~zf`B>I4#>3$d05D1ui^Zl_qt5^>EiGY;Ip@Fp%$VwM&cjL< zRYRFfMt@b+X%Z1=K`xgQ3)E`09LM>s{&LPKrE6P@~Z}JUnEKeOwknU1zh| z?d@%Wds(B=I5;?f5QgEQlm>M(y16pOIOn>qm&;{Il0*T$r|~>b(=e)&tr@s zgfPa7i;L^)>$wM1kLF;rntyXJvE9IQ`dObqO)zwwE+YPZ8W0E9In(*9! zEX!&(n~I`@G!Q~XQ4m6=X+AtWgo$H}DR_z^97xl&YPCA5Qk?Va>ubkxbX_0Qp%27t zZb0dDI-O3Bb#}X5+qR3vVxds@`U|VTbVCRO6Zd_k_g?@7=6WU_5(`8KnbjZ=p+H+( tTdwQQblE5n2qCnxvhrQj-#~x6{Qx-Ww3m3<89x93002ovPDHLkV1gNe;r9Rl literal 1656 zcmaJ?eM}Q)81Kj26huD65ysTx{6Ie1yQ78Dlk!=rowg!$P=c`5_J9trceIBT#ic-0 zL}Z4<2`HKXnh^{*r{cFo@Poi~PB8@JLtUs*2Mo-h%5+x*+#h3?+`aGnjweun{z-yv6Mc4TUVS};5e2sNQJ0gh2>z=Utp8&Q)8oZ?04y*&(p zz*GvADFQ!;Qp#e1Xu^O2L0p)lfrAksn9oJ{u#hhd00LnIhLAuA7H|+44HBR*0!%+3 zUCp3PL*vAf>00zj1ZGeai9%3LP7XJR$0ZEu5F!)`Avh2U4CK%m9AmDYQkyt>K|>ENZH2uQiAEbRHANT{1hH-A7GpCAiZEsnBoG}R#6O43+AQlv=OBq+$_Bb8vM!Ey_begggOH7!(DI5hMl?@)2PSKPoy>5`+l& zQOFEdOlY!kOi#^VwI8vOb7Jjgz)8BY7&GX$V_J!Uz=5fzQQh2H1atCDW3_W@37HcM z(PAL`X#X|pnGo$C`*zm2^kLTen4b2#fj0Kpq>MfWgY`lxj#QYsUsbkeF5c{ZYq+&s zaWip$QBg{gM?rDfZigj#`QTHHclCtF#Q1#QAwT_P7mot3nA6p+KZRLhmT(eINSeQ` zuUP#o=ef_q!=64B6&+I5qRI6pnz z9%hdvEta)mz`vY%U^@|4-&wYxNSEBarfXjCMCp50V>27BY7@A$l$wpy7O;1;%4@(@ zIKVAu{F3TMI&4v03Q$@T;6tHd<9wy#t=y}Z%)JAlB)i)0UR|NII3&XAT$n_zOEy2Y z2GmUY0Hfi}K_ka**Dh)}^Xn$FkNc0oB}0rB@0#|nMs8TIJbByXe%kfbgCTZLWQ7es z;{NCAmtBmdge|PmPqnLPY)^l2h{^R7J9@z3ZHwDWtf=l}0$bjin>8A;Ke6Eao}0%) z4(b*ti(H-{-SxJ_XtAIz|I z73bvhE_v_;u+cSg*diK3`(;unIt^Y8;)=%A8Qo8_xNWNtX+qd)-{z zZF`&rX(M8b6lPt^j<*61!F0N1F0=umqWv`hy)9J7Lw6dt*0xN*N;P!B;_1)Euw)dTY$3e&E#9Mz0 YV^jCV@_qj8F7|(cG)69Nh*A~&1IGS+LjV8( diff --git a/src/keepass2android/Resources/drawable/device_access_not_secure.png b/src/keepass2android/Resources/drawable/device_access_not_secure.png new file mode 100644 index 0000000000000000000000000000000000000000..4a6463c38909a26e899f350607f28c8fb2b6b140 GIT binary patch literal 785 zcmV+s1Md8ZP)wPnCNdU49un&9&UKB;~D}+Fd@mQ?DWl4{1UjlY?z*>Fd8?X;loCSVJdKP2c z828<^6390tJp!%(J3w91DPRNmYWtg{8gO0`l6ECEfg7z>>;2l=+TP4oAkT9o-Lrik z=qB`t+OfR{>;XG5 z#${kpQrostI0c{)LYU18gb=RUej=%!#(D=V0Y03ZAp~p-SOD%yvh9wfr!mI$Q90Dd zOo4ex4WONpbfqW?AJs7la-QcalI|o|Y5?=V`qV?H&jfnmU`g8pJhR=`U$)0GlB^6H z?RouxA*p1ur66MlNa0fo>SYm0JMYvdW85UpB%SFImz13-0g`?KF>Oo$nC?bmU&*}* z?56+D0Uu(FOB2ZfNf&LmY;TQHNA-@E>0r}4A6$@>rFK)&>Lio6E2#~1%Gtn$?XK-^ zYPVBaK3Nw^HNHk<{jZ8N>?lLdq?DM6jaC9G0hNGCKqa6OPzjjzi7ef$W$8XgWfDon zTsCZ#J8Utx1$^h=3Vjk2`X_x1nV5iAl3w?HxS-@!P)VhFg$flaObLGhxZ*wU#|$Dt P00000NkvXXu0mjfCoWSb literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable/ic_launcher_gray.png b/src/keepass2android/Resources/drawable/ic_launcher_gray.png index 4b9fe754fe35414a886a897940fe0168e39c0005..d68da21fc0a5b59817f86c22f8509649fffc2f2b 100644 GIT binary patch delta 909 zcmV;819JT13cm-CBntv!OGiWi0IH26GLbwVe*_u_3l_RR&UF9)03B&mSad^gZEa<4 zbN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00SpUL_t(&-tCsZk5p9@$3JIgfMj7n zC?xE%>Ly^eAYi3Iq(DkrLut2QK}c+*17ZPIKqxk9XY^k%u^gW(fr5<=LLHwx94F0Pn@R_fz%~HNLR31Ez;>5Q9~LxEf8LR#C<2c?<^+vo_0+$EP1KPv;@?{ewms3w{>Z%MwSyJ~r^^L1$XU0-s! zbRky7Ek(fZY0NF}{93N_^P1B{6#q$9D5@jfP)O2q`a(CtXTYRNh93?nfuG`|f0Dnh z;-+RsjecfL)a7QtT|Np09g44e&XhQ`-k+r;OV|s#=E%%!cn|cwqIjqM2V3AA0OKad znBh(k837B-@G3uqC-eEbeJj>}tAQ2&*Y5iI{jdyt-&=Kp!f5qYUz1RH6vMXO>aQRI zyLzjA)MH8@oe@IEg9d|3I;}T^e=ZEzjUvOoW-`P)@Y=wu|7kT%wZeGJBc=wPuUA4Y zfoybH;S(OvV49PR1&oeT2z2<0S)TIGb$^mG93HvEB@htH9OX|ovzLV1tTMsXk#k@c z*o0{~sn_+Eu1S(U*8xrI%INbUOor*Wh4VH?5aI)-5I+?j)r}%XZHygjfA#Cq#CTSi zK&_~uJ@;>gKV5+t=<+Ld45Q7@bbwV7j5fbeXHP^RBdXvb@8c|yu!T))Q9q;2MmDpR zZwja&C}*Uka>gD!+WEVpn^3Rhch%t1?k{r`_1hGkVIkSQh$a*dc{ib+<|Cn*%+-hYz$ll} zoO+2`JwxuQ*OC1%gUB*>?S&5_k>IJGe8}CeBmxa~(@jlVmmN_fJ@7`9m7n1?h-$); jhf4VbDpaUYp$Ps4;8Z0VZ0{(>00000NkvXXu0mjf1QxRB delta 1333 zcmV-51AJ5$O4 z000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000ESNkl$pnn)!+N$}!YrE{cJoog$ah!3U*?nf`#jq|6%sg}NJ->U-|DJPZ z7ycjrp0T4Mvh3^1(%b1;)=_uslezUa_MF)k+Ffe%k(JIicbzXl=m!SPysoE9X?}ZH zHiG@u7ohof-HI`5BB9a&RIE0JLwx580MT_|p5@_^x&K~XRe!N-+oCxDmY%b3DbiUg z0D04d_2<@I>Ca5&6#E`0r6KZ4Da>~^nAJ*Rapu$80NP{v4%V#gs4YH#yGhZFi~bxI z0D3;BhdO6@(c?dtxiVzm&kBoAqFCVWR@?0OTp|;4aI~7)`nXf0Gq_I_6!pyh1ZEG% z%oVjZzQ|^;{eNbsJmYO>eJub0ba$FIyS-&u2GB-5Ery-XC;XQ2Z0X)lNMxIJ?H z`{hGvt6QBe`kTl52-DYHv*dsnJE!$9K*tQ{4Ou8vR3;58sQ50t`8C8CvidM9OJA#XwYBrTe1P-hLa?byz%2`WCRijqx!L z7Qvv{g3T+6!C-IJ%S=5~yMCuv9$*R%gPfudDSrS$ae0I=%4JUYdcn=k&6YZ50}!T$ z{X`2e@9-pH047kup=@*6Eg5*sO1-b74)t+e&=Dq_T&+xHoX<`so4O){b3#EnsLDvT zH9-J`C^k)w*D(cnU?3$u0et!qzYsVaOUW_8nF2&8T%!+3BAnx@&rZgV=`_difC2U~ zSbxCz!DAoi5iF-U>?1*t9lrY~fDln!Kf?4bctr0g2|_4wLcVj|T(?)TjLDe^m6Mz$ zMg@~-7zRQSLMY_i%gxm&$}mmi1-{}UUQ#i&JkP|ODqw`YO#X50Wi!3RQ4}T4SvJ!< zYL$!vpo0N~YMPi&6V(USi17z7 zmfAc^SB_ecJz{*qSs;N$GHQe+fnsoh$*f>ZsXP!TmP*oztdy(7ldn8O;9U+_Sbs&w z|AgkHIDmxmzCnt8%0e+&{GP zXk{WV5jt~%UY8*MMsO?LCmilp4gA+@LGn+pMZYO-@QDqK#SGhmTc+gQ;{~4YupmIw rVe{f+S zF;nG)PI7Q_ui+^%4pcH|YC6!~qmtA#@6Ez0&L|^|YR!(SSBhFbr`UhTr?o74={#fi z)qN~W({8WZY5e_P)sFJC^tALc?bl2H@bY~B_s;Tp^}oO8EbY&&|No~eO>L#mrE4pj zC)o4MlXh?}(V51z^MKd6=_gW*54#w1`KPq*E7rNtyt&ROuHg8kmyU}vj~+kavTp0a zuj{rgxbgF3;P1CZ4jN^Z}6&7V4;jcKWYVjs>_uO^d8XC_c-y5DTJhb=TTQrifHbCEM2Fp7)ZxFPkJhxgT7*4Z%)NopW_t}7r=H$7upqBv^KVSu@>f>5$*W0c)1YQyv=T12lyBI&zIlDc)<0PMdY5d-&T5u za$kS4bZ1U~z?&4kf*Yl)9*CTJ_Iu&%?jm&)`KccL5j)o=O_lbS^o?hB+RIqV#9@)^ zbn;Kq^PbyNyDg5K+i}c$)w_>-=N)?&vCv*T`H+6px#Hcd>T?W^KT zTlp>~H&m8z6xsWk+_`N z-nisN&r;T0sh#&fT{m87W!(0pdc~z1qr6?)%0s?J_b=JHsw8ge9jkX6B3{|1+yx4+ zuW4ZyJ)XtoGDFF3`JFEQn#MKN8&8*3GOo@QEn+vD=pGdnvh>}J2aKz^&!zloo7}bM zX|7FXYm~Ih*%cS7er9y6k9?@P=dEtwZ_5{VjKptdPt0HQwbuKz&lj#^QleVr{0YKUVJh-+FN)r;->;`HDY>59f2c zeEzY|XFkiy`LdSFKknsR^p)w-a`EIkyXV{<(kJ#8w!UKcyj`#H`St$^e;J?Z%-)^z z`NAz=QKMSo8c~vxSdwa$T$Bo=7>o=I4Rj5SbPWtc49%^K4XsQ}bPX)53=9m)emq9e zkei>9nO2EggQK=XJWzuq$cEtjw370~qErUQl>DSr1<%~X^wgl##FWaylc_d9MGT&< KelF{r5}E*QQf6-e literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable/ic_menu_remove_field_holo_light.png b/src/keepass2android/Resources/drawable/ic_menu_remove_field_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b31359f7ef2e34b32cadcad2d41ace589f74487f GIT binary patch literal 703 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 P`FF#?-r26$HZbl#6K$Lw literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable/navigation_cancel.png b/src/keepass2android/Resources/drawable/navigation_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4c3d6a2b5bffc7529ef77789f4b9a1258c967e GIT binary patch literal 1202 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVitz{uRt(ZJNy$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OzjUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfY zG!Lpb1-DyFaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zW{wmsWnf@b@pN$v zskrrKx+7PUgGig{Ew_XRoJvIx&xNMH;Bgf9c%jf3>+pg{?(kf0RjbAe4(c1sKd|em z&8?IYI&oxS z=Y{Jq%y{p?9pof5>zUk37p}tC!tD>-v^*F!j~%jlX824bqPdnW%cgQA=S4Gp!|ifa z9Ia|Cr($|US!)G!iZ2_4IO-@)+vz7#(>$R~`U>BzW6$omsPO6;#5k+|I&weNiLb$? zApOlxX08j*|4J>Wz4iXaXO`T_DMy(CT5oY1d4}mU?6VM$>A1=9tXbg~L(O58#Z4dD z8Du_qnR*)Kb_ir|Fivc + android:color="@color/light_gray"/> \ No newline at end of file diff --git a/src/keepass2android/Resources/layout-v14/QuickUnlock_Unused.xml b/src/keepass2android/Resources/layout-v14/QuickUnlock_Unused.xml new file mode 100644 index 00000000..1b263bb7 --- /dev/null +++ b/src/keepass2android/Resources/layout-v14/QuickUnlock_Unused.xml @@ -0,0 +1,70 @@ + + + + + + + + +