* show toast for cache messages in the center of the screen to avoid hiding the keyboard when entering passwords
* Bug fix with FTP access * Bug fix with Group editing/adding * Integrated Input Language Selection for keyboard -> 0.9.3-r3
This commit is contained in:
		| @@ -20,7 +20,7 @@ | ||||
|     <DebugType>full</DebugType> | ||||
|     <Optimize>False</Optimize> | ||||
|     <OutputPath>bin\Debug</OutputPath> | ||||
|     <DefineConstants>DEBUG;INCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE;INCLUDE_KEYTRANSFORM</DefineConstants> | ||||
|     <DefineConstants>DEBUG;EXCLUDE_TWOFISH;INCLUDE_KEYBOARD;EXCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE;EXCLUDE_KEYTRANSFORM</DefineConstants> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|     <ConsolePause>False</ConsolePause> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| // <auto-generated> | ||||
| //     Dieser Code wurde von einem Tool generiert. | ||||
| //     Laufzeitversion:4.0.30319.34003 | ||||
| //     Laufzeitversion:4.0.30319.34011 | ||||
| // | ||||
| //     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn | ||||
| //     der Code erneut generiert wird. | ||||
|   | ||||
| @@ -362,22 +362,56 @@ namespace KeePassLib.Serialization | ||||
| 			public override void Close() | ||||
| 			{ | ||||
| 				base.Close(); | ||||
| 				RepeatWithDigestOnFail(ioc, req => | ||||
|  | ||||
| 				WebRequest testReq = WebRequest.Create(ioc.Path); | ||||
| 				if (testReq is HttpWebRequest) | ||||
| 				{ | ||||
| 					req.Headers.Add("Translate: f"); | ||||
|  | ||||
| 					if (method != null) | ||||
| 						req.Method = method; | ||||
| 					var data = this.ToArray(); | ||||
|  | ||||
| 					using (Stream s = req.GetRequestStream()) | ||||
| 					RepeatWithDigestOnFail(ioc, req => | ||||
| 					{ | ||||
| 						s.Write(data, 0, data.Length); | ||||
| 						req.GetResponse(); | ||||
| 						s.Close(); | ||||
| 						req.Headers.Add("Translate: f"); | ||||
|  | ||||
| 						if (method != null) | ||||
| 							req.Method = method; | ||||
| 						var data = this.ToArray(); | ||||
|  | ||||
| 						using (Stream s = req.GetRequestStream()) | ||||
| 						{ | ||||
| 							s.Write(data, 0, data.Length); | ||||
| 							req.GetResponse(); | ||||
| 							s.Close(); | ||||
| 						} | ||||
| 					});	 | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					try | ||||
| 					{ | ||||
| 						uploadData(IOConnection.CreateWebClient(ioc, false)); | ||||
| 					} | ||||
| 				}); | ||||
| 					catch (WebException ex) | ||||
| 					{ | ||||
| 						//todo: does this make sense for FTP at all? Remove? | ||||
| 						if ((ex.Response is HttpWebResponse) && (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.Unauthorized)) | ||||
| 							uploadData(IOConnection.CreateWebClient(ioc, true)); | ||||
| 						else | ||||
| 							throw; | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				 | ||||
| 				 | ||||
| 			} | ||||
|  | ||||
| 			void uploadData(WebClient webClient) | ||||
| 			{ | ||||
| 				if (method != null) | ||||
| 				{ | ||||
| 					webClient.UploadData(destinationFilePath, method, this.ToArray()); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					webClient.UploadData(destinationFilePath, this.ToArray()); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			 | ||||
|   | ||||
| @@ -20,7 +20,7 @@ | ||||
|     <DebugType>full</DebugType> | ||||
|     <Optimize>false</Optimize> | ||||
|     <OutputPath>bin\Debug\</OutputPath> | ||||
|     <DefineConstants>TRACE;DEBUG;INCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE;INCLUDE_KEYTRANSFORM</DefineConstants> | ||||
|     <DefineConstants>TRACE;DEBUG;EXCLUDE_TWOFISH;INCLUDE_KEYBOARD;EXCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE;EXCLUDE_KEYTRANSFORM</DefineConstants> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|   </PropertyGroup> | ||||
|   | ||||
| @@ -18,15 +18,15 @@ namespace Kp2aUnitTests | ||||
|         { | ||||
|             TestRunner runner = new TestRunner(); | ||||
|             // Run all tests from this assembly | ||||
|             //runner.AddTests(Assembly.GetExecutingAssembly()); | ||||
|             runner.AddTests(Assembly.GetExecutingAssembly()); | ||||
| 			//runner.AddTests(new List<Type> { typeof(TestSynchronizeCachedDatabase)}); | ||||
| 			//runner.AddTests(typeof(TestLoadDb).GetMethod("LoadErrorWithCertificateTrustFailure")); | ||||
| 			//runner.AddTests(typeof(TestLoadDb).GetMethod("LoadWithAcceptedCertificateTrustFailure")); | ||||
|  | ||||
| 			runner.AddTests(new List<Type> { typeof(TestLoadDb) }); | ||||
| 			 | ||||
| 			//runner.AddTests(new List<Type> { typeof(TestLoadDb) }); | ||||
| 			//runner.AddTests(new List<Type> { typeof(TestCachingFileStorage) }); | ||||
| 			//runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadKdb1")); | ||||
| 			//runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadWithKeyfileOnly")); | ||||
| 			//runner.AddTests(typeof(TestLoadDb).GetMethod("LoadAndSaveFromRemote1And1Ftp")); | ||||
| 			//runner.AddTests(typeof(TestLoadDb).GetMethod("TestLoadKdbpWithPasswordOnly")); | ||||
| 			//runner.AddTests(typeof(TestSaveDb).GetMethod("TestLoadKdbxAndSaveKdbp_TestIdenticalFiles")); | ||||
|             return runner; | ||||
|   | ||||
							
								
								
									
										2
									
								
								src/Kp2aUnitTests/Resources/Resource.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								src/Kp2aUnitTests/Resources/Resource.Designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -2,7 +2,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| // <auto-generated> | ||||
| //     Dieser Code wurde von einem Tool generiert. | ||||
| //     Laufzeitversion:4.0.30319.34003 | ||||
| //     Laufzeitversion:4.0.30319.34011 | ||||
| // | ||||
| //     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn | ||||
| //     der Code erneut generiert wird. | ||||
|   | ||||
| @@ -200,6 +200,32 @@ namespace Kp2aUnitTests | ||||
| 			 | ||||
| 		} | ||||
|  | ||||
| 		[TestMethod] | ||||
| 		public void LoadAndSaveFromRemote1And1Ftp() | ||||
| 		{ | ||||
| 			var ioc = RemoteIoc1and1Ftp; //note: this property is defined in "TestLoadDbCredentials.cs" which is deliberately excluded from Git because the credentials are not public! | ||||
| 			var app = new TestKp2aApp(); | ||||
| 			app.CreateNewDatabase(); | ||||
|  | ||||
| 			bool loadSuccesful = false; | ||||
| 			LoadDb task = new LoadDb(app, ioc, null, CreateKey("test"), null, new ActionOnFinish((success, message) => | ||||
| 			{ | ||||
| 				if (!success) | ||||
| 					Android.Util.Log.Debug("KP2ATest", "error loading db: " + message); | ||||
| 				loadSuccesful = success; | ||||
| 			}) | ||||
| 				); | ||||
| 			ProgressTask pt = new ProgressTask(app, Application.Context, task); | ||||
| 			Android.Util.Log.Debug("KP2ATest", "Running ProgressTask"); | ||||
| 			pt.Run(); | ||||
| 			pt.JoinWorkerThread(); | ||||
| 			Android.Util.Log.Debug("KP2ATest", "PT.run finished"); | ||||
| 			Assert.IsTrue(loadSuccesful, "didn't succesfully load database :-("); | ||||
|  | ||||
| 			Assert.IsTrue(TrySaveDatabase(app), "didn't successfully save database."); | ||||
|  | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		[TestMethod] | ||||
| 		public void LoadFromRemote1And1NonExisting() | ||||
|   | ||||
| @@ -53,6 +53,13 @@ | ||||
|             android:persistent="true" | ||||
|             android:defaultValue="true" | ||||
|             /> | ||||
| 			 | ||||
| 	<PreferenceScreen | ||||
|             android:title="@string/language_selection_title" | ||||
|             android:summary="@string/language_selection_summary"> | ||||
|         <intent | ||||
|                 android:action="keepass2android.softkeyboard.INPUT_LANGUAGE_SELECTION"/> | ||||
|     </PreferenceScreen> | ||||
|  | ||||
|          | ||||
|     <PreferenceCategory | ||||
|   | ||||
| @@ -112,24 +112,20 @@ public class InputLanguageSelection extends PreferenceActivity { | ||||
|         conf.locale = locale; | ||||
|         res.updateConfiguration(conf, res.getDisplayMetrics()); | ||||
|  | ||||
|         int[] dictionaries = KP2AKeyboard.getDictionary(res, ctx); | ||||
|         BinaryDictionary bd = new BinaryDictionary(this, dictionaries, Suggest.DIC_MAIN); | ||||
|  | ||||
|         // Is the dictionary larger than a placeholder? Arbitrarily chose a lower limit of | ||||
|         // 4000-5000 words, whereas the LARGE_DICTIONARY is about 20000+ words. | ||||
|         if (bd.getSize() > Suggest.LARGE_DICTIONARY_THRESHOLD / 4) { | ||||
|             haveDictionary = true; | ||||
|         //somewhat a hack. But simply querying the dictionary will always return an English | ||||
|         //dictionary in KP2A so if we get a dict, we wouldn't know if it's language specific  | ||||
|         if (locale.getLanguage().equals("en")) | ||||
|         { | ||||
|         	haveDictionary = true; | ||||
|         } | ||||
|         else  | ||||
|         { | ||||
|             BinaryDictionary plug = PluginManager.getDictionary(getApplicationContext(), locale.getLanguage()); | ||||
|             if (plug != null) { | ||||
|                 bd.close(); | ||||
|                 bd = plug; | ||||
|                 haveDictionary = true; | ||||
|             	plug.close(); | ||||
|             	haveDictionary = true; | ||||
|             } | ||||
|         } | ||||
|         bd.close(); | ||||
|         conf.locale = saveLocale; | ||||
|         res.updateConfiguration(conf, res.getDisplayMetrics()); | ||||
|         return haveDictionary; | ||||
|   | ||||
| @@ -145,7 +145,8 @@ namespace keepass2android | ||||
| 		protected override void OnResume() | ||||
| 		{ | ||||
| 			base.OnResume(); | ||||
| 			_design.ReapplyTheme(); | ||||
| 			//DON'T: _design.ReapplyTheme(); | ||||
| 			// (This causes endless loop creating/recreating. More correct: ReapplyDialogTheme (which doesn't exist) Not required anyways...) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="36" android:versionName="0.9.3-pre3" package="keepass2android.keepass2android" android:installLocation="auto"> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="39" android:versionName="0.9.3-release-3" package="keepass2android.keepass2android" android:installLocation="auto"> | ||||
| 	<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> | ||||
| 	<permission android:description="@string/permission_desc" android:icon="@drawable/ic_launcher" android:label="KP2A internal file browsing" android:name="keepass2android.keepass2android.permission.KP2aInternalFileBrowsing" android:protectionLevel="signature" /> | ||||
| 	<application android:label="keepass2android" android:icon="@drawable/ic_launcher"> | ||||
| @@ -44,6 +44,15 @@ | ||||
| 				<category android:name="android.intent.category.DEFAULT" /> | ||||
| 			</intent-filter> | ||||
| 		</activity> | ||||
| 		 <activity android:name="keepass2android.softkeyboard.InputLanguageSelection" | ||||
|                 android:label="@string/language_selection_title"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.MAIN"/> | ||||
|                 <action android:name="keepass2android.softkeyboard.INPUT_LANGUAGE_SELECTION"/> | ||||
|                 <category android:name="android.intent.category.DEFAULT" /> | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|   | ||||
| 		<activity android:configChanges="keyboardHidden|orientation" android:label="@string/app_name" android:theme="@style/Base" android:name="keepass2android.PasswordActivity"> | ||||
| 			<intent-filter android:label="@string/app_name"> | ||||
| 				<action android:name="android.intent.action.VIEW" /> | ||||
|   | ||||
							
								
								
									
										13
									
								
								src/keepass2android/Resources/Resource.designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										13
									
								
								src/keepass2android/Resources/Resource.designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -2,7 +2,7 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| // <auto-generated> | ||||
| //     Dieser Code wurde von einem Tool generiert. | ||||
| //     Laufzeitversion:4.0.30319.34003 | ||||
| //     Laufzeitversion:4.0.30319.34011 | ||||
| // | ||||
| //     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn | ||||
| //     der Code erneut generiert wird. | ||||
| @@ -6384,6 +6384,9 @@ namespace keepass2android | ||||
| 			// aapt resource value: 0x7f0e00c3 | ||||
| 			public const int BaseLight = 2131624131; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f0e00c5 | ||||
| 			public const int BaseLight_Dialog = 2131624133; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f0e00b5 | ||||
| 			public const int BottomBarActionButton = 2131624117; | ||||
| 			 | ||||
| @@ -6393,8 +6396,8 @@ namespace keepass2android | ||||
| 			// aapt resource value: 0x7f0e00c1 | ||||
| 			public const int DialogDark = 2131624129; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f0e00c5 | ||||
| 			public const int DialogLight = 2131624133; | ||||
| 			// aapt resource value: 0x7f0e00c6 | ||||
| 			public const int DialogLight = 2131624134; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f0e00b1 | ||||
| 			public const int EditEntryButton = 2131624113; | ||||
| @@ -6648,8 +6651,8 @@ namespace keepass2android | ||||
| 			// aapt resource value: 0x7f0e00c2 | ||||
| 			public const int ThemeDark = 2131624130; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f0e00c6 | ||||
| 			public const int ThemeLight = 2131624134; | ||||
| 			// aapt resource value: 0x7f0e00c7 | ||||
| 			public const int ThemeLight = 2131624135; | ||||
| 			 | ||||
| 			// aapt resource value: 0x7f0e00a8 | ||||
| 			public const int WhiteOnBlack = 2131624104; | ||||
|   | ||||
| @@ -35,7 +35,11 @@ | ||||
| 	</style> | ||||
|     <style name="NoTitleBarLight" parent="BaseLight"> | ||||
|     </style> | ||||
|     <style name="DialogLight" parent="BaseLight"></style> | ||||
|      | ||||
|  | ||||
| 	<style name="BaseLight_Dialog" parent="android:Theme.Holo.Light.Dialog" /> | ||||
| 	<style name="DialogLight" parent="BaseLight_Dialog"></style> | ||||
| 	 | ||||
| 	<style name="ThemeLight" parent="BaseLight"></style> | ||||
| 	 | ||||
| 	<!-- "default" for Preference activity etc.:--> | ||||
|   | ||||
| @@ -27,13 +27,17 @@ namespace keepass2android | ||||
|  | ||||
| 		public void ReapplyTheme() | ||||
| 		{ | ||||
| 			int newTheme = UseDarkTheme ? Resource.Style.ThemeDark : Resource.Style.ThemeLight; | ||||
| 			if (newTheme != _currentThemeId) | ||||
| 			if (HasThemes()) | ||||
| 			{ | ||||
| 				Kp2aLog.Log("recreating due to theme change."); | ||||
| 				_activity.Recreate(); | ||||
| 				int newTheme = UseDarkTheme ? Resource.Style.ThemeDark : Resource.Style.ThemeLight; | ||||
| 				if (newTheme != _currentThemeId) | ||||
| 				{ | ||||
| 					Kp2aLog.Log("recreating due to theme change."); | ||||
| 					_activity.Recreate(); | ||||
| 				}	 | ||||
| 			} | ||||
| 			 | ||||
| 			 | ||||
| 		} | ||||
|  | ||||
| 		private bool UseDarkTheme | ||||
|   | ||||
| @@ -24,6 +24,7 @@ using Android.Content; | ||||
| using Android.Graphics.Drawables; | ||||
| using Android.OS; | ||||
| using Android.Runtime; | ||||
| using Android.Views; | ||||
| using Android.Widget; | ||||
| using KeePassLib; | ||||
| using KeePassLib.Cryptography.Cipher; | ||||
| @@ -517,7 +518,10 @@ namespace keepass2android | ||||
| 		internal void ShowToast(string message) | ||||
| 		{ | ||||
| 			var handler = new Handler(Looper.MainLooper); | ||||
| 			handler.Post(() => { Toast.MakeText(Application.Context, message, ToastLength.Long).Show(); }); | ||||
| 			handler.Post(() => { var toast = Toast.MakeText(Application.Context, message, ToastLength.Long); | ||||
| 				                   toast.SetGravity(GravityFlags.Center, 0, 0); | ||||
| 									toast.Show();  | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		public void CouldntSaveToRemote(IOConnectionInfo ioc, Exception e) | ||||
|   | ||||
| @@ -30,7 +30,7 @@ | ||||
|     <DebugType>full</DebugType> | ||||
|     <Optimize>false</Optimize> | ||||
|     <OutputPath>bin\Debug</OutputPath> | ||||
|     <DefineConstants>DEBUG;EXCLUDE_TWOFISH;EXCLUDE_KEYBOARD;EXCLUDE_FILECHOOSER;EXCLUDE_JAVAFILESTORAGE;EXCLUDE_KEYTRANSFORM</DefineConstants> | ||||
|     <DefineConstants>DEBUG;EXCLUDE_TWOFISH;INCLUDE_KEYBOARD;EXCLUDE_FILECHOOSER;INCLUDE_JAVAFILESTORAGE;EXCLUDE_KEYTRANSFORM</DefineConstants> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|     <ConsolePause>False</ConsolePause> | ||||
| @@ -576,8 +576,6 @@ | ||||
|     <AndroidResource Include="Resources\values-ko\strings.xml" /> | ||||
|     <AndroidResource Include="Resources\values-no\strings.xml" /> | ||||
|     <AndroidResource Include="Resources\values-pt-rPT\strings.xml" /> | ||||
|     <AndroidResource Include="Resources\values-iw\strings.xml" /> | ||||
|     <AndroidResource Include="Resources\values-ko\strings.xml" /> | ||||
|     <AndroidResource Include="Resources\values-ro\strings.xml" /> | ||||
|     <AndroidResource Include="Resources\values-sl\strings.xml" /> | ||||
|     <AndroidResource Include="Resources\values-sr\strings.xml" /> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Philipp Crocoll
					Philipp Crocoll