diff --git a/src/keepass2android/CreateDatabaseActivity.cs b/src/keepass2android/CreateDatabaseActivity.cs index 191da39d..fb84f1b3 100644 --- a/src/keepass2android/CreateDatabaseActivity.cs +++ b/src/keepass2android/CreateDatabaseActivity.cs @@ -103,16 +103,8 @@ namespace keepass2android if (_restoringInstanceState) return; - string defaulFilename = _keyfileFilename; - if (_keyfileFilename == null) - { - defaulFilename = _keyfileFilename = SdDir + "keyfile.txt"; - if (defaulFilename.StartsWith("file://") == false) - defaulFilename = "file://" + defaulFilename; - } - - StartFileChooser(defaulFilename, RequestCodeKeyFile, false); - + Util.ShowBrowseDialog(this, RequestCodeKeyFile, false, true); + } else { @@ -193,7 +185,13 @@ namespace keepass2android { try { - newKey.AddUserKey(new KcpKeyFile(_keyfileFilename)); + var ioc = IOConnectionInfo.FromPath(_keyfileFilename); + using (var stream = App.Kp2a.GetFileStorage(ioc).OpenFileForRead(ioc)) + { + byte[] keyfileData = Util.StreamToMemoryStream(stream).ToArray(); + newKey.AddUserKey(new KcpKeyFile(keyfileData, ioc, true)); + } + } catch (Exception) { @@ -362,13 +360,37 @@ namespace keepass2android { if (requestCode == RequestCodeKeyFile) { - string filename = Util.IntentToFilename(data, this); - if (filename != null) + if (data.Data.Scheme == "content") { - _keyfileFilename = ConvertFilenameToIocPath(filename); - FindViewById(Resource.Id.keyfile_filename).Text = _keyfileFilename; - FindViewById(Resource.Id.keyfile_filename).Visibility = ViewStates.Visible; + if ((int)Build.VERSION.SdkInt >= 19) + { + //try to take persistable permissions + try + { + Kp2aLog.Log("TakePersistableUriPermission"); + var takeFlags = data.Flags + & (ActivityFlags.GrantReadUriPermission + | ActivityFlags.GrantWriteUriPermission); + this.ContentResolver.TakePersistableUriPermission(data.Data, takeFlags); + } + catch (Exception e) + { + Kp2aLog.Log(e.ToString()); + } + + } } + + + string filename = Util.IntentToFilename(data, this); + if (filename == null) + filename = data.DataString; + + + _keyfileFilename = ConvertFilenameToIocPath(filename); + FindViewById(Resource.Id.keyfile_filename).Text = _keyfileFilename; + FindViewById(Resource.Id.keyfile_filename).Visibility = ViewStates.Visible; + } if (requestCode == RequestCodeDbFilename) { diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index f5c7c33a..ff062738 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -1538,11 +1538,11 @@ namespace keepass2android protected override void OnPause() { - base.OnPause(); if (_fingerprintDec != null) { _fingerprintDec.StopListening(); } + base.OnPause(); } private void SetPasswordTypeface(TextView textView) @@ -1613,21 +1613,7 @@ namespace keepass2android private static MemoryStream StreamToMemoryStream(Stream stream) { - var memoryStream = stream as MemoryStream; - if (memoryStream == null) - { - // Read the stream into memory - int capacity = 4096; // Default initial capacity, if stream can't report it. - if (stream.CanSeek) - { - capacity = (int) stream.Length; - } - memoryStream = new MemoryStream(capacity); - stream.CopyTo(memoryStream); - stream.Close(); - memoryStream.Seek(0, SeekOrigin.Begin); - } - return memoryStream; + return Util.StreamToMemoryStream(stream); } protected override void OnSaveInstanceState(Bundle outState) diff --git a/src/keepass2android/Properties/AndroidManifest_net.xml b/src/keepass2android/Properties/AndroidManifest_net.xml index c319e383..c0f14b15 100644 --- a/src/keepass2android/Properties/AndroidManifest_net.xml +++ b/src/keepass2android/Properties/AndroidManifest_net.xml @@ -1,7 +1,7 @@  diff --git a/src/keepass2android/QuickUnlock.cs b/src/keepass2android/QuickUnlock.cs index 36aa3ab4..727c1b6b 100644 --- a/src/keepass2android/QuickUnlock.cs +++ b/src/keepass2android/QuickUnlock.cs @@ -361,12 +361,13 @@ namespace keepass2android protected override void OnPause() { - base.OnPause(); if (_fingerprintIdentifier != null) { Kp2aLog.Log("FP: Stop listening"); _fingerprintIdentifier.StopListening(); } + + base.OnPause(); } protected override void OnDestroy() diff --git a/src/keepass2android/Utils/Util.cs b/src/keepass2android/Utils/Util.cs index e436c76c..10944053 100644 --- a/src/keepass2android/Utils/Util.cs +++ b/src/keepass2android/Utils/Util.cs @@ -511,6 +511,27 @@ namespace keepass2android } }; } + + public static MemoryStream StreamToMemoryStream(Stream stream) + { + + var memoryStream = stream as MemoryStream; + if (memoryStream == null) + { + // Read the stream into memory + int capacity = 4096; // Default initial capacity, if stream can't report it. + if (stream.CanSeek) + { + capacity = (int) stream.Length; + } + memoryStream = new MemoryStream(capacity); + stream.CopyTo(memoryStream); + stream.Close(); + memoryStream.Seek(0, SeekOrigin.Begin); + } + return memoryStream; + + } } }