diff --git a/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs b/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs index 9d33b991..4b093ead 100644 --- a/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs +++ b/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs @@ -253,7 +253,7 @@ namespace keepass2android.Io if (ioc.IsLocalFile()) { bool requiresPermission = !(ioc.Path.StartsWith(activity.Activity.FilesDir.CanonicalPath) - || ioc.Path.StartsWith(activity.Activity.NoBackupFilesDir.CanonicalPath)); + || ioc.Path.StartsWith(IoUtil.GetInternalDirectory(activity.Activity).CanonicalPath)); var extDirectory = activity.Activity.GetExternalFilesDir(null); if ((extDirectory != null) && (ioc.Path.StartsWith(extDirectory.CanonicalPath))) diff --git a/src/Kp2aBusinessLogic/Io/IoUtil.cs b/src/Kp2aBusinessLogic/Io/IoUtil.cs index f38c010b..03463d3a 100644 --- a/src/Kp2aBusinessLogic/Io/IoUtil.cs +++ b/src/Kp2aBusinessLogic/Io/IoUtil.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using Android.Content; +using Android.OS; using Java.IO; using KeePassLib.Serialization; @@ -53,7 +54,7 @@ namespace keepass2android.Io try { File filesDir = context.FilesDir.CanonicalFile; - File noBackupDir = context.NoBackupFilesDir.CanonicalFile; + File noBackupDir = GetInternalDirectory(context).CanonicalFile; File ourFile = new File(path).CanonicalFile; //http://www.java2s.com/Tutorial/Java/0180__File/Checkswhetherthechilddirectoryisasubdirectoryofthebasedirectory.htm @@ -93,5 +94,13 @@ namespace keepass2android.Io writeTransaction.CommitWrite(); } } + + public static Java.IO.File GetInternalDirectory(Context ctx) + { + if ((int)Android.OS.Build.VERSION.SdkInt >= 21) + return ctx.NoBackupFilesDir; + else + return ctx.FilesDir; + } } } diff --git a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs index b5fc06f3..fdd8e7f2 100644 --- a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs @@ -101,7 +101,7 @@ namespace keepass2android } catch (DuplicateUuidsException e) { - Kp2aLog.LogUnexpectedError(e); + Kp2aLog.Log(e.ToString()); Finish(false, _app.GetResourceString(UiStringKey.DuplicateUuidsError) + " " + e.Message + _app.GetResourceString(UiStringKey.DuplicateUuidsErrorAdditional), Exception); return; } diff --git a/src/keepass2android/FingerprintSetupActivity.cs b/src/keepass2android/FingerprintSetupActivity.cs index bf933fce..e51762fb 100644 --- a/src/keepass2android/FingerprintSetupActivity.cs +++ b/src/keepass2android/FingerprintSetupActivity.cs @@ -123,20 +123,7 @@ namespace keepass2android RequestPermissions(new[] {Manifest.Permission.UseFingerprint}, FingerprintPermissionRequestCode); else { - try - { - //try to create a Samsung ID object - _samsungFingerprint = new FingerprintSamsungIdentifier(this); - if (!_samsungFingerprint.Init()) - { - SetError(Resource.String.fingerprint_no_enrolled); - } - ShowRadioButtons(); - } - catch (Exception) - { - _samsungFingerprint = null; - } + TrySetupSamsung(); } FindViewById(Resource.Id.container_fingerprint_unlock).Visibility = _samsungFingerprint == null @@ -144,6 +131,26 @@ namespace keepass2android : ViewStates.Gone; } + private bool TrySetupSamsung() + { + try + { + //try to create a Samsung ID object + _samsungFingerprint = new FingerprintSamsungIdentifier(this); + if (!_samsungFingerprint.Init()) + { + SetError(Resource.String.fingerprint_no_enrolled); + } + ShowRadioButtons(); + return true; + } + catch (Exception) + { + _samsungFingerprint = null; + return false; + } + } + string CurrentPreferenceKey { get { return App.Kp2a.GetDb().CurrentFingerprintPrefKey; } @@ -194,7 +201,9 @@ namespace keepass2android FingerprintModule fpModule = new FingerprintModule(this); if (!fpModule.FingerprintManager.IsHardwareDetected) { - SetError(Resource.String.fingerprint_hardware_error); + //seems like not all Samsung Devices (e.g. Note 4) don't support the Android 6 fingerprint API + if (!TrySetupSamsung()) + SetError(Resource.String.fingerprint_hardware_error); return; } if (!fpModule.FingerprintManager.HasEnrolledFingerprints) diff --git a/src/keepass2android/Properties/AndroidManifest_net.xml b/src/keepass2android/Properties/AndroidManifest_net.xml index 58abcc34..d6627780 100644 --- a/src/keepass2android/Properties/AndroidManifest_net.xml +++ b/src/keepass2android/Properties/AndroidManifest_net.xml @@ -1,7 +1,7 @@  diff --git a/src/keepass2android/settings/DatabaseSettingsActivity.cs b/src/keepass2android/settings/DatabaseSettingsActivity.cs index ae22bb52..26d915ac 100644 --- a/src/keepass2android/settings/DatabaseSettingsActivity.cs +++ b/src/keepass2android/settings/DatabaseSettingsActivity.cs @@ -760,11 +760,12 @@ namespace keepass2android private IOConnectionInfo ImportFileToInternalDirectory(IOConnectionInfo sourceIoc) { + Java.IO.File internalDirectory = IoUtil.GetInternalDirectory(Activity); string targetPath = UrlUtil.GetFileName(sourceIoc.Path); targetPath = targetPath.Trim("|\\?*<\":>+[]/'".ToCharArray()); if (targetPath == "") targetPath = "imported"; - if (new File(Activity.NoBackupFilesDir, targetPath).Exists()) + if (new File(internalDirectory, targetPath).Exists()) { int c = 1; var ext = UrlUtil.GetExtension(targetPath); @@ -775,9 +776,9 @@ namespace keepass2android targetPath = filenameWithoutExt + c; if (!String.IsNullOrEmpty(ext)) targetPath += "." + ext; - } while (new File(Activity.NoBackupFilesDir, targetPath).Exists()); + } while (new File(internalDirectory, targetPath).Exists()); } - var targetIoc = IOConnectionInfo.FromPath(new File(Activity.NoBackupFilesDir, targetPath).CanonicalPath); + var targetIoc = IOConnectionInfo.FromPath(new File(internalDirectory, targetPath).CanonicalPath); IoUtil.Copy(targetIoc, sourceIoc, App.Kp2a); return targetIoc;