Compare commits

...

54 Commits

Author SHA1 Message Date
PhilippC
830494851d Merge pull request #2734 from anttiharju/prevent-duplicate-CI-runs
Prevent duplicate CI runs in PRs
2024-12-31 11:34:24 +01:00
anttiharju
6e30dd35ee Prevent duplicate runs in PRs 2024-12-20 08:11:26 +02:00
Philipp Crocoll
dad9b0e53f update minSdk of offline version to 21 (Android 5.0) to simplify the build. 2024-10-22 15:49:08 +02:00
Philipp Crocoll
b2b0b8ddc9 switch to Java 17 in build.yml 2024-10-22 15:23:27 +02:00
Philipp Crocoll
9494f28acf Merge branch 'anttiharju/master' into update-libs-and-tools 2024-10-22 15:11:36 +02:00
Philipp Crocoll
a98cd33cff updating OkHttp, okhttp-digest and dropbox sdk. Removing no longer needed onedrive aar.
I wasn't successful in binding the latest dropbox sdk (7.0) and therefor only updated to 5.4.6 which doesn't require an .aar.
2024-10-22 15:02:10 +02:00
anttiharju
65092dcccf Switch okhttp-digest source to github
as instructed at
https://github.com/rburgst/okhttp-digest?tab=readme-ov-file#use-via-gradle
2024-10-15 22:55:48 +03:00
anttiharju
e464c59796 Downgrade setup-gradle to v3
v3 is node20 and doesn't do validation by default like v4

validation can be disabled in v4 but when that bump is made it's
probably better to resolve the issues rather than ignore them.
2024-10-15 22:48:50 +03:00
anttiharju
7dcccf1105 Bump artifact actions to v4
v4 included breaking changes, but the setup here was compatible
thanks to the usage of `${{ github.job }}`.
https://github.com/actions/upload-artifact/releases/tag/v4.0.0

v3 artifact actions will be deprecated on November 30th
https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/

node16 actions will be EOL on October 15th
https://github.blog/changelog/2024-09-25-end-of-life-for-actions-node16/

These seem contradictory but I _guess_ on self-hosted runners one
can keep using v3 artifact actions until November 30th.
2024-10-13 15:29:45 +03:00
anttiharju
8d354bb3f0 Update actions/setup-java to v4
Just a node20 update
https://github.com/actions/setup-java/releases/tag/v4.0.0
2024-10-13 15:22:50 +03:00
anttiharju
5882263ee8 Bump microsoft/setup-msbuild to v2 for node20
Just a node20 update
https://github.com/microsoft/setup-msbuild/releases/tag/v2
2024-10-13 15:20:33 +03:00
anttiharju
38e305bb4a Pin a third-party action
This is security hardening, see
https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions#using-third-party-actions
2024-10-13 15:16:37 +03:00
anttiharju
177b1fc9a3 Update al-cheb/configure-pagefile-action to v1.4
Just a node20 update per
https://github.com/al-cheb/configure-pagefile-action/releases/tag/v1.4
2024-10-13 15:15:11 +03:00
anttiharju
8bde5ed262 Use actions/checkout for fetching submodules 2024-10-13 15:10:36 +03:00
anttiharju
247b37262d Bump actions/cache to v4
Just a node20 update per
https://github.com/actions/cache/releases/tag/v4.0.0
2024-10-13 14:58:18 +03:00
anttiharju
84230b32ef Bump gradle/actions/setup-gradle to v4
It includes caching improvements as described here:
https://github.com/gradle/actions/releases/tag/v4.0.0

windows-2022 includes node20 per
https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md#nodejs
2024-10-13 14:56:14 +03:00
anttiharju
a54444e919 Bump gradle-build-action to v3
Gradle v2 uses node16 which will be EOL soon.

"The only major breaking change from gradle-build-action@v2.12.0
is the update to require a Node 20 runtime environment.

Aside from that change, this release should generally serve as a
drop-in replacement for gradle-build-action@v2."

Gradle updated the action name, following the advice from
https://github.com/gradle/gradle-build-action/releases/tag/v3.0.0
2024-10-13 14:42:06 +03:00
anttiharju
4b55e2ce8b Bump checkout from v3 to v4
checkout v3 uses node16 which reaches EOL on 15th of Oct 2024
https://github.blog/changelog/2024-09-25-end-of-life-for-actions-node16/
2024-10-13 14:35:35 +03:00
Philipp Crocoll
5ae718c58e update targetframework for Guava libs 2024-10-08 16:19:24 +02:00
Philipp Crocoll
669022ddf0 update Newtonsoft.Json, FluentFTP and MegaApiClient to the latest versions 2024-10-08 16:07:56 +02:00
Philipp Crocoll
f0fd21a6ec upgrade to Gradle version 8.6 (plugin version 8.4) 2024-10-08 16:03:03 +02:00
Philipp Crocoll
73a8ec27d4 remove no-longer-needed jars from JavaFileStorageBindings 2024-10-08 15:19:23 +02:00
Philipp Crocoll
51902c9bc4 fix build issues related to removal of deprecated OneDrive API jars. onedrive:// is now no longer supported, but has been replaced with onedrive2:// a long time ago already. 2024-10-08 14:59:49 +02:00
PhilippC
32d3abf5d6 Merge pull request #2544 from PhilippC/release-preparation-1-11
Version 1.11-r0
2024-02-20 07:10:16 +01:00
Philipp Crocoll
543eeb69ef manifest for 1.11 2024-02-19 21:07:32 +01:00
PhilippC
ec6e1593b0 Merge pull request #2542 from PhilippC/l10n_master2
New Crowdin updates
2024-02-19 16:18:36 +01:00
PhilippC
ee27bea111 New translations strings.xml (Dutch) 2024-02-19 14:39:34 +01:00
PhilippC
de93b12877 New translations strings.xml (Japanese) 2024-02-19 14:39:33 +01:00
PhilippC
71d2a332c7 New translations strings.xml (German) 2024-02-19 14:38:53 +01:00
PhilippC
37d1481658 Merge pull request #2513 from PhilippC/l10n_master2
New Crowdin updates
2024-02-19 11:45:11 +01:00
PhilippC
a8cc1ad66d New translations strings.xml (Portuguese, Brazilian) 2024-02-16 16:28:07 +01:00
PhilippC
3056ee9d45 New translations strings.xml (Portuguese, Brazilian) 2024-02-16 13:17:44 +01:00
PhilippC
0ec5996c8d New translations strings.xml (Portuguese, Brazilian) 2024-02-16 11:48:14 +01:00
PhilippC
01666d8402 New translations strings.xml (Czech) 2024-02-13 12:46:17 +01:00
PhilippC
422fa01ba1 New translations strings.xml (Czech) 2024-02-13 11:30:21 +01:00
PhilippC
ca9c19e8a9 New translations strings.xml (Turkish) 2024-02-12 16:21:28 +01:00
PhilippC
093f7683b8 New translations strings.xml (German) 2024-02-11 22:31:36 +01:00
PhilippC
d4cf908f4a New translations strings.xml (German) 2024-02-11 21:35:40 +01:00
PhilippC
55d62144fb New translations strings.xml (Portuguese, Brazilian) 2024-02-08 12:03:39 +01:00
PhilippC
c181565aaa New translations strings.xml (Slovenian) 2024-02-07 18:03:13 +01:00
PhilippC
c0c4524562 Merge pull request #2530 from PhilippC/release-preparation-1-11
changelog for version 1.11
2024-02-06 21:46:13 +01:00
PhilippC
eac1803084 New translations strings.xml (German) 2024-02-06 13:47:53 +01:00
PhilippC
58904f1166 New translations strings.xml (German) 2024-02-06 12:09:11 +01:00
Philipp Crocoll
54eb1baee2 changelog for version 1.11 2024-02-06 09:40:54 +01:00
PhilippC
ada01924ba New translations strings.xml (Chinese Simplified) 2024-02-06 04:25:32 +01:00
PhilippC
e38e7df221 Merge pull request #2516 from PhilippC/803--totp-overview
TOTP overview
2024-01-17 18:34:29 +01:00
Philipp Crocoll
fb4ab84ceb Merge branch 'master' of https://github.com/PhilippC/keepass2android into 803--totp-overview 2024-01-17 07:48:06 +01:00
Philipp Crocoll
4475fac51e add missing file for SearchTotpResults, preview TOTPs depending on settings, make TOTP copyable from Entry view
closes #803
2024-01-17 07:46:51 +01:00
Philipp Crocoll
13ef4ca9ff add FAB for TOTP, add activity for showing TOTP entries 2024-01-17 07:35:05 +01:00
Philipp Crocoll
f297ebcd40 * introduce FAB for search
* introduce TOTP preview on PwEntryView

first steps towards #803
2024-01-17 07:07:46 +01:00
PhilippC
a5ef4ccc7a Merge pull request #2514 from PhilippC/1942--fix-text-color-not-themed
Fix bad text color on autofill target preference dialog
2024-01-15 12:30:50 +01:00
Philipp Crocoll
dfd9c32251 Fixes bad text color, closes https://github.com/PhilippC/keepass2android/issues/1942 2024-01-15 11:51:59 +01:00
PhilippC
5397a1c88f New translations strings.xml (Polish) 2024-01-15 09:22:32 +01:00
PhilippC
fdcd4321e0 Merge pull request #2512 from PhilippC/2504--copy-on-longclick
fix merge issue
2024-01-15 08:27:57 +01:00
80 changed files with 1497 additions and 1255 deletions

View File

@@ -1,6 +1,10 @@
name: Build keepass2android app
on: [push, pull_request]
on:
push:
branches:
- main
pull_request:
jobs:
# macos:
@@ -10,16 +14,15 @@ jobs:
# runs-on: macos-12
# steps:
# - uses: actions/checkout@v3
# - name: Fetch submodules
# run: git submodule init && git submodule update
# - uses: actions/checkout@v4
# with:
# submodules: true
# - name: Setup Gradle
# uses: gradle/gradle-build-action@v2
# uses: gradle/actions/setup-gradle@v3
# - name: Cache NuGet packages
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/.nuget/packages
# key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
@@ -52,7 +55,7 @@ jobs:
# # $VM_ASSETS/select-xamarin-sdk-v2.sh --mono=6.12 --android=11.2
# - name: Switch to JDK-11
# uses: actions/setup-java@v3
# uses: actions/setup-java@v4
# with:
# java-version: '11'
# distribution: 'temurin'
@@ -82,7 +85,7 @@ jobs:
# make apk Flavor=Net
# - name: Archive production artifacts (net)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('net' built on ${{ github.job }})
# path: |
@@ -100,7 +103,7 @@ jobs:
# make apk Flavor=NoNet
# - name: Archive production artifacts (nonet)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('nonet' built on ${{ github.job }})
# path: |
@@ -130,16 +133,15 @@ jobs:
# # Build Artifact of xamarin.android-oss dated 2022-02-16, master branch (= version 12.2.99)
# xamarin_url: https://artprodcus3.artifacts.visualstudio.com/Ad0adf05a-e7d7-4b65-96fe-3f3884d42038/6fd3d886-57a5-4e31-8db7-52a1b47c07a8/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL3hhbWFyaW4vcHJvamVjdElkLzZmZDNkODg2LTU3YTUtNGUzMS04ZGI3LTUyYTFiNDdjMDdhOC9idWlsZElkLzU0OTUzL2FydGlmYWN0TmFtZS9pbnN0YWxsZXJzLXVuc2lnbmVkKy0rTGludXg1/content?format=zip
# steps:
# - uses: actions/checkout@v3
# - name: Fetch submodules
# run: git submodule init && git submodule update
# - uses: actions/checkout@v4
# with:
# submodules: true
# - name: Setup Gradle
# uses: gradle/gradle-build-action@v2
# uses: gradle/actions/setup-gradle@v3
# - name: Cache NuGet packages
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/.nuget/packages
# key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
@@ -148,7 +150,7 @@ jobs:
# - name: Cache Xamarin.Android packages
# id: xamarin_cache
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/xamarin.android-oss
# key: ${{ runner.os }}-xamarin.android-oss-${{ env.xamarin_url }}
@@ -183,7 +185,7 @@ jobs:
# echo "$HOME/xamarin.android-oss/bin/Release/bin" >> $GITHUB_PATH
# - name: Switch to JDK-11
# uses: actions/setup-java@v3
# uses: actions/setup-java@v4
# with:
# java-version: '11'
# distribution: 'temurin'
@@ -217,7 +219,7 @@ jobs:
# make apk Flavor=Net
# - name: Archive production artifacts (net)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('net' built on ${{ github.job }})
# path: |
@@ -235,7 +237,7 @@ jobs:
# make apk Flavor=NoNet
# - name: Archive production artifacts (nonet)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('nonet' built on ${{ github.job }})
# path: |
@@ -254,39 +256,38 @@ jobs:
runs-on: windows-2022
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: true
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
uses: gradle/actions/setup-gradle@v3
- name: Cache NuGet packages
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Fetch submodules
run: git submodule init && git submodule update
# Workaround an issue when building on windows-2022. Error was
# D8 : OpenJDK 64-Bit Server VM warning : INFO: os::commit_memory(0x00000000ae400000, 330301440, 0) failed; error='The paging file is too small for this operation to complete' (DOS error/errno=1455) [D:\a\keepass2android\keepass2android\src\keepass2android\keepass2android-app.csproj]
# C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Xamarin\Android\Xamarin.Android.D8.targets(81,5): error MSB6006: "java.exe" exited with code 1. [D:\a\keepass2android\keepass2android\src\keepass2android\keepass2android-app.csproj]
- name: Configure Pagefile
uses: al-cheb/configure-pagefile-action@v1.3
uses: al-cheb/configure-pagefile-action@a3b6ebd6b634da88790d9c58d4b37a7f4a7b8708 # v1.4
with:
minimum-size: 8GB
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.1
uses: microsoft/setup-msbuild@v2
# If we want to also have nmake, use this instead
#uses: ilammy/msvc-dev-cmd@v1
- name: Switch to JDK-11
uses: actions/setup-java@v3
- name: Switch to JDK-17
uses: actions/setup-java@v4
with:
java-version: '11'
java-version: '17'
distribution: 'temurin'
- name: Display java version
@@ -320,7 +321,7 @@ jobs:
make apk Flavor=Net
- name: Archive production artifacts (net)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: signed APK ('net' built on ${{ github.job }})
path: |
@@ -341,7 +342,7 @@ jobs:
make apk Flavor=NoNet
- name: Archive production artifacts (nonet)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: signed APK ('nonet' built on ${{ github.job }})
path: |

1
.gitignore vendored
View File

@@ -176,3 +176,4 @@ src/java/Keepass2AndroidPluginSDK2/build/generated/mockable-Google-Inc.-Google-A
/src/ActionViewFilterTest
/docs/gdrive-verification
/src/MegaTest
*.dtbcache.json

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.services.msa"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<uses-permission android:name="com.sony.mobile.permission.SYSTEM_UI_VISIBILITY_EXTENSION" />
</manifest>

View File

@@ -1 +0,0 @@
int string app_name 0x7f020000

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.services.msa"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<uses-permission android:name="com.sony.mobile.permission.SYSTEM_UI_VISIBILITY_EXTENSION" />
</manifest>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- From: file:/C:/Users/pnied/Documents/git/msa-auth-for-android/src/main/res/values/strings.xml -->
<eat-comment/>
<string name="app_name">msa-auth</string>
</resources>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.onedrivesdk"
android:versionCode="10202"
android:versionName="1.2.2" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
</manifest>

View File

@@ -1,22 +0,0 @@
int dimen activity_horizontal_margin 0x7f030000
int dimen activity_vertical_margin 0x7f030001
int id LinearLayout1 0x7f060004
int id com_microsoft_aad_adal_editDummyText 0x7f060002
int id com_microsoft_aad_adal_progressBar 0x7f060003
int id com_microsoft_aad_adal_webView1 0x7f060001
int id editPassword 0x7f060006
int id editUserName 0x7f060005
int id webView1 0x7f060000
int layout activity_authentication 0x7f020000
int layout dialog_authentication 0x7f020001
int layout http_auth_dialog 0x7f020002
int string app_loading 0x7f050000
int string app_name 0x7f050001
int string broker_processing 0x7f050002
int string http_auth_dialog_cancel 0x7f050003
int string http_auth_dialog_login 0x7f050004
int string http_auth_dialog_password 0x7f050005
int string http_auth_dialog_title 0x7f050006
int string http_auth_dialog_username 0x7f050007
int style AppBaseTheme 0x7f040000
int style AppTheme 0x7f040001

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.onedrivesdk"
android:versionCode="10202"
android:versionName="1.2.2" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
</manifest>

View File

@@ -183,6 +183,7 @@
<LibraryProjectZip Include="..\java\JavaFileStorage\app\build\outputs\aar\JavaFileStorage-debug.aar">
<Link>Jars\JavaFileStorage-debug.aar</Link>
</LibraryProjectZip>
<None Include="app.config" />
<None Include="Jars\AboutJars.txt" />
<None Include="Additions\AboutAdditions.txt" />
<None Include="packages.config" />
@@ -212,12 +213,6 @@
<Name>PCloudBindings</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\msa-auth-0.8.6\classes-msa-auth.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\onedrive-sdk-android-1.2.2\classes-onedrive-sdk.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\commons-logging-1.1.1.jar" />
</ItemGroup>
@@ -242,21 +237,6 @@
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\google-http-client-gson-1.16.0-rc.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\jackson-core-2.7.4.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-digest-2.5.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okio-2.9.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-4.10.0-RC1.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedJar Include="Jars\dropbox-core-sdk-4.0.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gson-2.8.6.jar" />
</ItemGroup>
@@ -290,18 +270,30 @@
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\opencensus-api-0.24.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-4.12.0.jar" />
<EmbeddedReferenceJar Include="Jars\okio-3.6.0.jar" />
<EmbeddedReferenceJar Include="Jars\okio-jvm-3.6.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-digest-3.1.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\dropbox-core-sdk-5.4.6.jar" />
<EmbeddedReferenceJar Include="Jars\jackson-core-2.13.5.jar" />
</ItemGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.props'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.props'))" />
<Error Condition="!Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets'))" />
@@ -326,7 +318,6 @@
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets'))" />
@@ -337,13 +328,14 @@
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets'))" />
</Target>
<Import Project="..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets')" />
<Import Project="..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets" Condition="Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" />
<Import Project="..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets" Condition="Exists('..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets')" />
@@ -368,7 +360,6 @@
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets')" />
@@ -379,4 +370,5 @@
<Import Project="..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" />
</Project>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Google.Apis.Auth" publicKeyToken="4b01fa6e34db77ab" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.67.0.0" newVersion="1.67.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -24,8 +24,8 @@
<package id="Xamarin.AndroidX.VersionedParcelable" version="1.1.1.14" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ViewPager" version="1.0.0.14" targetFramework="monoandroid13.0" />
<package id="Xamarin.Build.Download" version="0.11.4" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava" version="28.2.0.1" targetFramework="monoandroid90" />
<package id="Xamarin.Google.Guava.FailureAccess" version="1.0.1.3" targetFramework="monoandroid90" />
<package id="Xamarin.Google.Guava" version="28.2.0.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava.FailureAccess" version="1.0.1.3" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava.ListenableFuture" version="1.0.0.9" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Auth" version="120.4.0" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Auth.Api.Phone" version="118.0.1.2" targetFramework="monoandroid13.0" />

View File

@@ -27,7 +27,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "keepass2android-app", "keep
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kp2aAutofillParser", "Kp2aAutofillParser\Kp2aAutofillParser.csproj", "{39B12571-BAFE-4D3A-AEE2-4D74F14DFD96}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kp2aAutofillParserTest", "Kp2aAutofillParserTest\Kp2aAutofillParserTest.csproj", "{3D1560FF-86BB-4CB4-8367-80BA13B81C38}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kp2aAutofillParserTest", "Kp2aAutofillParserTest\Kp2aAutofillParserTest.csproj", "{3D1560FF-86BB-4CB4-8367-80BA13B81C38}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@@ -6,7 +6,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

View File

@@ -20,13 +20,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<PackageReference Include="coverlet.collector" Version="6.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>

View File

@@ -1,31 +1,23 @@
using System;
using System.Collections.Generic;
using System.IO;
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.Serialization;
#if !EXCLUDE_JAVAFILESTORAGE
using Keepass2android.Javafilestorage;
using Exception = Java.Lang.Exception;
namespace keepass2android.Io
{
public class OneDriveFileStorage: JavaFileStorage
/// <summary>
/// This IFileStorage implementation becomes picked if a user is using a skydrive:// or onedrive:// file.
/// These refer to an old (Java) implementation which was replaced starting in 2019. The successor uses onedrive2:// (see OneDrive2FileStorage)
/// The Java implementation was removed in 2024 when the jar files became unavailable. We are keeping this file to notify any user who haven't updated their
/// file storage within 5 years.
/// This file should be removed around mid 2025.
/// </summary>
public class OneDriveFileStorage: IFileStorage
{
private const string ClientId = "000000004010C234";
public OneDriveFileStorage(Context ctx, IKp2aApp app) :
base(new Keepass2android.Javafilestorage.OneDriveStorage(ctx, ClientId), app)
{
}
public override IEnumerable<string> SupportedProtocols
public IEnumerable<string> SupportedProtocols
{
get
{
@@ -34,10 +26,146 @@ namespace keepass2android.Io
}
}
public override bool UserShouldBackup
private Exception GetDeprecatedMessage()
{
return new Exception(
"You have opened your file through a deprecated Microsoft API. Please select Change database, Open Database and then select One Drive again.");
}
public bool UserShouldBackup
{
get { return false; }
}
}
public void Delete(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool CheckForFileChangeFast(IOConnectionInfo ioc, string previousFileVersion)
{
throw GetDeprecatedMessage();
}
public string GetCurrentFileVersionFast(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public Stream OpenFileForRead(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public IWriteTransaction OpenWriteTransaction(IOConnectionInfo ioc, bool useFileTransaction)
{
throw GetDeprecatedMessage();
}
public string GetFilenameWithoutPathAndExt(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public string GetFileExtension(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void CreateDirectory(IOConnectionInfo ioc, string newDirName)
{
throw GetDeprecatedMessage();
}
public IEnumerable<FileDescription> ListContents(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public FileDescription GetFileDescription(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool RequiresSetup(IOConnectionInfo ioConnection)
{
throw GetDeprecatedMessage();
}
public string IocToPath(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void StartSelectFile(IFileStorageSetupInitiatorActivity activity, bool isForSave, int requestCode, string protocolId)
{
throw GetDeprecatedMessage();
}
public void PrepareFileUsage(IFileStorageSetupInitiatorActivity activity, IOConnectionInfo ioc, int requestCode,
bool alwaysReturnSuccess)
{
throw GetDeprecatedMessage();
}
public void PrepareFileUsage(Context ctx, IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void OnCreate(IFileStorageSetupActivity activity, Bundle savedInstanceState)
{
throw GetDeprecatedMessage();
}
public void OnResume(IFileStorageSetupActivity activity)
{
throw GetDeprecatedMessage();
}
public void OnStart(IFileStorageSetupActivity activity)
{
throw GetDeprecatedMessage();
}
public void OnActivityResult(IFileStorageSetupActivity activity, int requestCode, int resultCode, Intent data)
{
throw GetDeprecatedMessage();
}
public string GetDisplayName(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public string CreateFilePath(string parent, string newFilename)
{
throw GetDeprecatedMessage();
}
public IOConnectionInfo GetParentPath(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public IOConnectionInfo GetFilePath(IOConnectionInfo folderPath, string filename)
{
throw GetDeprecatedMessage();
}
public bool IsPermanentLocation(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool IsReadOnly(IOConnectionInfo ioc, OptionalOut<UiStringKey> reason = null)
{
throw GetDeprecatedMessage();
}
}
}
#endif

View File

@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets="showFlavor">
<Target Name="showFlavor" AfterTargets="Build">
<Message Importance="high" Text="building flavor $(Flavor)"></Message>
</Target>
<Import Project="../build-properties.props"/>
<Target Name="showFlavor" AfterTargets="Build">
<Message Importance="high" Text="building flavor $(Flavor)">
</Message>
</Target>
<Import Project="../build-properties.props" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -182,10 +183,10 @@
</ItemGroup>
<ItemGroup Condition=" '$(Flavor)'!='NoNet' ">
<PackageReference Include="FluentFTP">
<Version>48.0.0</Version>
<Version>51.1.0</Version>
</PackageReference>
<PackageReference Include="MegaApiClient">
<Version>1.10.3</Version>
<Version>1.10.4</Version>
</PackageReference>
<PackageReference Include="Microsoft.Graph">
<Version>1.21.0</Version>
@@ -312,4 +313,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

View File

@@ -72,8 +72,9 @@ namespace keepass2android
}
private IDatabaseFormat _databaseFormat = new KdbxDatabaseFormat(KdbxFormat.Default);
private bool? _hasTotpEntries;
public bool ReloadRequested { get; set; }
public bool ReloadRequested { get; set; }
public bool DidOpenFileChange()
{
@@ -104,8 +105,9 @@ namespace keepass2android
SearchHelper = new SearchDbHelper(app);
_databaseFormat = databaseFormat;
_hasTotpEntries = null;
CanWrite = databaseFormat.CanWrite && !fileStorage.IsReadOnly(iocInfo);
CanWrite = databaseFormat.CanWrite && !fileStorage.IsReadOnly(iocInfo);
}
/// <summary>
@@ -200,8 +202,21 @@ namespace keepass2android
trans.CommitWrite();
}
}
_hasTotpEntries = null;
}
public bool HasTotpEntries
{
get
{
if (_hasTotpEntries == null)
{
_hasTotpEntries = true;
}
return _hasTotpEntries.Value;
}
}
private void PopulateGlobals(PwGroup currentGroup, bool checkForDuplicateUuids )
{

View File

@@ -4,11 +4,10 @@ android {
namespace 'keepass2android.javafilestorage'
compileSdkVersion 33
defaultConfig {
minSdkVersion 15
minSdkVersion 21
targetSdkVersion 33
compileSdk 34
}
buildTypes {
release {
@@ -22,6 +21,10 @@ android {
sourceCompatibility 11
targetCompatibility 11
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
}
}
/*
@@ -30,27 +33,21 @@ NOTE: If you change dependencies here, don't forget to update the jar files in J
dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.10.0-RC1'
implementation 'com.burgstaller:okhttp-digest:2.5'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation 'io.github.rburgst:okhttp-digest:3.1.0'
implementation 'com.google.http-client:google-http-client-gson:1.20.0'
implementation('com.google.api-client:google-api-client-android:1.30.5') {
exclude group: 'com.google.android.google-play-services'
}
implementation 'com.google.apis:google-api-services-drive:v2-rev102-1.16.0-rc'
implementation 'com.dropbox.core:dropbox-core-sdk:4.0.0'
implementation 'com.dropbox.core:dropbox-core-sdk:5.4.6'
implementation 'com.google.api-client:google-api-client:1.30.5'
implementation 'com.google.api-client:google-api-client-android:1.30.5'
implementation 'com.google.android.gms:play-services-auth:20.4.0'
//onedrive:
implementation('com.onedrive.sdk:onedrive-sdk-android:1.2.0') {
transitive = false
}
implementation 'com.pcloud.sdk:java-core:1.9.1'
implementation 'com.pcloud.sdk:android:1.9.1'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.microsoft.services.msa:msa-auth:0.8.6'
implementation 'com.microsoft.aad:adal:1.14.0'
}

View File

@@ -1,436 +0,0 @@
package keepass2android.javafilestorage;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import androidx.annotation.NonNull;
import android.util.Log;
import com.onedrive.sdk.core.DefaultClientConfig;
import com.onedrive.sdk.core.IClientConfig;
import com.onedrive.sdk.core.OneDriveErrorCodes;
import com.onedrive.sdk.extensions.IItemCollectionPage;
import com.onedrive.sdk.extensions.IItemCollectionRequestBuilder;
import com.onedrive.sdk.extensions.IOneDriveClient;
import com.onedrive.sdk.extensions.Item;
import com.onedrive.sdk.extensions.OneDriveClient;
import com.onedrive.sdk.http.OneDriveServiceException;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Philipp on 20.11.2016.
*/
public class OneDriveStorage extends JavaFileStorageBase
{
final IClientConfig oneDriveConfig;
final keepass2android.javafilestorage.onedrive.MyMSAAuthenticator msaAuthenticator;
IOneDriveClient oneDriveClient;
public OneDriveStorage(final Context context, final String clientId) {
msaAuthenticator = new keepass2android.javafilestorage.onedrive.MyMSAAuthenticator(context) {
@Override
public String getClientId() {
return clientId;
}
@Override
public String[] getScopes() {
return new String[] { "offline_access", "onedrive.readwrite" };
}
};
oneDriveConfig = DefaultClientConfig.createWithAuthenticator(msaAuthenticator);
initAuthenticator(null);
}
@Override
public boolean requiresSetup(String path) {
return !isConnected(null);
}
@Override
public void startSelectFile(FileStorageSetupInitiatorActivity activity, boolean isForSave, int requestCode) {
initAuthenticator((Activity)activity.getActivity());
String path = getProtocolId()+":///";
Log.d("KP2AJ", "startSelectFile "+path+", connected: "+path);
if (isConnected(null))
{
Intent intent = new Intent();
intent.putExtra(EXTRA_IS_FOR_SAVE, isForSave);
intent.putExtra(EXTRA_PATH, path);
activity.onImmediateResult(requestCode, RESULT_FILECHOOSER_PREPARED, intent);
}
else
{
activity.startSelectFileProcess(path, isForSave, requestCode);
}
}
private boolean isConnected(Activity activity) {
if (oneDriveClient == null)
{
try
{
Log.d("KP2AJ", "trying silent login");
if (msaAuthenticator.loginSilent() != null)
{
Log.d("KP2AJ", "ok: silent login");
oneDriveClient = buildClient(activity);
}
else Log.d("KP2AJ", "trying silent login failed.");
}
catch (Exception e)
{
e.printStackTrace();
}
}
return oneDriveClient != null;
}
private void initAuthenticator(Activity activity) {
msaAuthenticator.init(
oneDriveConfig.getExecutors(),
oneDriveConfig.getHttpProvider(),
activity,
oneDriveConfig.getLogger());
}
@Override
public void prepareFileUsage(FileStorageSetupInitiatorActivity activity, String path, int requestCode, boolean alwaysReturnSuccess) {
initAuthenticator((Activity)activity.getActivity());
if (isConnected((Activity)activity.getActivity()))
{
Intent intent = new Intent();
intent.putExtra(EXTRA_PATH, path);
activity.onImmediateResult(requestCode, RESULT_FILEUSAGE_PREPARED, intent);
}
else
{
activity.startFileUsageProcess(path, requestCode, alwaysReturnSuccess);
}
}
@Override
public String getProtocolId() {
return "onedrive";
}
@Override
public void prepareFileUsage(Context appContext, String path) throws UserInteractionRequiredException {
if (!isConnected(null))
{
throw new UserInteractionRequiredException();
}
}
@Override
public void onCreate(FileStorageSetupActivity activity, Bundle savedInstanceState) {
Log.d("KP2AJ", "OnCreate");
}
@Override
public void onResume(final FileStorageSetupActivity activity) {
}
private IOneDriveClient buildClient(Activity activity) {
return new OneDriveClient.Builder()
.fromConfig(oneDriveConfig)
.loginAndBuildClient(activity);
}
String getPathFromSkydrivePath(String skydrivePath)
{
String path = "";
if (skydrivePath.equals(""))
return "";
String[] parts = skydrivePath.split("/");
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
logDebug("parsing part " + part);
int indexOfSeparator = part.lastIndexOf(NAME_ID_SEP);
if (indexOfSeparator < 0) {
// seems invalid, but we're very generous here
path += "/" + part;
continue;
}
String name = part.substring(0, indexOfSeparator);
try {
name = decode(name);
} catch (UnsupportedEncodingException e) {
// ignore
}
path += "/" + name;
}
logDebug("return " +path + ". original was " + skydrivePath);
return path;
}
String removeProtocol(String path) throws Exception {
if (path == null)
return null;
if (path.startsWith("skydrive"))
return getPathFromSkydrivePath(path.substring("skydrive://".length()));
return path.substring(getProtocolId().length()+3);
}
@Override
public String getDisplayName(String path) {
if (path == null)
return null;
if (path.startsWith("skydrive"))
return getProtocolId()+"://"+getPathFromSkydrivePath(path.substring("skydrive://".length()));
return path;
}
@Override
public String getFilename(String path) throws Exception {
return path.substring(path.lastIndexOf("/")+1);
}
@Override
public boolean checkForFileChangeFast(String path, String previousFileVersion) throws Exception {
return false;
}
@Override
public String getCurrentFileVersionFast(String path) {
return null;
}
@Override
public InputStream openFileForRead(String path) throws Exception {
try {
path = removeProtocol(path);
logDebug("openFileForRead. Path="+path);
InputStream result = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.getContent()
.buildRequest()
.get();
logDebug("ok");
return result;
}
catch (OneDriveServiceException e)
{
throw convertException(e);
}
}
private Exception convertException(OneDriveServiceException e) {
if (e.isError(OneDriveErrorCodes.ItemNotFound))
return new FileNotFoundException(e.getMessage());
return e;
}
@Override
public void uploadFile(String path, byte[] data, boolean writeTransactional) throws Exception {
try {
path = removeProtocol(path);
oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.getContent()
.buildRequest()
.put(data);
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public String createFolder(String parentPath, String newDirName) throws Exception {
throw new Exception("not implemented.");
}
@Override
public String createFilePath(String parentPath, String newFileName) throws Exception {
String path = parentPath;
if (!path.endsWith("/"))
path = path + "/";
path = path + newFileName;
return path;
}
@Override
public List<FileEntry> listFiles(String parentPath) throws Exception {
try {
ArrayList<FileEntry> result = new ArrayList<FileEntry>();
parentPath = removeProtocol(parentPath);
IItemCollectionPage itemsPage = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(parentPath)
.getChildren()
.buildRequest()
.get();
if (parentPath.endsWith("/"))
parentPath = parentPath.substring(0,parentPath.length()-1);
while (true)
{
List<Item> items = itemsPage.getCurrentPage();
if (items.isEmpty())
return result;
for (Item i: items)
{
FileEntry e = getFileEntry(parentPath + "/" + i.name, i);
Log.d("KP2AJ", e.path);
result.add(e);
}
IItemCollectionRequestBuilder nextPageReqBuilder = itemsPage.getNextPage();
if (nextPageReqBuilder == null)
return result;
itemsPage = nextPageReqBuilder.buildRequest().get();
}
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@NonNull
private FileEntry getFileEntry(String path, Item i) {
FileEntry e = new FileEntry();
if (i.size != null)
e.sizeInBytes = i.size;
else if ((i.remoteItem != null) && (i.remoteItem.size != null))
e.sizeInBytes = i.remoteItem.size;
e.displayName = i.name;
e.canRead = e.canWrite = true;
e.path = getProtocolId() +"://"+path;
if (i.lastModifiedDateTime != null)
e.lastModifiedTime = i.lastModifiedDateTime.getTimeInMillis();
else if ((i.remoteItem != null)&&(i.remoteItem.lastModifiedDateTime != null))
e.lastModifiedTime = i.remoteItem.lastModifiedDateTime.getTimeInMillis();
e.isDirectory = (i.folder != null) || ((i.remoteItem != null) && (i.remoteItem.folder != null));
return e;
}
@Override
public FileEntry getFileEntry(String filename) throws Exception {
try {
filename = removeProtocol(filename);
Item item = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(filename)
.buildRequest()
.get();
return getFileEntry(filename, item);
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public void delete(String path) throws Exception {
try {
path = removeProtocol(path);
oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.buildRequest()
.delete();
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public void onStart(final FileStorageSetupActivity activity) {
Log.d("KP2AJ", "onStart");
if (activity.getProcessName().equals(PROCESS_NAME_SELECTFILE))
activity.getState().putString(EXTRA_PATH, activity.getPath());
JavaFileStorage.FileStorageSetupActivity storageSetupAct = activity;
if (oneDriveClient != null) {
Log.d("KP2AJ", "auth successful");
try {
finishActivityWithSuccess(activity);
return;
} catch (Exception e) {
Log.d("KP2AJ", "finish with error: " + e.toString());
finishWithError(activity, e);
return;
}
}
{
Log.d("KP2AJ", "Starting auth");
new AsyncTask<Object, Object, Object>() {
@Override
protected Object doInBackground(Object... params) {
try {
return buildClient((Activity) activity);
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(Object o) {
if (o == null)
{
Log.i(TAG, "authenticating not successful");
Intent data = new Intent();
data.putExtra(EXTRA_ERROR_MESSAGE, "authenticating not succesful");
((Activity)activity).setResult(Activity.RESULT_CANCELED, data);
((Activity)activity).finish();
}
else
{
Log.i(TAG, "authenticating successful");
oneDriveClient = (IOneDriveClient) o;
finishActivityWithSuccess(activity);
}
}
}.execute();
}
}
@Override
public void onActivityResult(FileStorageSetupActivity activity, int requestCode, int resultCode, Intent data) {
}
}

View File

@@ -1,102 +0,0 @@
package keepass2android.javafilestorage.onedrive;
/**
* Created by Philipp on 22.11.2016.
*/
import com.microsoft.services.msa.LiveConnectSession;
import com.onedrive.sdk.authentication.AccountType;
import com.onedrive.sdk.authentication.IAccountInfo;
import com.onedrive.sdk.authentication.MSAAccountInfo;
import com.onedrive.sdk.authentication.MSAAuthenticator;
import com.onedrive.sdk.logger.ILogger;
import com.microsoft.services.msa.LiveConnectSession;
import com.onedrive.sdk.logger.ILogger;
/**
* Account information for a MSA based account.
*/
public class MyMSAAccountInfo implements IAccountInfo {
/**
* The service root for the OneDrive personal API.
*/
public static final String ONE_DRIVE_PERSONAL_SERVICE_ROOT = "https://api.onedrive.com/v1.0";
/**
* The authenticator that can refresh this account.
*/
private final MyMSAAuthenticator mAuthenticator;
/**
* The session this account is based off of.
*/
private LiveConnectSession mSession;
/**
* The logger.
*/
private final ILogger mLogger;
/**
* Creates an MSAAccountInfo object.
* @param authenticator The authenticator that this account info was created from.
* @param liveConnectSession The session this account is based off of.
* @param logger The logger.
*/
public MyMSAAccountInfo(final MyMSAAuthenticator authenticator,
final LiveConnectSession liveConnectSession,
final ILogger logger) {
mAuthenticator = authenticator;
mSession = liveConnectSession;
mLogger = logger;
}
/**
* Get the type of the account.
* @return The MicrosoftAccount account type.
*/
@Override
public AccountType getAccountType() {
return AccountType.MicrosoftAccount;
}
/**
* Get the access token for requests against the service root.
* @return The access token for requests against the service root.
*/
@Override
public String getAccessToken() {
return mSession.getAccessToken();
}
/**
* Get the OneDrive service root for this account.
* @return the OneDrive service root for this account.
*/
@Override
public String getServiceRoot() {
return ONE_DRIVE_PERSONAL_SERVICE_ROOT;
}
/**
* Indicates if the account access token is expired and needs to be refreshed.
* @return true if refresh() needs to be called and
* false if the account is still valid.
*/
@Override
public boolean isExpired() {
return mSession.isExpired();
}
/**
* Refreshes the authentication token for this account info.
*/
@Override
public void refresh() {
mLogger.logDebug("Refreshing access token...");
final MyMSAAccountInfo newInfo = (MyMSAAccountInfo)mAuthenticator.loginSilent();
mSession = newInfo.mSession;
}
}

View File

@@ -1,446 +0,0 @@
package keepass2android.javafilestorage.onedrive;
/**
* Created by Philipp on 22.11.2016.
*/
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.microsoft.onedrivesdk.BuildConfig;
import com.microsoft.services.msa.LiveAuthClient;
import com.microsoft.services.msa.LiveAuthException;
import com.microsoft.services.msa.LiveAuthListener;
import com.microsoft.services.msa.LiveConnectSession;
import com.microsoft.services.msa.LiveStatus;
import com.onedrive.sdk.authentication.ClientAuthenticatorException;
import com.onedrive.sdk.authentication.IAccountInfo;
import com.onedrive.sdk.authentication.IAuthenticator;
import com.onedrive.sdk.authentication.MSAAccountInfo;
import com.onedrive.sdk.concurrency.ICallback;
import com.onedrive.sdk.core.ClientException;
import com.onedrive.sdk.concurrency.SimpleWaiter;
import com.onedrive.sdk.concurrency.IExecutors;
import com.onedrive.sdk.core.OneDriveErrorCodes;
import com.onedrive.sdk.http.IHttpProvider;
import com.onedrive.sdk.logger.ILogger;
import java.security.InvalidParameterException;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;
/**
* Wrapper around the MSA authentication library.
* https://github.com/MSOpenTech/msa-auth-for-android
*/
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
public abstract class MyMSAAuthenticator implements IAuthenticator {
private final Context mContext;
public MyMSAAuthenticator(Context context)
{
mContext = context;
}
/**
* The sign in cancellation message.
*/
private static final String SIGN_IN_CANCELLED_MESSAGE = "The user cancelled the login operation.";
/**
* The preferences for this authenticator.
*/
private static final String MSA_AUTHENTICATOR_PREFS = "MSAAuthenticatorPrefs";
/**
* The key for the user id.
*/
private static final String USER_ID_KEY = "userId";
/**
* The key for the version code
*/
public static final String VERSION_CODE_KEY = "versionCode";
/**
* The default user id
*/
private static final String DEFAULT_USER_ID = "@@defaultUser";
/**
* The active user id.
*/
private final AtomicReference<String> mUserId = new AtomicReference<>();
/**
* The executors.
*/
private IExecutors mExecutors;
/**
* Indicates whether this authenticator has been initialized.
*/
private boolean mInitialized;
/**
* The context UI interactions should happen with.
*/
private Activity mActivity;
/**
* The logger.
*/
private ILogger mLogger;
/**
* The client id for this authenticator.
* https://dev.onedrive.com/auth/msa_oauth.htm#to-register-your-app
* @return The client id.
*/
public abstract String getClientId();
/**
* The scopes for this application.
* https://dev.onedrive.com/auth/msa_oauth.htm#authentication-scopes
* @return The scopes for this application.
*/
public abstract String[] getScopes();
/**
* The live authentication client.
*/
private LiveAuthClient mAuthClient;
/**
* Initializes the authenticator.
* @param executors The executors to schedule foreground and background tasks.
* @param httpProvider The http provider for sending requests.
* @param activity The activity to create interactive UI on.
* @param logger The logger for diagnostic information.
*/
@Override
public synchronized void init(final IExecutors executors,
final IHttpProvider httpProvider,
final Activity activity,
final ILogger logger) {
mActivity = activity;
if (mInitialized) {
return;
}
mExecutors = executors;
mLogger = logger;
mInitialized = true;
mAuthClient = new LiveAuthClient(mContext, getClientId(), Arrays.asList(getScopes()));
final SharedPreferences prefs = getSharedPreferences();
mUserId.set(prefs.getString(USER_ID_KEY, null));
}
/**
* Starts an interactive login asynchronously.
* @param emailAddressHint The hint for the email address during the interactive login.
* @param loginCallback The callback to be called when the login is complete.
*/
@Override
public void login(final String emailAddressHint, final ICallback<IAccountInfo> loginCallback) {
Log.d("KP2AJ", "login()");
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (loginCallback == null) {
throw new InvalidParameterException("loginCallback");
}
mLogger.logDebug("Starting login async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
mExecutors.performOnForeground(login(emailAddressHint), loginCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, loginCallback);
}
}
});
}
/**
* Starts an interactive login.
* @param emailAddressHint The hint for the email address during the interactive login.
* @return The account info.
* @throws ClientException An exception occurs if the login was unable to complete for any reason.
*/
@Override
public synchronized IAccountInfo login(final String emailAddressHint) throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting login");
final AtomicReference<ClientException> error = new AtomicReference<>();
final SimpleWaiter waiter = new SimpleWaiter();
final LiveAuthListener listener = new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
if (liveStatus == LiveStatus.NOT_CONNECTED) {
mLogger.logDebug("Received invalid login failure from silent authentication with MSA, ignoring.");
} else {
mLogger.logDebug("Successful interactive login");
waiter.signal();
}
}
@Override
public void onAuthError(final LiveAuthException e,
final Object o) {
OneDriveErrorCodes code = OneDriveErrorCodes.AuthenticationFailure;
if (e.getError().equals(SIGN_IN_CANCELLED_MESSAGE)) {
code = OneDriveErrorCodes.AuthenticationCancelled;
}
error.set(new ClientAuthenticatorException("Unable to login with MSA", e, code));
mLogger.logError(error.get().getMessage(), error.get());
waiter.signal();
}
};
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mAuthClient.login(mActivity, /* scopes */null, /* user object */ null, emailAddressHint, listener);
}
});
mLogger.logDebug("Waiting for MSA callback");
waiter.waitForSignal();
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
final String userId;
if (emailAddressHint != null) {
userId = emailAddressHint;
} else {
userId = DEFAULT_USER_ID;
}
mUserId.set(userId);
final SharedPreferences prefs = getSharedPreferences();
prefs.edit()
.putString(USER_ID_KEY, mUserId.get())
.putInt(VERSION_CODE_KEY, BuildConfig.VERSION_CODE)
.apply();
return getAccountInfo();
}
/**
* Starts a silent login asynchronously.
* @param loginCallback The callback to be called when the login is complete.
*/
@Override
public void loginSilent(final ICallback<IAccountInfo> loginCallback) {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (loginCallback == null) {
throw new InvalidParameterException("loginCallback");
}
mLogger.logDebug("Starting login silent async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
mExecutors.performOnForeground(loginSilent(), loginCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, loginCallback);
}
}
});
}
/**
* Starts a silent login.
* @return The account info.
* @throws ClientException An exception occurs if the login was unable to complete for any reason.
*/
@Override
public synchronized IAccountInfo loginSilent() throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting login silent");
final int userIdStoredMinVersion = 10112;
if (getSharedPreferences().getInt(VERSION_CODE_KEY, 0) >= userIdStoredMinVersion
&& mUserId.get() == null) {
mLogger.logDebug("No login information found for silent authentication");
return null;
}
final SimpleWaiter loginSilentWaiter = new SimpleWaiter();
final AtomicReference<ClientException> error = new AtomicReference<>();
final boolean waitForCallback = mAuthClient.loginSilent(new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
if (liveStatus == LiveStatus.NOT_CONNECTED) {
error.set(new ClientAuthenticatorException("Failed silent login, interactive login required",
OneDriveErrorCodes.AuthenticationFailure));
mLogger.logError(error.get().getMessage(), error.get());
} else {
mLogger.logDebug("Successful silent login");
}
loginSilentWaiter.signal();
}
@Override
public void onAuthError(final LiveAuthException e,
final Object o) {
OneDriveErrorCodes code = OneDriveErrorCodes.AuthenticationFailure;
if (e.getError().equals(SIGN_IN_CANCELLED_MESSAGE)) {
code = OneDriveErrorCodes.AuthenticationCancelled;
}
error.set(new ClientAuthenticatorException("Login silent authentication error", e, code));
mLogger.logError(error.get().getMessage(), error.get());
loginSilentWaiter.signal();
}
});
if (!waitForCallback) {
mLogger.logDebug("MSA silent auth fast-failed");
return null;
}
mLogger.logDebug("Waiting for MSA callback");
loginSilentWaiter.waitForSignal();
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
return getAccountInfo();
}
/**
* Log the current user out.
* @param logoutCallback The callback to be called when the logout is complete.
*/
@Override
public void logout(final ICallback<Void> logoutCallback) {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (logoutCallback == null) {
throw new InvalidParameterException("logoutCallback");
}
mLogger.logDebug("Starting logout async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
logout();
mExecutors.performOnForeground((Void) null, logoutCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, logoutCallback);
}
}
});
}
/**
* Log the current user out.
* @throws ClientException An exception occurs if the logout was unable to complete for any reason.
*/
@Override
public synchronized void logout() throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting logout");
final SimpleWaiter logoutWaiter = new SimpleWaiter();
final AtomicReference<ClientException> error = new AtomicReference<>();
mAuthClient.logout(new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
mLogger.logDebug("Logout completed");
logoutWaiter.signal();
}
@Override
public void onAuthError(final LiveAuthException e, final Object o) {
error.set(new ClientAuthenticatorException("MSA Logout failed",
e,
OneDriveErrorCodes.AuthenticationFailure));
mLogger.logError(error.get().getMessage(), error.get());
logoutWaiter.signal();
}
});
mLogger.logDebug("Waiting for logout to complete");
logoutWaiter.waitForSignal();
mLogger.logDebug("Clearing all MSA Authenticator shared preferences");
final SharedPreferences prefs = getSharedPreferences();
prefs.edit()
.clear()
.putInt(VERSION_CODE_KEY, BuildConfig.VERSION_CODE)
.apply();
mUserId.set(null);
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
}
/**
* Gets the current account info for this authenticator.
* @return NULL if no account is available.
*/
@Override
public IAccountInfo getAccountInfo() {
final LiveConnectSession session = mAuthClient.getSession();
if (session == null) {
return null;
}
return new MyMSAAccountInfo(this, session, mLogger);
}
/**
* Gets the shared preferences for this authenticator.
* @return The shared preferences.
*/
private SharedPreferences getSharedPreferences() {
return mContext.getSharedPreferences(MSA_AUTHENTICATOR_PREFS, Context.MODE_PRIVATE);
}
}

View File

@@ -6,7 +6,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -1 +1,2 @@
org.gradle.jvmargs=-Xmx1536m
android.useAndroidX=true

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -145,7 +145,9 @@ import java.util.ArrayList;
import java.util.List;
//import keepass2android.javafilestorage.DropboxCloudRailStorage;
import keepass2android.javafilestorage.DropboxV2Storage;
import keepass2android.javafilestorage.GoogleDriveAppDataFileStorage;
import keepass2android.javafilestorage.ICertificateErrorHandler;
import keepass2android.javafilestorage.JavaFileStorage;
import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
import keepass2android.javafilestorage.PCloudFileStorage;
@@ -347,7 +349,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
fileList = fs.listFiles(path);
checkFileList(path, fileList, false, true); //second param indicates the file must be gone
Log.d("KP2AJ", "Delete a folder recursive");
Log.d("KP2AJ", "xDelete a folder recursive: " + subfolderPath);
fs.delete(subfolderPath);
Log.d("KP2AJ", "List files again to check if deleting the folder was successful:");
@@ -540,12 +542,12 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
static JavaFileStorage createStorageToTest(Context ctx, Context appContext, boolean simulateRestart) {
//storageToTest = new SftpStorage(ctx.getApplicationContext());
storageToTest = new PCloudFileStorage(ctx, "FLm22de7bdS", "pcloud", "pcloudtest");
//storageToTest = new PCloudFileStorage(ctx, "FLm22de7bdS", "pcloud", "pcloudtest");
//storageToTest = new SkyDriveFileStorage("000000004010C234", appContext);
//storageToTest = new GoogleDriveAppDataFileStorage();
/*storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
@Override
public boolean onValidationError(String error) {
return false;
@@ -555,7 +557,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
public boolean alwaysFailOnValidationError() {
return false;
}
});*/
});
//storageToTest = new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
//storageToTest = new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);

View File

@@ -15,7 +15,7 @@
android:layout_height="wrap_content"
android:singleLine="true"
android:inputType="textNoSuggestions"
android:text="https://daigers.diskstation.me:5006/Keepass2Android/Apps/Keepass2Android/"
android:text="https://webdav.hidrive.ionos.com/users/philippcro"
android:hint="Server URL" />
</LinearLayout>
<EditText
@@ -23,7 +23,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="Keepass"
android:text="PhilippCro"
android:hint="@string/hint_username" />
<EditText
@@ -32,7 +32,7 @@
android:layout_height="wrap_content"
android:inputType="textPassword"
android:singleLine="true"
android:text="$T3st17$"
android:text="WSBa1wh4o4YyLK"
android:hint="@string/hint_pass"
android:importantForAccessibility="no" />

View File

@@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -4,11 +4,13 @@ android {
namespace 'keepass2android.kp2akeytransform'
compileSdkVersion 33
defaultConfig {
ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
minSdkVersion 21
targetSdkVersion 34
compileSdk 34
}

View File

@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -3,10 +3,12 @@ android {
namespace 'keepass2android.softkeyboard'
compileSdkVersion 33
defaultConfig {
minSdkVersion 18
minSdkVersion 21
compileSdk 34
targetSdk 34
}
buildTypes {

View File

@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -18,6 +18,10 @@ android {
debuggable false
}
}
buildFeatures {
buildConfig true
}
compileOptions {
targetCompatibility 11
sourceCompatibility 11

View File

@@ -42,7 +42,7 @@
<string name="afc_pmsg_file_has_been_deleted">%1$s「%2$s」が削除されました</string>
<string name="afc_pmsg_filename_is_directory">「%1$s」はフォルダーです</string>
<string name="afc_pmsg_filename_is_invalid">ファイル名「%1$s」は無効です</string>
<string name="afc_pmsg_max_file_count_allowed">ファイルが多すぎます。最大: %1$,d</string>
<string name="afc_pmsg_max_file_count_allowed">…のファイルが多すぎます。最大: %1$,d</string>
<string name="afc_pmsg_unknown_error">不明なエラー: %1$s</string>
<string name="afc_root">ルート</string>
<string name="afc_title_advanced_selection">選択…</string>

View File

@@ -36,9 +36,9 @@
<string name="afc_pmsg_cannot_access_dir">Geen toegang tot \"%1$s\"</string>
<string name="afc_pmsg_cannot_create_folder">Kan map \"%1$s\" niet maken</string>
<string name="afc_pmsg_cannot_delete_file">Kan %1$s \"%2$s\" niet verwijderen</string>
<string name="afc_pmsg_confirm_delete_file">Weet je zeker dat je deze %1$s wilt verwijderen: \"%2$s\"?</string>
<string name="afc_pmsg_confirm_delete_file">Weet je zeker dat je dit wilt verwijderen: %1$s \"%2$s\"?</string>
<string name="afc_pmsg_confirm_replace_file">Het bestand \"%1$s\" bestaat al.\n\nWilt u het vervangen?</string>
<string name="afc_pmsg_deleting_file">%1$s \"%2$s\" verwijderen</string>
<string name="afc_pmsg_deleting_file">Verwijdert %1$s \"%2$s\" …</string>
<string name="afc_pmsg_file_has_been_deleted">%1$s \"%2$s\" is verwijderd</string>
<string name="afc_pmsg_filename_is_directory">\"%1$s\" is een map</string>
<string name="afc_pmsg_filename_is_invalid">Bestandsnaam \"%1$s\" is ongeldig</string>

View File

@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -1,6 +1,6 @@
#Tue Sep 20 20:32:06 CEST 2016
#Tue Oct 08 15:41:22 CEST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip

View File

@@ -27,6 +27,7 @@ namespace keepass2android
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(ctx, Android.Resource.Style.ThemeHoloLightDialog));
builder.SetTitle(ctx.GetString(Resource.String.ChangeLog_title));
List<string> changeLog = new List<string>{
BuildChangelogString(ctx, new List<int>{Resource.Array.ChangeLog_1_11,Resource.Array.ChangeLog_1_11_net}, "1.11"),
BuildChangelogString(ctx, Resource.Array.ChangeLog_1_10, "1.10"),
BuildChangelogString(ctx, Resource.Array.ChangeLog_1_09e, "1.09e"),
BuildChangelogString(ctx, Resource.Array.ChangeLog_1_09d, "1.09d"),
@@ -122,21 +123,32 @@ namespace keepass2android
}
private static string BuildChangelogString(Context ctx, int changeLogResId, string version)
{
string result = "Version " + version + "\n";
{
return BuildChangelogString(ctx, new List<int>() { changeLogResId }, version);
}
private static string BuildChangelogString(Context ctx, List<int> changeLogResIds, string version)
{
string result = "Version " + version + "\n";
string previous = "";
foreach (var item in ctx.Resources.GetStringArray(changeLogResId))
foreach (var changeLogResId in changeLogResIds)
{
if (item == previous) //there was some trouble with crowdin translations, remove duplicates
continue;
result += " * " + item + "\n";
previous = item;
foreach (var item in ctx.Resources.GetStringArray(changeLogResId))
{
if (item == previous) //there was some trouble with crowdin translations, remove duplicates
continue;
result += " * " + item + "\n";
previous = item;
}
}
return result;
return result;
}
}
private const string HtmlStart = @"<html>
private const string HtmlStart = @"<html>
<head>
<style type='text/css'>
a { color:#000000 }

View File

@@ -39,6 +39,9 @@ using Android.Support.V4.View;
using Android.Views.Autofill;
using CursorAdapter = Android.Support.V4.Widget.CursorAdapter;
using Object = Java.Lang.Object;
using Android.Text;
using keepass2android.search;
using KeeTrayTOTP.Libraries;
namespace keepass2android
{
@@ -115,6 +118,8 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewEntry).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = (showAddGroup || showAddEntry) ? ViewStates.Visible : ViewStates.Gone;
FindViewById(Resource.Id.fabSearch).Visibility = (showAddGroup || showAddEntry) ? ViewStates.Visible : ViewStates.Gone;
FindViewById(Resource.Id.fabTotpOverview).Visibility = CanShowTotpFab() ? ViewStates.Visible : ViewStates.Gone;
}
UpdateBottomBarElementVisibility(Resource.Id.insert_element, false);
@@ -262,6 +267,7 @@ namespace keepass2android
private bool hasCalledOtherActivity = false;
private IMenuItem searchItem;
private IMenuItem searchItemDummy;
private bool isPaused;
protected override void OnResume()
{
@@ -281,8 +287,39 @@ namespace keepass2android
RefreshIfDirty();
SetSearchItemVisibility();
}
isPaused = false;
System.Threading.Tasks.Task.Run(UpdateTotpCountdown);
}
private async System.Threading.Tasks.Task UpdateTotpCountdown()
{
while (!isPaused )
{
RunOnUiThread(() =>
{
var listView = FragmentManager.FindFragmentById<GroupListFragment>(Resource.Id.list_fragment)
.ListView;
if (listView != null)
{
int count = listView.Count;
for (int i = 0; i < count; i++)
{
var item = listView.GetChildAt(i);
if (item is PwEntryView)
{
var entryView = (PwEntryView)item;
entryView.UpdateTotp();
}
}
}
});
await System.Threading.Tasks.Task.Delay(1000);
}
}
private void UpdateInfotexts()
{
@@ -390,6 +427,13 @@ namespace keepass2android
}
protected override void OnPause()
{
base.OnPause();
isPaused = true;
}
private void UpdatePostNotificationsPermissionInfo(bool hideForever=false)
{
const string prefsKey = "DidShowNotificationPermissionInfo";
@@ -572,6 +616,25 @@ namespace keepass2android
};
}
if (FindViewById(Resource.Id.fabSearch) != null)
{
FindViewById(Resource.Id.fabSearch).Click += (sender, args) =>
{
if (searchView?.Iconified != false)
ActivateSearchView();
else
searchView.Iconified = true;
};
}
if (FindViewById(Resource.Id.fabTotpOverview) != null)
{
FindViewById(Resource.Id.fabTotpOverview).Click += (sender, args) =>
{
SearchTotpResults.Launch(this, this.AppTask);
};
}
if (FindViewById(Resource.Id.fabCancelAddNew) != null)
{
FindViewById(Resource.Id.fabAddNew).Click += (sender, args) =>
@@ -580,6 +643,8 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewGroup).Visibility = AddGroupEnabled ? ViewStates.Visible : ViewStates.Gone;
FindViewById(Resource.Id.fabAddNewEntry).Visibility = AddEntryEnabled ? ViewStates.Visible : ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabSearch).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabTotpOverview).Visibility = ViewStates.Gone;
};
FindViewById(Resource.Id.fabCancelAddNew).Click += (sender, args) =>
@@ -588,6 +653,8 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewGroup).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNewEntry).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = ViewStates.Visible;
FindViewById(Resource.Id.fabSearch).Visibility = ViewStates.Visible;
FindViewById(Resource.Id.fabTotpOverview).Visibility = CanShowTotpFab() ? ViewStates.Visible : ViewStates.Gone;
};
@@ -667,7 +734,12 @@ namespace keepass2android
}
protected virtual bool CanShowTotpFab()
{
return App.Kp2a.CurrentDb.HasTotpEntries && Group == App.Kp2a.CurrentDb.Root;
}
private bool IsTimeForInfotext(out string lastInfoText)
{
DateTime lastDisplayTime = new DateTime(_prefs.GetLong("LastInfoTextTime", 0));
@@ -1028,6 +1100,7 @@ namespace keepass2android
searchView.Iconified = false;
AppTask.CanActivateSearchViewOnStart = false;
}
@@ -1067,6 +1140,15 @@ namespace keepass2android
public abstract ElementAndDatabaseId FullGroupId { get; }
public virtual bool MayPreviewTotp
{
get
{
return !PreferenceManager.GetDefaultSharedPreferences(this).GetBoolean(GetString(Resource.String.masktotp_key),
Resources.GetBoolean(Resource.Boolean.masktotp_default));
}
}
public override bool OnPrepareOptionsMenu(IMenu menu)
{
@@ -1267,6 +1349,7 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewGroup).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNewEntry).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabSearch).Visibility = ViewStates.Gone;
UpdateBottomBarElementVisibility(Resource.Id.insert_element, true);
UpdateBottomBarElementVisibility(Resource.Id.cancel_insert_element, true);
@@ -1330,6 +1413,7 @@ namespace keepass2android
}
ListView.ItemClick += (sender, args) => ((GroupListItemView)args.View).OnClick();
StyleListView();

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="198"
android:versionName="1.10-pre"
android:versionCode="200"
android:versionName="1.11-r0"
package="keepass2android.keepass2android"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto">

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="197"
android:versionName="1.09e-r7"
android:versionCode="200"
android:versionName="1.11-r0"
package="keepass2android.keepass2android_nonet"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto">
@@ -40,7 +40,7 @@
</intent>
</queries>
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="33" />
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
<permission android:description="@string/permission_desc2" android:icon="@drawable/ic_launcher_offline" android:label="KP2A entry search" android:name="keepass2android.keepass2android_nonet.permission.KP2aInternalSearch" android:protectionLevel="signature" />
<permission android:description="@string/permission_desc3" android:icon="@drawable/ic_launcher_offline" android:label="KP2A choose autofill dataset" android:name="keepass2android.keepass2android_nonet.permission.Kp2aChooseAutofill" android:protectionLevel="signature" />
<application

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -61,6 +61,28 @@
android:layout_width="wrap_content"
android:text="group detail"
style="@style/GroupDetailInSearchResult" />
<LinearLayout
android:id="@+id/totp_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/totp_text"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:text=""/>
<ProgressBar
android:id="@+id/TotpCountdownProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="30dp" />
</LinearLayout>
</LinearLayout>
<ImageView android:id="@+id/right_arrow"

View File

@@ -400,5 +400,23 @@
android:layout_marginRight="16dp"
android:layout_marginBottom="160dp"
android:visibility="gone"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom|right"
android:src="@drawable/ic_fab_search"
android:layout_marginRight="16dp"
android:layout_marginBottom="88dp"
android:visibility="gone"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabTotpOverview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom|right"
android:src="@drawable/ic_fab_totp"
android:layout_marginRight="16dp"
android:layout_marginBottom="160dp"
android:visibility="gone"/>
</android.support.design.widget.CoordinatorLayout>
</RelativeLayout>

View File

@@ -402,6 +402,14 @@
<string name="ShowSeparateNotifications_summary">Zobrazit oddělená upozornění pro kopírování uživatelského jména a hesla do schránky a pro aktivování klávesnice.</string>
<string name="AccServiceAutoFill_prefs">Služba automatického doplňování</string>
<string name="AutoFill_prefs">Služba automatického vyplňování</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Při automatickém vyplňování položky pomocí TOTP zobrazit oznámení položky s tlačítkem Kopírovat TOTP.</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Zobrazit oznámení položky</string>
<string name="AutoFillTotp_prefs_title">Automatické vyplňování položek TOTP</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">Zkopírovat TOTP do schránky</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">Při automatickém vyplňování položky pomocí TOTP zkopírujte TOTP do schránky</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Při automatickém vyplňování položky pomocí TOTP aktivujte vestavěnou klávesnici. Klávesnice má tlačítko TOTP.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Aktivace vestavěné klávesnice</string>
<string name="TotpCopiedToClipboard">Zkopírováno TOTP do schránky</string>
<string name="ShowKp2aKeyboardNotification_title">Notifikace klávesnice KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Zpřístupnit celý záznam pomocí klávesnice KP2A (doporučeno).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Přepnout klávesnici</string>
@@ -589,6 +597,7 @@
<string name="CouldntLoadChalAuxFile_Hint">Použijte zásuvný modul KeeChallenge v KeePass 2.x (PC) pro konfiguraci databáze k používání s odpověďmi na výzvy!</string>
<string name="ErrorUpdatingChalAuxFile">Chyba při aktualizaci pomocného souboru OTP!</string>
<string name="TrayTotp_SeedField_title">Název \"seed\" položky TOTP</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Pokud používáte Keepass 2 modul \"TrayTotp\" v ne-výchozím nastavení, zadejte název položky \"seed\" podle nastavení na PC.</string>
<string name="TrayTotp_SettingsField_title">Nastavení jména TOTP položky</string>
<string name="TrayTotp_SettingsField_summary">Zde zadejte název položky \"nastavení\" pro TrayTotp.</string>
@@ -709,6 +718,19 @@
<string name="EntryChannel_desc">Upozornění pro usnadnění přístupu k momentálně zvolené položce.</string>
<string name="CloseDbAfterFailedAttempts">Zavřít databázi po třech neúspěšných pokusech o odemknutí.</string>
<string name="WarnFingerprintInvalidated">Varování! Biometrické ověření může být zneplatněno Androidem, např. po přidání nového otisku prstu do nastavení zařízení. Ujistěte se, že vždy víte, jak odemknout pomocí hlavního hesla!</string>
<string-array name="ChangeLog_1_11">
<item>Přidána plovoucí akční tlačítka pro vyhledávání a přehled TOTP (pokud jsou přítomny položky TOTP).</item>
<item>Vylepšeno zobrazení polí TOTP přidáním indikátoru časového limitu a jeho výraznějším zobrazením.</item>
<item>TOTP lze nyní zobrazit v zobrazení skupiny.</item>
<item>Kopírování textové hodnoty do schránky při dlouhém stisknutí v zobrazení položky.</item>
<item>Usnadnění přístupu k TOTP na vestavěné klávesnici.</item>
<item>Zobrazení upozornění na položku při automatickém vyplňování položky TOTP. To umožňuje zkopírovat TOTP do schránky. Konfiguraci chování naleznete v předvolbách.</item>
<item>Aktualizovaná implementace TOTP řeší problémy s kompatibilitou s KeePass2 a TrayTOTP</item>
<item>Drobná vylepšení</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>Aktualizace pCloud SDK pro zajištění přístupu ke sdíleným složkám</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Přidání podpory oprávnění pro oznámení v systému Android 13+</item>
<item>Zlepšení implementace FTP a SFTP</item>
@@ -781,7 +803,264 @@
<item>Opravy chyb</item>
<item>Opravy chyb</item>
</string-array>
<string name="ChangeLog_1_07b"> Verze 1.07b-pre\n
* Vylepšení výkonu Argon2 pomocí vlastní implementace (Díky Chih-Hsuan Yen!)\n
* Možnost zakázání čtečky otisků poklepáním na ikonu otisku. Umožňuje obejít problémy při používání pod-displejového snímače. (Díky marcoDallas!)\n
* Vrácení pozice ukazatele při přepínání viditelnosti hesla (Díky DDoSolitary!)\n
* Vylepšení implementace pCloud (Znovu díky gilbsgilbs!)\n
* Přidána podpora AutoFill pro více prohlížečů \n
* Nová implementace OneDrive: Podpora OneDrive pro firmy, sdílené soubory, volitelné rozsahy přístupu, více účtů a opravy problémů při offline přístupu\n
* Oprava chyb
</string>
<string name="ChangeLog_1_07"> Version 1.07\n
* Opravuje padání aplikace na Samsung Android 9\n
* Umožňuje otevření více než jednoho souboru databáze, kompatibilní s KeeAutoExec\n
* SFTP: Povolit ověření veřejným klíčem při změně klíče na hostiteli\n
* Podpora pro pCloud - díky gilbsgilbs!\n
* Explicitní podpora pro Nextcloud\n
* Vylepšení ukládání a aktualizování příloh\n
* Více možností pro osobní předvolby\n
* SSL: Důvěřovat uživatelským certifikátům\n
* Vylepšení Automatického doplňování (nyní funguje ve Firefoxu, umožňuje omezení vyskakovacích oken)\n
* Opravy chyb\n
</string>
<string name="ChangeLog_1_06"> Verze 1.06\n
* Změna na ykDroid místo YubiChallenge pro Yubikey Výzva-Odpověď.\n
* Implementována podpora pro Výzva-Odpověď typu KeepassXC. Poznámka: Databáze musí být ve formátu KDBX4!\n
* Odmítání načtení souborů z Google Drive přesunutých do koše\n
* Změna implementace TLS pro FTPS, přidán workaround pro JSch bug pro servery podporující gssapi-with-mic\n
* Opravy chyb\n
</string>
<string name="ChangeLog_1_05"> Verze 1.05\n
* Použití kanálů upozornění pro Android 8. Toto umožní nastavení skrz nastavení systému.\n
* Ukazuje ikonu vstupu v upozornění.\n
* Použití Adaptivních ikon pro Android 8 a kulatých ikon pro Android 7.\n
* Možnost povolit hledání po odemknutí (viz nastavení).\n
* Změněn způsob zápisu pomocí Storage Access Frameworku, tato úprava opravuje problémy s aktualizací souborů na Google Disku které byly otevřeny pomocí výběru v systému souborů.\n
* Přidány některé vysvětlující texty k zamezení častých nedorozumění.\n
* Tvorba záloh úspěšně otevřených databází k omezení rizika ztráty dat.\n
* Aktualizován JSch pro podporu novějších SSH šifer.\n
* Povolení pro úpravu nastavení připojení, např. když je změněno heslo pro službu WebDav.\n
* Přidána podpora pro Yubikey Neo (mód statického hesla).\n
* Možnost zákazu návrhů pro automatické vyplňování.\n
* Oprava úniku dat do logu. (záznam výkon)\n
* Oprava chyb.\n
</string>
<string name="ChangeLog_1_04b"> Verze 1.04b\n
* Oprava pádů při aktivaci automatického vyplňování na zařízeních Huawei.\n
</string>
<string name="ChangeLog_1_04"> Verze 1.04\n
* Přidána funkce automatického doplňování pro Android 8.0 a novější.\n
* Aktualizovány knihovny, nástroje pro sestavení a cílová verze SDK.\n
</string>
<string name="ChangeLog_1_03">Verze 1.03\n
* Odstraněny služby zpřístupnění pro AutoFill dle požadavku Googlu. Podívejte se do nastavení přistupu hesel k nalezení doplňku poskytujícího předchozí funkci.\n
* Znovu povoleny aplikace třetích stran pro ukládání\n
* Vestavěný prohlížeč obrázků pro prohlížení připojených obrázku bez přenosu do jiných aplikací\n
* Aktualizované OkHttp pro opravu problémů s některými spojeními\n
* Podpora pro KeeTrayTOTP položky, nyní podporuje i Stream\n
</string>
<string name="ChangeLog_1_02"> Verze 1.02\n
* Různá bezpečnostní vylepšení. Děkuji za bezpečnostní hlášení od jean-baptiste.cayrou@thalesgroup.com a vincent.fargues@thalesgroup.com a za jejich spolupráci!\n
* Podpora zásuvného modulu KeyboardSwap (viz nastavení přístupového hesla): umožňuje automaticky přepnout metodu zadávání na zařízeních bez rootu. Děkuji Mishaalu Rahmanovi z XDA-Developers za spolupráci.\n
* Oprava pro službu dostupnosti s posledními verzemi Chrome\n
* Oprava nepotřebného čištění dat z čtečky otisků prstů\n
* Oprava menších pádů\n
* Aktualizované Dropbox SDK pro zajištění budoucí kompaktibility\n
* Odstraněno hlášení chyb pomocí Xamarin Insights\n
* Aktualizované nástroje pro překlad\n
</string>
<string name="ChangeLog_1_01g"> Verze 1.01-g\n
* Oprava pádu při pokusu o práci offline\n
* Oprava nesprávného kódování přihlašovacích údajů pro FTP(S)\n
* Oprava pádů při používání OneDrive na starších verzích Androidu\n
* Zobrazení času coby lokálního času na zadávacích obrazovkách\n
</string>
<string name="ChangeLog_1_01d"> Verze 1.01-d\n
* Oprava výpisu souborů na OneDrive\n
* Umožnění ignorování chyb certifikátu pokud současně selže i ověření názvu hosta (nedoporučuje se pro produkční využití)\n
* Oprava občasného selhání Rychlého Odemknutí při zadání správného kódu\n
</string>
<string name="ChangeLog_0_9_8c">Verze 0.9.8c\n
* Oprava chyby zabezpečení SSL v Microsoft Live SDK (používá se při přístupu k souborům přes OneDrive) \n
* Oprava: Předchozí vydání obsahovalo dvě vstupní metody (jedna padala) \n </string>
<string name="ChangeLog_1_01"> Verze 1.01\n
* přidána podpora pro nový formát KDBX-4 (kompaktuibilní s Keepass 2.35) včetně odvozování klíčů Argon2 key a ChaCha20 šifrování.\n
* Nová implementace WebDav úložiště, nyní umožňuje procházení souborů a podporuje moderní šifrování.\n
* Nová implementace FTP úložiště, nyní umožňuje procházení souborů a podporuje šifrování (FTPS).\n
* Aktulizace na OneDrive SDK (dříve používané Live SDK již nění aktualizováno)\n
* Aktualizace na Dropbox SDK verze 2 (dříve používaná verze 1 je zastarallá).\n
* Přidána podpora pro OwnCloud.\n
* Dotaz na práva k úložišti před otevíráním lokáních souborů
</string>
<string name="ChangeLog_1_0_0e"> Verze 1.0.0e\n
* oprava odemykání otiskem prstu na starších zařízeních Samsung s Android 6\n
* přidána nativní podpora pro x86 zařízení\n
* umožnění skrytí softwarové klávesnice během skenování otisku prstu\n
* aktualizace build systému
</string>
<string name="ChangeLog_1_0_0"> Verze 1.0.0\n
* Odemknutí dotykem prstu (vyžaduje Android 6.0+ nebo zařízení Samsung)\n
* Přidána služba automatického doplňování (vyžaduje Android 5.0+)\n
* Přidána podpora šablon\n
* Přidán mód \"pracovat offline\"\n
* Umožněno kopírování položek\n
* Mód automatického doplňování pro názvy polí\n
* Umožněno odstraňování položek ze seznamu předcházejících souborů\n
* Vyžadování oprávnění za běhu v Android 6.0\n
* Opravy chyb (ve vestavěné klávesnici, při výběru ikon)\n
* Doplněna možnost odeslání chybového hlášení\n
* Na různých místech doplněna nápověda\n
</string>
<string name="ChangeLog_0_9_9">Verze 0.9.9\n
* Kompletní přepracování vzhledu aplikace. Velké díky Stefanu Pignatarovi (http://www.spstudio.at) za jeho podporu! \n
* Možnost přidávat vlastní ikony\n
* Přidání podpory režimu více oken na zařízeních Samsung\n
* Navýšení výchozího počtu šifrovacích cyklů pro nové databáze\n
* Zjišťování duplicitních klíčů dodatečných polí, aby nedocházelo ke ztrátě dat\n</string>
<string name="ChangeLog_0_9_9c"> Verze 0.9.9c\n
* Tmavý vzhled je zpátky\n
* Můžete nainstalovat další balíčky ikon (staré ikony ve stylu Windowsjsou dostupné v obchodu Play)\n
* Doplněno potvrzení při mazání položek bez použití odpadkového koše.\n
* Opravy chyb (chybné zobrazení OTP tajného kódování, na několika místech špatná ikona aplikace)\n
</string>
<string name="ChangeLog_0_9_8b">Verze 0.9.8b\n
* Opravy chyb (uložení selhávalo pro některé databáze, nefungoval export do místního zařízení, výběr některých možností v nastavení shazoval aplikaci) \n</string>
<string name="ChangeLog_0_9_8">Verze 0.9.8\n
* Podpora Storage Access Frameworku (umožňuje zápis na SD kartu a na Google Drive z KP2A Offline) \n
* Pokus o detekci chybného uživatelského vstupu při zadávání URL adresy WebDAV (adresář místo souboru) \n
* Změna fontu pro hesla\n
* Umožnění změny účtu Dropbox\n
* Oprava chyby: Pamatování OTP hesla nyní funguje\n</string>
<string name="ChangeLog_0_9_7b">Verze 0.9.7b\n
* aktualizovány překlady\n
* opravy chyb: Chybějící font pro hesla ve verzi 0.9.7, řazení podle názvu neřadilo skupiny\n</string>
<string name="ChangeLog_0_9_7">Verze 0.9.7\n
* podpora zápisu pro databáze Keepass 1 (kdb) (beta!)\n
* lepší přepínání zpět na předešlou klávesnici (funguje i na zařízeních bez rootu)\n
* podpora pro KeeChallenge s proměnnou délkou výzev\n
* zabránění snímání obrazovky na obrazovce Rychlého odemknutí a obrazovkách s hesly\n
* obrácení směru řazení při řazení podle data změny (nyní sestupně)\n
* opravy chyb: Zobrazení poznámek se nyní korektně aktualizuje po provedení změn, Obrazovky s hesly nyní správně skrývají hesla na (snad) všech zařízeních, Opraven problém, který umožňoval přidat záznam dvakrát, Opraven problém se zobrazováním varování na duplicitní UUID i po opravení databáze\n</string>
<string name="ChangeLog_0_9_6">Version 0.9.6\n
* allow to import key file and/or local database file to app internal directory (see settings)\n
* allow different sorting options\n
* improved preferences for automatic keyboard switching\n
* updated app logo and notification design, design by Stefano Pignataro (http://www.spstudio.at)\n
* password generator remembers last settings\n
* set notification visibility for Android 5 lock screen\n
* now clearing master password field when leaving the app without tapping OK\n
* fixed issue with missing input languages in keyboard setting on some devices\n
* fixed issue with automatic keyboard switching on rooted devices\n
* added check for corrupt databases (duplicate UUIDs)\n
* automatically reload database when change detected, solves security concern about revealing master password\n
* improved polish small keyboard layout, fixed keyboard settings theme (thanks to Wiktor Ławski)\n</string>
<string name="ChangeLog_0_9_5"> <b>Verze 0.9.5</b> \n * opraveny problémy s procházením souborů (zejména pokud jde o Android 4.4) \n * opraven problém s načítáním souborů .kdb (Keepass 1) na 5 Nexus s Android Lollipop\n * přidána možnost zabránit sejmutí screenshotu nebo zobrazení aplikace v seznamu posledních aplikací\n * opraven problém s Google Drive úložištěm (obyčejná edice) \n * povoleno uložení souborů s klíči na zvoleném úložišti (obyčejná edice) \n * aktualizováno Dropbox SDK obsahující oficiální bezpečnostní opravy (obyčejná edice) \n * aktualizovány vývojové nástroje--&gt; velikost apk se zvýšila:-(\nSlíbil jsem nějaké další změny, ty budou v dalším vydání, omlouvám se, chtěl jsem co nejrychleji zveřejnit tyto opravy.</string>
<string name="ChangeLog_0_9_4"><b>Verze 0.9.4</b>\n
* doplněna podpora zásuvných modulů. Prohlédněte Nastavení pro jejich získání\n
* uvolněn modul pro QR kód (načítání hesel, zobrazení hesel jako QR kód, přenos záznamů mezi zařízeními)\n
* uvolněn modul InputStick (přenost pověření do PC pomocí bluetooth - vyžaduje InputStick USB)\n
* aplikace třetích stran nyní mohou využívat KP2A pro dotazy na údaje. Jste-li vývojář, využijte toho ve vaší aplikaci!\n
* přidána podpora pro TOTP (kompatibilní s KeeOTP a TrayTotp)\n
* aplikace by již neměla být nuceně ukončena při otevřenédatabázi\n
* databáze již není uzamčena při opuštění aplikace tlačítkem zpět (viz nastavení)\n
* zobrazení názvu kategorie ve výsledcích hledání (*)\n
* doplněno kontextové menu ve výsledcích hledání. Mimojiné obsahuje volbu \"Navigovat na zdroj\" (*)\n
* doplnena volba pro zobrazení názvu kategorie při prohlížení záznamu (*)\n
* (*) tyto funkce doplnil Matthieu, díky!\n
* doplněna podpora pro KeeChallenge (s Yubikey NEO). Konektor doplnil Ben Rush, díky!\n
* zlepšení uživatelského rozhraní\n
* opravena chyba v rozhraní ke Google Drive\n
* doplněna možnost ke skrytí tlačítka pro příspěvek\n
* Ikona QuickUnlock icon je nyní na zařízeních s Android 4.2+ standardně skryta\n </string>
<string name="ChangeLog_0_9_3_r5"> <b>Verze 0.9.3 r5</b>\n
* Integrované opravy od uživatele Xamarin: Keepass2Android je nyní kompatibilní s ART na Android 4.4.2. Konečně!\n
* Opravy chyb: chyby v synchronizaci (obnovování obrazovky, správna kontrola změn přes http), chyby na zařízeních Android 2.x, chyby v implementacích úložišť Google Drive a SkyDrive, vyčištění schránky při zavření databáze, chyba při otvírání příloh, problémy při zobrazení s klávesnicí\n</string>
<string name="ChangeLog_0_9_3"><b>Verze 0.9.3</b>\n
* Nová klávesnice s mnoha vylepšeními. Viz nastavení.\n
* Podpora pro čtení souborů kdb (Keepass 1). Experimentální!\n
* Doplněna podpora SFTP\n
* Doplněn trik pro obejití chyby při využití ART (Android 4.4.2)\n
* Opravy chyb\n</string>
<string name="ChangeLog_0_9_2"> <b>Verze 0.9.2</b> \n
* Přidána podpora OTP (kompatibilní s OtpKeyProv pluginem) \n
* Integrována podpora NFC pro OTP z YubiKey NEO \n
* Několik vylepšení uživatelského rozhraní \n
* Integrována knihovna KeePass 2.24 \n
* Přidána možnost zabít proces aplikace (viz Nastavení) \n
* Opravy chyb \n</string>
<string name="ChangeLog_0_9_1"><b>Verze 0.9.1</b>\n
* Přidána podpora SkyDrive (pouze Keepass2Android normální edice)\n
* Oprava problémů s integrací Google Drive\n
* Přidána podpora NTLM</string>
<string name="ChangeLog_0_9"> <b>Verze 0.9</b> \n
* integrace podpory Dropbox a Google Drive (čtení/zápis databáze; Keepass2Android pouze normální verze) \n
* podpora vlastního prohlížeče souborů (založen na android-filechooser HBA) \n
* vylepšené uživatelské rozhraní pro vytváření nových databází\n
* zahrnuto vlastní písmo DejaVu Sans Mono pro zobrazování hesel\n
* opravy chyb</string>
<string name="ChangeLog_0_8_6"> <b>Verze 0.8.6</b> \n
* podpora Twofish šifry\n
* možnost editace skupin\n
* možnost přesunu položek a skupin\n
* Ikona Rychlého odemknutí může být zprůhledněna (viz nastavení)\n
* opravy chyb</string>
<string name="ChangeLog_0_8_5"><b>Version 0.8.5</b>\n
* Remote files are stored in the local app cache to allow offline usage (including editing and later synchronization). See settings. \n
* Notification icon to visualize the lock-state of the database (see settings)\n
* Improved determination of lock-state in some situations\n
* Database files are loaded to memory while you are typing your password for increased loading speed (see settings)\n
* Entries can be added to root group\n
* Bug fixes (resolving reference fields, problems with keyboard on Italian and Chinese devices)</string>
<string name="ChangeLog_0_8_4"><b>Verze 0.8.4</b> \n
* Detekce a uložení změn v externích databázích při ukládání \n
* Zrychlení načítání \n
* Vylepšený nástroj hledání s doporučeními \n
* Nové App logo \n
* Přidána podpora pro formát .kdbp pro rychlejší otvírání/ukládání \n
* Vylepšená editace doplňujících textů a skrytý disple v chráněném móodu \n
Díky Alex Vallat za příspěvky v kódu! \n
Díky Niki Hüttner (www.close-cut.de) za nové logo! \n</string>
<string name="ChangeLog_0_8_3"><b>Verze 0.8.3</b>\n
* Uživatelské jméno/TAN index je zobrazen v seznamu položek (viz nastavení)\n
* Pokud hledání z prohlížeče nenalezne žádný záznam, je možno vytvořit nové polžky\n
* KP2A klávesnice nabízí možnost hledání jména/hesla pro aktuálně používanou aplikaci\n
* Aplikace se automaticky zavře po výběru položky pro použití v klávesnici\n
* Dialog výběru klávesnice se automaticky otevírá po hledání adresy URL (viz nastavení)\n
* Zástupné a popisné položky ve vstupních polích jsou nahrazeny před kopírováním (většina popisků podporována)\n
* opravy drobných chyb
  </string>
<string name="ChangeLog_0_8_2"><b>Verze 0.8.2</b>\n
* podpora pro ověřování algoritmem Digest Authentication pro WebDAV\n
* Opravy chyb (správce souborů, otevřít adresu URL)</string>
<string name="ChangeLog_0_8_1"><b>Verze 0.8.1</b>\n
* KP2A Offline a \"Online\" mohou opět být nainstalovány společně\n
* Přidány nové překlady (díky všem přispěvatelům!)</string>
<string name="ChangeLog_0_8"><b>Verze 0.8</b>\n
* Vylepšené uživatelské rozhraní, obzvláště pro zařízení s Android 4.x\n
* Volitelná volba správce souborů pro výběr existujících souborů\n
* Přidán bezpečnější způsob otevírání příloh (za pomocí adresáře mezipaměti)\n
* opraveny chyby v Editaci aktivit\n
* pravděpodobně zaneseny nové chyby :-)</string>
<string name="ChangeLog_keptDonate">Rozšířené možnosti přispět na pivo nebo něco jiného</string>
<string name="ChangeLog_0_7"><b>Verze 0.7</b>\n
* Zrychlení načítání: klíčové transformace jsou nyní 10x rychlejší!\n
* Přidán Keepass2Android soft-keyboard: Přepněte se na tuto klávesnici pro vložení údajů pověření. Ochraňuje před útoky založenými na skenování schránky (vypněte starý systém upozornění v nastavení)\n
* Doplněna položka menu Přispět na pivo nebo na něco jiného</string>
<string name="ChangeLog"><b>Verze 0.6.2</b>\n
* Integrace Google Drive/Dropbox/... : Využívá oficiální Google Drive nebo Dropbox aplikace k otevření .kdbx-soubor, poté spustí KP2A.\n
* Vylepšení Vyhledávací dialog \n
* Vylepšené výsledky hledání pro Sdílené adresy Share URL s pod-doménami\n
* Doplnení možností pro připomínky a hodnocení aplikace\n
\n
<b>Verze 0.6.1</b>\n
* Detekce změn databáze na pozadí (i.e. např. díky synchronizaci)\n
* Vylepšeno vyhledávání adres URL z prohlížeče\n
* Potvrzovací dialog zahození změn\n
\n
<b>Verze 0.6</b>\n
První veřejné vydání
</string>
<string-array name="clipboard_timeout_options">
<item>30 sekund</item>
<item>1 minuta</item>

View File

@@ -69,7 +69,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="clipboard_timeout">Zeitsperre für Zwischenablage</string>
<string name="clipboard_timeout_summary">Zeit bis zum Löschen der Zwischenablage nach dem Kopieren von Benutzername oder Passwort</string>
<string name="copy_username">Benutzername in die Zwischenablage kopieren</string>
<string name="copy_password">Kennwort in die Zwischenablage kopieren</string>
<string name="copy_password">Passwort in die Zwischenablage kopieren</string>
<string name="copy_totp">TOTP in die Zwischenablage zu kopieren</string>
<string name="available_through_keyboard">Eintrag ist über die KP2A-Tastatur verfügbar</string>
<string name="app_language_pref_title">App Sprache</string>
@@ -96,13 +96,13 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="enable_fingerprint_unlock">Komplettes biometrisches Entsperren aktivieren</string>
<string name="enable_fingerprint_quickunlock">Biometrisches Entsperren für QuickUnlock</string>
<string name="fingerprint_unlock_failed">Biometrisches Entsperren fehlgeschlagen. Entschlüsselungsschlüssel wurde vom Android-System für ungültig erklärt. Das kommt üblicherweise vor, wenn die Biometrische Authentifizierung oder die Sicherheitseinstellungen geändert wurden. </string>
<string name="fingerprint_disabled_wrong_masterkey">Entsperren der Datenbank fehlgeschlagen: Ungültiger zusammengesetzter Schlüssel. Biometrisches Entsperren wurde deaktiviert, da das gespeicherte Masterpasswort nicht länger gültig ist.</string>
<string name="fingerprint_disabled_wrong_masterkey">Entsperren der Datenbank fehlgeschlagen: Ungültiger zusammengesetzter Schlüssel. Biometrisches Entsperren wurde deaktiviert, da das gespeicherte Hauptpasswort nicht länger gültig ist.</string>
<string name="fingerprint_reenable">Bitte Biometrisches Entsperren für das neue Hauptpasswort erneut aktivieren.</string>
<string name="fingerprint_reenable2">Bitte mit Passwort entsperren und anschließend in den Datenbankeinstellungen das Biometrische Entsperren erneut aktivieren.</string>
<string name="FingerprintInitFailed">Initialisierung der biometrischen Authentifizierung fehlgeschlagen. </string>
<string name="FingerprintSetupFailed">Daten konnten nicht verschlüsselt werden. Dies kann passieren, wenn Fingerabdrücke in den Systemeinstellungen hinzugefügt oder gelöscht wurden, während Keepass2Android auf deinen Fingerabdruck wartet.</string>
<string name="enable_fingerprint_unlock_Info">Mit dieser Option wird das Hauptpasswort verschlüsselt im Android-Keystore auf dem Gerät gespeichert, geschützt durch einen Fingerabdruck. Dadurch kann die Datenbank per biometrischer Authentifizierung entsperrt werden.</string>
<string name="enable_fingerprint_quickunlock_Info">Erlaubt es, den biometrische Authentifizierung anstelle des QuickUnlock-Codes zu nutzen. Speichert keine Informationen bezüglich des Masterpassworts.</string>
<string name="enable_fingerprint_quickunlock_Info">Erlaubt es, die biometrische Authentifizierung anstelle des QuickUnlock-Codes zu nutzen. Speichert keine Informationen bezüglich des Hauptpassworts.</string>
<string name="enter_filename">Dateinamen der Datenbank eingeben</string>
<string name="entry_accessed">Letzter Zugriff</string>
<string name="entry_cancel">Abbrechen</string>
@@ -135,7 +135,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="error_invalid_db">Ungültige Datenbank.</string>
<string name="error_invalid_path">Ungültiger Pfad.</string>
<string name="error_no_name">Ein Name ist erforderlich.</string>
<string name="error_nopass">Ein Kennwort oder eine Schlüsseldatei wird benötigt.</string>
<string name="error_nopass">Ein Passwort oder eine Schlüsseldatei ist erforderlich.</string>
<string name="error_pass_gen_type">Mindestens eine Form der Passwort-Generierung muss ausgewählt werden</string>
<string name="error_pass_match">Die Passwörter stimmen nicht überein.</string>
<string name="error_rounds_not_number">Anzahl der Wiederholungen muss eine Zahl sein.</string>
@@ -148,7 +148,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="group">Gruppe</string>
<string name="hint_comment">Notizen</string>
<string name="hint_conf_pass">Passwort bestätigen</string>
<string name="hint_generated_password">Erzeugtes Kennwort</string>
<string name="hint_generated_password">Erzeugtes Passwort</string>
<string name="hint_group_name">Name der Gruppe</string>
<string name="hint_keyfile">Schlüsseldatei</string>
<string name="hint_length">Länge</string>
@@ -193,7 +193,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="menu_navigate">Zur übergeordneten Gruppe navigieren</string>
<string name="menu_donate">Spendiere ein Bier...</string>
<string name="menu_edit">Bearbeiten</string>
<string name="menu_hide_password">Kennwort verstecken</string>
<string name="menu_hide_password">Passwort verbergen</string>
<string name="menu_lock">Datenbank sperren</string>
<string name="menu_open">Öffnen</string>
<string name="menu_close">Schließen</string>
@@ -369,12 +369,12 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="UseFileTransactions_summary">Dateitransaktionen beim Schreiben von Datenbank-Dateien verwenden</string>
<string name="LockWhenScreenOff_title">Sperren, wenn Bildschirm ausgeschaltet</string>
<string name="LockWhenScreenOff_summary">Sperre die Datenbank wenn der Bildschirm ausgeschaltet wird.</string>
<string name="ClearPasswordOnLeave_title">Eingegebenes Master-Passwort-Feld leeren</string>
<string name="ClearPasswordOnLeave_summary">Leere das Eingabefeld für das Master-Passwort, wenn der Passwort-Eingabebildschirm verlassen wird, ohne dass die Datenbank entsperrt wurde.</string>
<string name="ClearPasswordOnLeave_title">Eingegebenes Hauptpasswort-Feld leeren</string>
<string name="ClearPasswordOnLeave_summary">Leere das Eingabefeld für das Hauptpasswort, wenn der Passwort-Eingabebildschirm verlassen wird, ohne dass die Datenbank entsperrt wurde.</string>
<string name="LockWhenNavigateBack_title">Beim Verlassen der App sperren</string>
<string name="LockWhenNavigateBack_summary">Datenbank sperren, wenn die App mit dem Zurück-Knopf verlassen wird.</string>
<string name="UseKp2aKeyboardInKp2a_title">Integrierte Tastatur in Keepass2Android verwenden</string>
<string name="UseKp2aKeyboardInKp2a_summary">Wenn Sie ihrer Standardtastatur nicht vertrauen, setzen Sie diese Option, um die Built-In-Tastatur beim Eingeben des Masterkennworts oder beim Bearbeiten von Einträgen zu benutzen.</string>
<string name="UseKp2aKeyboardInKp2a_summary">Wenn du deiner Standardtastatur nicht vertraust, aktiviere diese Option, um die integrierte Tastatur beim Eingeben des Hauptpassworts oder beim Bearbeiten von Einträgen zu benutzen.</string>
<string name="ActivateSearchViewOnStart_title">Suchfeld beim Start aktivieren</string>
<string name="ActivateSearchViewOnStart_summary">Aktiviert das Suchfeld in der Gruppenansicht nach dem Entsperren oder wenn ein Eintrag gesucht wird.</string>
<string name="NoDonateOption_title">Spenden-Option ausblenden</string>
@@ -403,6 +403,14 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="ShowSeparateNotifications_summary">Getrennte Benachrichtigungen zum Kopieren von Benutzername und Passwort in die Zwischenablage und zur Aktivierung der Eingabemethode anzeigen.</string>
<string name="AccServiceAutoFill_prefs">AutoFill Accessibility-Service</string>
<string name="AutoFill_prefs">AutoFill-Dienst</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Eintragsbenachrichtigung mit einem Kopieren-Button anzeigen, wenn Autofill für einen Eintrag mit TOTP durchgeführt wird.</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Eintragsbenachrichtigung anzeigen</string>
<string name="AutoFillTotp_prefs_title">Autofill für TOTP-Einträge</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">TOTP in Zwischenablage kopieren</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">TOTP in die Zwischenablage kopieren bei Autofill eines Eintrags mit TOTP</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Integrierte Tastatur aktivieren bei Autofill eines Eintrags mit TOTP. Die Tastatur hat einen TOTP-Button.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Integrierte Tastatur aktivieren</string>
<string name="TotpCopiedToClipboard">TOTP in Zwischenablage kopiert</string>
<string name="ShowKp2aKeyboardNotification_title">KP2A-Tastatur-Benachrichtigung</string>
<string name="ShowKp2aKeyboardNotification_summary">Kompletten Eintrag über die KP2A-Tastatur bereitstellen (empfohlen).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Tastatur umschalten</string>
@@ -564,7 +572,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="help_master_password">Die eigene Datenbank wird mit dem hier eingegebenen Passwort verschlüsselt. Dazu ein starkes Passwort verwenden, um die Datenbank abzusichern! Tipp: Sich ein oder zwei Sätze ausdenken und die Anfangsbuchstaben als Passwort nutzen. Auch die Satzzeichen mit einschließen.</string>
<string name="hint_master_password">Wähle ein Master-Passwort, mit dem deine Datenbank geschützt wird:</string>
<string name="key_file">Schlüsseldatei</string>
<string name="help_key_file">Eine Schlüsseldatei ist im Grunde ein Kennwort, das in einer Datei gespeichert ist. Schlüsseldateien sind üblicherweise stärker als Kennwörter, weil sie deutlich komplexer sein können; allerdings ist es schwerer, sie geheim zu halten. Wird die Datenbank in der Cloud gespeichert, sollte die Schlüsseldatei keinesfalls ebenfalls dort abgelegt werden! Das würde sie völlig nutzlos machen! Wichtig: Den Inhalt der Schlüsseldatei nicht mehr ändern, nachdem die Datenbank angelegt wurde!</string>
<string name="help_key_file">Eine Schlüsseldatei ist im Grunde ein Passwort, das in einer Datei gespeichert ist. Schlüsseldateien sind üblicherweise stärker als Passwörter, weil sie deutlich komplexer sein können; allerdings ist es schwerer, sie geheim zu halten. Wird die Datenbank in der Cloud gespeichert, sollte die Schlüsseldatei keinesfalls ebenfalls dort abgelegt werden! Das würde sie völlig nutzlos machen! Wichtig: Den Inhalt der Schlüsseldatei nicht mehr ändern, nachdem die Datenbank angelegt wurde!</string>
<string name="hint_key_file">Wählen, ob eine Schlüsseldatei zusätzlich zum Hauptpasswort verwendet werden soll:</string>
<string name="use_key_file">Schlüsseldatei verwenden</string>
<string name="error_adding_keyfile">Fehler beim Hinzufügen der Schlüsseldatei!</string>
@@ -590,6 +598,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="CouldntLoadChalAuxFile_Hint">Bitte das KeeChallenge-Plugin in KeePass 2.x (PC) verwenden, um die Datenbank für die Verwendung von Challenge-Response zu konfigurieren!</string>
<string name="ErrorUpdatingChalAuxFile">Fehler beim Aktualisieren der OTP-Hilfsdatei!</string>
<string name="TrayTotp_SeedField_title">TOTP-Seed-Feldname</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Wenn das Keepass2-Plugin „TrayTotp“ nicht mit Standardeinstellungen verwendet wird, den Feldnamen für das Seed-Feld entsprechend der Einstellungen am PC angeben.</string>
<string name="TrayTotp_SettingsField_title">Feldname für TOTP-Einstellungen</string>
<string name="TrayTotp_SettingsField_summary">Feldnamen für TOTP-Einstellungen entsprechend den TrayTotp-Einstellungen eingeben.</string>
@@ -665,6 +674,22 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="Continue">Fortfahren</string>
<string name="NoFilenameWarning">Der eingegebene Pfad scheint kein gültiger Dateiname zu sein. Ist dies wirklich eine gültige Datei?</string>
<string name="FirstInvalidCompositeKeyError">Ungültiger zusammengesetzter Schlüssel! Bitte erneut probieren.</string>
<string name="RepeatedInvalidCompositeKeyHelp">Ungültiger zusammengesetzter Schlüssel! Bitte folgenden Schritte probieren, um die Datenbank zu entsperren:\n
• Sicherstellen, dass das richtige Passwort eingegeben wurde. Das Augensymbol dafür nutzen, um das eingegebene Passwort anzuzeigen.\n
• Sicherstellen, dass der richtigen Passworttyp ausgewählt wurde. Er muss mit dem Typ übereinstimmen, der beim Erstellen der Datenbank gewählt wurde.\n
• Sicherstellen, dass die richtige Datenbankdatei gewählt wurde.
</string>
<string name="HintLocalBackupInvalidCompositeKey"> \n
&#8226; Tipp: Wenn die Vermutung besteht, die eigene Datenbankdatei könnte beschädigt sein oder sich nach einer Änderung nicht mehr an den Hauptschlüssel erinnern wird, kann man es mit der zuletzt erfolgreich geöffnete Dateiversion versuchen, indem auf „%1$s“ getippt und die lokale Sicherung ausgewählt wird.</string>
<string name="HintLocalBackupOtherError">\n
&#8226; Tipp: Keepass2Android hat die zuletzt erfolgreich geöffnete Dateiversion im internen Speicher gesichert. Diese kann geöffnet werden, indem „%1$s“ angetippt und das lokale Backup gewählte wird.</string>
<string name="CorruptDatabaseHelp">Die Datei ist beschädigt.\n
Anbei einige Tipps, die bei der Diagnose des Problems helfen können:\n
• Wenn die Datei über USB kopiert wurde (MTP-Modus), es noch einmal mit Tools wie MyPhoneExplorer versuchen. MTP schneidet in manchen Fällen die Dateien ab.\n
• Wenn sich die Datei vom gleichen Speicherort nicht auf dem PC öffnen lässt, ist es sehr wahrscheinlich, dass die Datei tatsächlich beschädigt ist. Bitte in diesem Fall eine Datenbanksicherung verwenden. Wenn der Verdacht besteht, dass Keepass2Android die Datei beschädigt hat, bitte Kontakt mit dem Support aufnehmen.\n
• Wenn sich die Datei auf dem PC noch öffnen lässt, bitte Kontakt mit dem Support aufnehmen. Man kann versuchen, die Datei mit anderen Einstellungen auf dem PC zu speichern (z. B. unkomprimiert) und sie dann noch einmal in Keepass2Android zu öffnen. </string>
<string name="open_other_db">Weitere Datenbank öffnen …</string>
<string name="select_database">Datenbank auswählen</string>
<string name="configure_child_dbs">Kinddatenbanken konfigurieren …</string>
@@ -692,6 +717,26 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="EntryChannel_desc">Benachrichtigung zum schnellen Zugriff auf den aktuell gewählten Eintrag.</string>
<string name="CloseDbAfterFailedAttempts">Datenbank nach drei fehlgeschlagenen biometrischen Entsperrversuchen schließen.</string>
<string name="WarnFingerprintInvalidated">Achtung! Die biometrische Authentifizierung kann von Android ungültig gemacht werden, z. B. nach dem Hinzufügen eines neuen Fingerabdrucks in den Geräteeinstellungen. Bitte sicherstellen, dass jederzeit klar ist, wie mit dem eigenen Hauptpasswort entsperrt werden kann!</string>
<string-array name="ChangeLog_1_11">
<item>Buttons für die Suche und eine TOTP-Übersicht hinzugefügt (falls TOTP-Einträge vorhanden sind)</item>
<item>Darstellung von TOTP-Feldern verbessert: Timeout-Anzeige hinzugefügt und besser sichtbar gemacht.</item>
<item>TOTPs sind nun aus der Gruppenansicht zu sehen.</item>
<item>Werte in der Eintrags-Ansicht können mittels langem Antippen in die Zwischenablage kopiert werden.</item>
<item>TOTPs einfacher aus der integrierten Tastatur heraus zugänglich gemacht.</item>
<item>Eintrags-Benachrichtigung wird angezeigt beim Autofill von TOTP-Einträgen. Dies erlaubt es, die TOTP in die Zwischenablage zu kopieren. Konfiguration des Verhaltens ist in den Einstellungen möglich.</item>
<item>TOTP-Implementierung aktualisiert, um Kompatibilitätsprobleme mit KeePass2 und TrayTOTP zu beheben.</item>
<item>Kleinere Verbesserungen</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>pCloud-SDK aktualisiert um den Zugriff auf geteilte Ordner zu ermöglichen.</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Unterstützung für Benachrichtigungsrechte für Android 13+ implementiert</item>
<item>Verbesserung der FTP- und SFTP-Implementierung</item>
<item>Zugriff zur vollständigen pCloud hinzugefügt</item>
<item>Auswahl der Systemsprache im Sprachdialog erlaubt</item>
<item>Problem beim Speichern der Schlüsseldatei + Challenge-Passwort-Typ behoben</item>
</string-array>
<string-array name="ChangeLog_1_09e">
<item>Fehlerbehebung, um Abstürze und unerwartetes Abmelden zu vermeiden</item>
<item>Wechsel auf eine neue SFTP-Implementierung, jetzt mit Unterstützung von modernen Public-Key-Algorithmen wie rsa-sha2-256</item>
@@ -757,7 +802,259 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<item>Wechsel zur BiometricPrompt-API, um die Fingerabdruckentsperrung zu verbessern; erlaubt die Verwendung von Face-Unlock z. B. auf Pixel 4.</item>
<item>Fehlerkorrekturen</item>
</string-array>
<string name="ChangeLog_1_07b"> Version 1.07b\n
* Verbesserung der Leistung von Argon2 durch die Verwendung einer nativen Implementierung (Danke an Chih-Hsuan Yen!)\n
* Der Fingerabdruck-Leser kann durch Anklicken des Fingerabdrucksymbols deaktiviert werden (das vermeidet Probleme mit Lesern unter der Displayoberfläche, Danke an marcoDallas!)\n
* Cursorposition wird nach Änderung der Sichtbarkeit von Kennwörtern wiederhergestellt (Danke an DDoSolitary!)\n
* Verbesserungen bei der pCloud-Implementierung (noch einmal Danke an gilbsgilbs!)\n
* AutoFill-Unterstützung für verschiedene weitere Browser hinzugefügt \n
* Neue Implementierung für OneDrive: einschließlich Unterstützung für OneDrive for Business, geteilte Dateien, auswählbare Zugriffsbereiche, mehrere Konten und Behebung von Problemen mit Offline-Zugriff\n
* Fehlerkorrekturen
</string>
<string name="ChangeLog_1_07">Version 1.07\n
* Abstürze unter Samsung\'s Android 9 behoben\n
* Zulassen, dass mehrere Datenbanken geöffnet werden können. Kompatibel mit KeeAutoExec\n
* SFTP: Erlaubt Authentifizierung durch das Public-Key Verfahren. Überprüft, ob sich der Hostschlüssel geändert hat\n
* Einführung von pCloud-Unterstützung - Danke an gilbsgilbs!\n
* Direkte Nextcloud-Unterstützung\n
* Verbessertes Speichern und Aktualisieren von Eintragsanhängen\n
* Zusätzliche Optionen, um Verhalten an persönliche Vorlieben anzupassen\n
* SSL: Vertraue Benutzerzertifikaten\n
* Verbesserung der AutoFill-Funktion (Funktioniert nun mit Firefox, Anzahl an Popups kann reduziert werden, mehr Optionen)\n
* Fehlerbehebungen\n </string>
<string name="ChangeLog_1_06">Version 1.06\n
* Wechsel zu ykDroid statt YubiChallenge als App für Yubikey Challenge-Response.\n
* Unterstützung für KeepassXC-style Challenge-Response implementiert. Hinweis: Datenbankformat muss KDBX4 sein!\n
* Auf Google Drive gelöschte Dateien werden nicht mehr geladen.\n
* TLS-Implementierung für FTPS gewechselt, Workaround wegen eines JSch-Bugs integriert (betrifft Server, die gssapi-with-mic unterstützen)\n
* Fehler behoben\n </string>
<string name="ChangeLog_1_05">Version 1.05\n
* Verwendung von Benachrichtigungskanälen in Android 8. So können Benachrichtigungen über die Systemeinstellungen konfiguriert werden.\n
* Eintrags-Icon wird in Benachrichtigungen angezeigt\n
* Adaptive App-Launcher-Icons für Android 8 und rundes App-Launcher-Icon für Android 7\n
* Suche kann nach dem Entsperren aktiviert werden (s. Einstellungen)\n
* Fehler beim Schreiben von Dateien über das Storage-Access-Framework behoben. Dadurch wird ein Problem behoben, wenn Dateien über den Android-Dateibrowser aus Google Drive geöffnet werden.\n
* Einige Infotexte ergänzt, um häufig auftretende Missverständnisse zu vermeiden.\n
* Nach erfolgreichem Öffnen wird eine lokale Sicherungskopie der Datenbank angelegt, um das Risiko von Datenverlust zu reduzieren.\n
* JSch aktualisiert um aktuelle SSH-Verschlüsselungsalgorithmen zu unterstützen\n
* Unterstützung für den statischen Passwortmodus des Yubikey Neo integriert.\n
* Die Autofill-Empfehlung kann leichter deaktiviert werden\n
* Fix für u.U. nach Logcat geschriebene private Daten.\n
* Bugfixes\n </string>
<string name="ChangeLog_1_04b">Version 1.04b\n
• Korrektur für App-Crash beim Aktivieren von Autofill auf Huawei-Geräten.\n </string>
<string name="ChangeLog_1_04"> Version 1.04\n
• Autofill-Dienst für Android 8.0 und höher implementiert.\n
• Bibliotheken und Build-Tools aktualisiert.\n
</string>
<string name="ChangeLog_1_03">Version 1.03\n
* Accessibility-Service für AutoFill entfernt, da dies von Google gefordert wurde. Unter Passwortzugangseinstellungen findet sich ein Plugin, das die frühere Funktionalität nachbildet.\n
* Drittanwendungen können wieder genutzt werden, um Dateien zu öffnen\n
* Bildbetrachter integriert, um angehängte Bilder zu öffnen, ohne diese in andere Apps übertragen zu müssen\n
* OkHttp aktualisiert, um Probleme mit manchen Verbindungen zu beheben.\n
* Unterstützung für KeeTrayTOTP-Einträge, so dass jetzt auch Steam-Einträge möglich sind\n </string>
<string name="ChangeLog_1_02">Version 1.02\n
* Mehrere Sicherheitsverbesserungen. Danke an jean-baptiste.cayrou@thalesgroup.com und vincent.fargues@thalesgroup.com für die Analyse und Zusammenarbeit!\n
* Unterstützung für KeyboardSwapPlugin (siehe Passworteingabe-Optionen): erlaubt es, die Eingabemethode automatisch auf die KP2A-Tastatur zu wechseln, auch ohne gerootetes Gerät. Danke an Mishaal Rahman von XDA-Developers! \n
* Korrektur für Accessibility-Service mit neueren Chrome-Versionen\n
* Korrektur für unnötiges Löschen der Fingerabdruckdaten\n
* Korrektur für kleinere Crashes\n
* Dropbox-SDK aktualisiert, um zukünftige Kompatibilität zu gewährleisten \n
* Fehlerberichterstattung mittels Xamarin Insights entfernt\n
* Build-Tools aktualisiert\n </string>
<string name="ChangeLog_1_01g">Version 1.01-g\n
* Korrektur für Absturz, wenn „Offline-Arbeiten“ aktviert ist\n
* Korrektur für Encoding der FTP(S)-Zugangsdaten\n
* Korrektur für Abstürze bei Verwendung von OneDrive und auf älteren Android-Versionen\n
* Zeiten werden als lokale Zeiten dargestellt\n </string>
<string name="ChangeLog_1_01d">Version 1.01-d\n
* Fix beim Auflisten von Dateien mit OneDrive\n
* Erlaube das Ignorieren von Zertifikatsfehlern, auch wenn Host-Name-Verification fehlschlägt (nicht für produktiven Einsatz empfohlen)\n
* Fix: QuickUnlock schlug manchmal fehl trotz korrektem Entsperr-Code\n </string>
<string name="ChangeLog_0_9_8c"> Version 0.9.8c\n
* Fix für SSL-Schwachstelle im Microsoft Live-SDK (wird benutzt beim Zugriff auf Dateien mit OneDrive)\n
* Bugfix: Vorige Veröffentlichung enthielt zwei Eingabemethoden (eine funktionierte nicht)\n
</string>
<string name="ChangeLog_1_01">Version 1.01\n
* Unterstützung für das neue KDBX-4-Format hinzugefügt (kompatibel mit Keepass 2.35), inkl. Argon2-Schlüsselableitung und ChaCha20-Verschlüsselung.\n
* WebDav-Zugriff neu implementiert, erlaubt nun Browsen in Ordnern und unterstützt moderne Verschlüsselung.\n
* FTP-Zugriff neu implementiert, erlaubt nun Browsen in Ordnern und unterstützt verschlüsselung (FTPS).\n
* OneDrive-SDK aktualisiert (zuvor verwendetes Live-SDK wird nicht mehr aktualisiert)\n
* Update auf Dropbox-SDK Version 2 (zuvor verwendete Version 1 ist veraltet).\n
* Unterstützung für OwnCloud integriert.\n
* Frage nach Speicherzugriffsberechtigung vor dem Öffnen von lokalen Dateien.</string>
<string name="ChangeLog_1_0_0e">Version 1.0.0e\n
* Fehlerkorrektur für Fingerabdruckerkennung auf älteren Samsunggeräten mit Android 6\n
* Native x86-Unterstützung hinzugefügt\n
* Bildschirmtastatur kann während Fingerabdruckerkennung deaktiviert werden\n
* Update des Buildsystems </string>
<string name="ChangeLog_1_0_0">Version 1.0.0\n
* Entsperren mit Fingerabdruck (benötigt Android 6.0+ oder ein Samsung-Gerät)\n
* Autofill-Dienst hinzugefügt (benötigt Android 5.0+)\n
* Unterstützung für Eintragsvorlagen hinzugefügt\n
* Modus „Offline arbeiten“ hinzugefügt\n
* Kopieren von Einträgen ermöglicht\n
* Automatische Vervollständigung für Feldnamen\n
* Einträge können aus der Liste der zuletzt verwendeten Dateien entfernt werden\n
* Rechte werden in Android 6.0 zur Laufzeit angefragt\n
* Fehlerbehebungen (integrierte Tastatatur wenn Symbole ausgewählt werden)\n
* Option zum Senden von Fehlerberichten hinzugefügt\n
* Hilfemeldungen an verschiedenen Stellen hinzugefügt\n \n</string>
<string name="ChangeLog_0_9_9">Version 0.9.9\n
* Komplett neues Design. Vielen Dank an Stefano Pignataro (http://www.spstudio.at) für seine Unterstützung!\n
* Möglichkeit eigene Icons für Einträge hinzuzufügen\n
* Unterstützung des Multi-Window-Modus auf Samsung-Geräten\n
* Standard-Anzahl der Verschlüsselungsrunden für neue Datenbanken erhöht\n
* Prüfung nach mehrfach vorkommenden Schlüsseln von zusätzlichen Feldern um Datenverlust zu verhindern\n
</string>
<string name="ChangeLog_0_9_9c">Version 0.9.9c\n
* Dark Theme ist zurück\n
* Man kann jetzt weitere Icon-Packs installieren (Symbole im alten Windows-Stil sind im Play Store verfügbar)\n
* Bestätigungsabfrage für das Löschen von Elementen ohne Papierkorb hinzugefügt\n
* Fehlerbehebungen (falsche Anzeige des OTP Secret Encoding, falsches Appsymbol an manchen Stellen)\n </string>
<string name="ChangeLog_0_9_8b">Version 0.9.8b\n
* Fehlerkorrektur (Speichern funktionierte bei einigen Datenbanken nicht, Export zum lokalen Gerät funktionierte nicht, einige Einstellungsoptionen verursachten einen Absturz der App)\n</string>
<string name="ChangeLog_0_9_8">Version 0.9.8\n
* Unterstützung des Storage Access Framework (erlaubt schreiben auf SD Kartr und Google Drive in KP2A Offline)\n
* Versuche, fehlerhafte Nutzereingaben bei der Eingabe von WebDAV URLs zu erkennen (Verzeichnis statt Datei)\n
* Passwort Schriftart geändert\n
* Möglichkeit, das Dropbox-Konto zu ändern\n
* Bug Fix: Speichern des OTP-Passwort-Modus</string>
<string name="ChangeLog_0_9_7b">Version 0.9.7b\n
* Übersetzungen aktualisiert\n
* Fehlr behoben: Passwortschriftart fehlte in 0.9.7, Gruppen wurden nicht sortiert, wenn „Sortieren nach Namen“ ausgewählt war\n</string>
<string name="ChangeLog_0_9_7">Version 0.9.7\n
* Schreibunterstützung für Keepass 1 (kdb) Datenbanken (Beta!)\n
* Verbessertes Zurückschalten zur vorherigen Eingabemethode (funktioniert auch auf nicht gerooteten Geräten)\n
* Unterstützung für KeeChallenge mit variablen Challenge-Längen\n
* Screenshots vom QuickUnlock-Bildschirm und Passworteingabebildschirm nicht mehr möglich\n
* Sortierreihenfolge bei Sortierung nach Änderungsdatum (jetzt absteigend)\n
* Fehlerkorrektur: Notizansicht wird nach Änderung korrekt aktualisiert; Passwortfelder sollten nun auf allen Geräten korrekt versteckt werden; Problem behoben, wegen dem ein Eintrag doppelt angelegt werden konnte; Problem mit Anzeige der Warnung wegen doppelten UUIDs behoben\n</string>
<string name="ChangeLog_0_9_6">Version 0.9.6\n
* Schlüsseldatei und/oder lokale Datenbank können in ein App-internes Verzeichnis kopiert werden (siehe Einstellungen)\n
* verschiedene Sortieroptionen\n
* Einstellungen für automatisches Tastatur-Umschalten verbessert\n
* App-Logo und Benachrichtigungsdesign aktualisiert, Design von Stefano Pignataro (http://www.spstudio.at)\n
* Keepass2Android merkt sich die letzten Einstellungen\n
* Sichtbarkeit von Benachrichtigungen unter Android 5 gesetzt \n
* Eingegebenes Hauptpasswort wird gelöscht, wenn die App verlassen wird, ohne OK zu drücken\n
* Problem mit fehlenden Tastatur-Eingabesprachen auf manchen Geräten behoben\n
* Problem mit automatischem Tastatur-Umschalten behoben\n
* Prüfung auf korrupte Datenbanken mit doppelten UUIDs\n
* Datenbank wird automatisch neu geladen, wenn eine Änderung erkannt wird (löst Sicherheitsbedenken bzgl. Möglichkeit, Hauptpasswort sehen zu können)\n
* Design der Tastatureinstellungen korrigiert (danke an Wiktor Ławski)\n</string>
<string name="ChangeLog_0_9_5"><b>Version 0.9.5</b>\n
* Probleme bei Dateiauswahl behoben (bes. auf Android 4.4)\n
* Problem beim Laden von .kdb-Dateien (Keepass 1) auf Nexus 5 mit Android Lollipop behoben\n
* Option hinzugefügt, um Screenshots und Darstellungen in der Liste der letzten Apps zu verhindern (standardmäßig aktiviert)\n
* Problem mit Google Drive behoben \n
* Schlüsseldateien können auf beliebigen Speicherorten abgelegt werden\n
* Dropbox-SDK aktualisiert, um offiziellen Sicherheitspatch zu integrieren\n
* Build-Tools aktualisiert -&gt; APK-Größe leider gewachsen, sorry :-(\n
Ich hatte noch weitere Änderungen versprochen. Diese kommen mit dem nächsten Release, dieses muss wegen aktueller Probleme so früh wie möglich veröffentlicht werden.</string>
<string name="ChangeLog_0_9_4"><b>Version 0.9.4</b> \n
* Plugin-Unterstützung hinzugefügt: siehe Einstellungen, um Plugins zu bekommen! \n
* QR-Plugin veröffentlicht (Passwörter erfassen, Passwörter als QR-Code anzeigen, Einträge auf andere KP2A-Geräte übertragen)\n
* InputStick-Plugin veröffentlicht (Anmeldeinformationen per Bluetooth auf den PC übertragen erfordert InputStick-USB-Stick)\n
* Apps von Drittanbieter können nun einfach Funktionen implementieren, um Anmeldeinformationen direkt von KP2A abzufragen. Selbst ein Entwickler? Dies bitte in die eigene App einbauen, wenn sie sich dafür eignet!\n
* TOTP-Unterstützung hinzugefügt (kompatibel mit KeeOTP und TrayTotp)\n
* App sollte von Android nicht mehr beendet werden, wenn die Datenbank geöffnet ist\n
* Datenbank ist nicht mehr gesperrt, wenn die App mit dem Zurück-Knopf verlassen wird (siehe Einstellungen)\n
* Gruppennamen können in Suchergebnissen angezeigt werden (*)\n
* Kontextmenü in der Ergebnisansicht der Suche hinzugefügt, einschließlich der Option „Zu übergeordneter Gruppe navigieren“ (*)\n
* Option zum Anzeigen des Gruppennamen von Einträgen (*)\n
* (*) Danke an Matthieu für die Umsetzung dieser Features!\n
* Unterstützung von KeeChallenge (mit Yubikey NEO). Danke an Ben Rush für die Implementierung des Connectors!\n
* verbesserte Benutzerschnittstelle.\n
* Fehler in der Google-Drive-Schnittstelle behoben.\n
* Option zum Deaktivieren der „Spenden“-Option hinzugefügt\n
* QuickUnlock-Symbol jetzt standardmäßig ausgeblendet bei Geräten mit Android 4.2+\n</string>
<string name="ChangeLog_0_9_3_r5"><b>Version 0.9.3 r5</b>\n
* Korrekturen von Xamarin übernommen: Keepass2Android ist jetzt kompatibel mit ART auf Android 4.4.2. Endlich!\n
* Fehlerkorrekturen: Fehler bei der Synchronization (Anzeigeaktualisierung, korrekte Prüfung auf Änderungen über HTTP), Fehler auf Android-2.x-Geräten, Fehler in den Implementierungen für Google Drive und OneDrive, Zwischenablage wird beim Schließen der Datenbank geleert, Fehler beim Öffnen von Anhängen, Anzeigeprobleme mit der Tastatur\n</string>
<string name="ChangeLog_0_9_3"><b>Version 0.9.3</b>\n
* Neue Tastatur mit einigen Verbesserungen. Siehe Einstellungen zum personalisieren.\n
* Leseunterstützung für kdb (Keepass-1-Dateien). Experimentell!\n
* SFTP-Unterstützung\n
* Workaround für Fehler in ART (Android 4.4.2) eingebaut\n
* Fehler korrigiert\n</string>
<string name="ChangeLog_0_9_2"><b>Version 0.9.2</b>\n
* Unterstützung für OTPs (One Time Passwords) integriert (kompatibel zum OtpKeyProv-Plugin)\n
* NFC-Support zur Eingabe von OTPs über YubiKey NEO integriert\n
* Verbesserungen an der Benutzeroberfläche\n
* Keepass-2.24-Bibliothek integriert \n
* Option zum Beenden des App-Prozesses eingebaut (s. Einstellungen)\n
* Fehler behoben\n</string>
<string name="ChangeLog_0_9_1"><b>Version 0.9.1</b>\n
* SkyDrive-Unterstützung integriert (Nur in der Nicht-Offline-Version von Keepass2Android)\n
* Probleme mit Google Drive Integration behoben\n
* NTLM-Unterstützung integriert</string>
<string name="ChangeLog_0_9"><b>Version 0.9</b>\n
* Unterstützung für Dropbox und Google Drive integriert (Datenbank lesen und schreiben; Nur in der Nicht-Offline-Version von Keepass2Android)\n
* Dateibrowser integriert (basiert auf android-filechooser von HBA)\n
* Verbesserte Benutzeroberfläche zum Anlegen von Datenbanken\n
* Schriftart DejaVu Sans Mono integriert zur Anzeige von Passwörtern\n
* Fehlerkorrekturen</string>
<string name="ChangeLog_0_8_6"><b>Version 0.8.6</b>\n
* Unterstützung für Twofish-Verschlüsselung\n
* Bearbeiten von Gruppen ermöglicht\n
* Verschieben von Einträgen und Gruppen ermöglicht\n
* Das QuickUnlock-Symbol kann transparent gemacht werden (s. Einstellungen)\n
* Bugs behoben</string>
<string name="ChangeLog_0_8_5"><b>Version 0.8.5</b>\n
* Remote-Dateien werden im lokalen Cache gespeichert. Das erlaubt Offline-Nutzung (inkl. Bearbeiten und späterem Synchronisieren). S. Einstellungen.\n
* Benachrichtigungssymbol zum Visualisieren des Sperrzustands (s. Einstellungen)\n
* Verbesserungen, um die Datenbank zur richtigen Zeit zu sperren\n
* Datenbankdateien werden in den Speicher geladen, während du das Passwort eingibst. Dadurch erhöhte Ladegeschwindigkeit.\n
* Einträge können zur Root-Gruppe hinzugefügt werden.\n
* Fehlerkorrekturen (Auflösen von von Referenzfeldern, Probleme mit der Tastatur auf italienischen und chinesischen Geräten)</string>
<string name="ChangeLog_0_8_4"><b>Version 0.8.4</b>\n
* Externe Änderungen an der Datenbank werden erkannt und beim Speichern zusammengeführt\n
* Verbesserte Geschwindigkeit beim Starten\n
* Verbesserte Suchleiste mit Vorschlägen\n
* Neues App-Logo!\n
* Unterstützung für .kdbp-Format für schnelleres Laden und Speichern hinzugefügt\n
* Verbesserung beim Bearbeiten von zusätzlichen Feldern und versteckte Darstellung von geschützten Feldern\n
Danke an Alex Vallat für seine Mitwirkung beim Code!\n
Danke an Niki Hüttner (www.close-cut.de) für das neue Logo!\n</string>
<string name="ChangeLog_0_8_3"><b>Version 0.8.3</b>\n
* Benutzername/TAN-Index wird in Liste der Einträge angezeigt (s. Einstellungen)\n
* Einträge können neu angelegt werden, wenn Suche aus Browser kein Ergebnis gebracht hat\n
* KP2A-Tastatur erlaubt Suche nach Zugangsdaten für die aktive App\n
* App schließt sich automatisch nach Auswahl eines Eintrags über die Tastatur\n
* Dialog zur Tastaturauswahl öffnet sich automatisch nach Suche nach einer URL (s. Einstellungen)\n
* Platzhalter in Eintragsfeldern werden vor dem Kopieren ersetzt (die meisten Platzhalter werden unterstützt)\n
* kleinere Fehlerkorrekturen</string>
<string name="ChangeLog_0_8_2"><b>Version 0.8.2</b>\n
* Unterstützung für Digest Authentication in WebDAV\n
* Fehlerkorrekturen (OI File manager, URL öffnen)</string>
<string name="ChangeLog_0_8_1"><b>Version 0.8.1</b>\n
* KP2A Offline and „Online“ können wieder parallel zueinander installiert werden\n
* Neue Übersetzungen hinzugefügt (Danke an alle Helfer!)</string>
<string name="ChangeLog_0_8"><b>Version 0.8</b>\n
* Verbesserte Benutzeroberfläche, vor allem für Android 4.x-Geräte\n
* Möglichkeit, Dateimanager zur Auswahl von existierenden Dateien zu verwenden\n
* Sicherer Weg zum Öffnen von Anhängen hinzugefügt (über das Cache-Verzeichnis)\n
* Fehler beim Bearbeiten von Einträgen korrigiert\n
* vermutlich neue Fehler eingeführt :-)</string>
<string name="ChangeLog_keptDonate">Erweiterte Möglichkeit, ein Bier oder etwas anderes zu spenden</string>
<string name="ChangeLog_0_7"><b>Version 0.7</b>\n
* Erhöhte Ladegeschwindigkeit: Schlüsseltransformationen sind jetzt 10× schneller!\n
* Neu: Keepass2Android-Software-Tastatur: Zu dieser Tastatur wechseln, um die Zugangsdaten einzugeben. Das schützt vor Zwischenablage-basierten Passwort-Sniffern! (die bisherigen Benachrichtigungen für das Kopieren in die Zwischenablage lassen sich in den Einstellungen deaktivieren)\n
* Option eingefügt, um mir ein Bier oder was anderes zu spendieren (s. Menü)</string>
<string name="ChangeLog"><b>Version 0.6.2</b>\n
* Integration für Google Drive/Dropbox/…: Die offizielle App für Google Drive oder Dropbox nutzen und daraus die .kdbx-Datei öffnen. Das startet dann KP2A.\n
* Verbesserter Suchdialog \n
* Verbesserte Suche bei „Teilen“ mit Subdomains\n
* Optionen für Feedback, Bewerten und Übersetzen zum Menü hinzugefügt\n
\n
<b>Version 0.6.1</b>\n
* Erkennung, wenn sich eine Datenbank im Hingrund ändert (z. B. durch eine Sync-App)\n
* Suche aus dem Browser verbessert\n
* Bestätigungsdialog, wenn Änderungen verworfen werden sollen\n
\n
<b>Version 0.6</b>\n
Erstes öffentliches Release</string>
<string-array name="clipboard_timeout_options">
<item>30 Sekunden</item>
<item>1 Minute</item>
@@ -802,7 +1099,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<item>Passwort und Challenge-Response</item>
<item>Passwort und Challenge-Response-Secret (Recovery-Modus)</item>
<item>Passwort und Challenge-Response für Keepass XC</item>
<item>Kennwort und Schlüsseldatei und Challenge-Response für Keepass XC</item>
<item>Passwort und Schlüsseldatei und Challenge-Response für Keepass XC</item>
</string-array>
<string-array name="sftp_auth_modes">
<item>Passwort</item>

View File

@@ -402,6 +402,14 @@
<string name="ShowSeparateNotifications_summary">Pokaż oddzielne powiadomienia dla kopiowania nazwy użytkownika i hasła do schowka oraz aktywacji klawiatury.</string>
<string name="AccServiceAutoFill_prefs">Autouzupełnienie usługa dostępności</string>
<string name="AutoFill_prefs">Usługa autouzupełnienia</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Podczas autouzupełniania wpisu TOTP, pokaż powiadomienie o wpisie z przyciskiem Kopiuj TOTP</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Pokaż powiadomienie o wpisie</string>
<string name="AutoFillTotp_prefs_title">Autouzupełnianie wpisów TOTP</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">Skopiuj TOTP do schowka</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">Podczas autouzupełniania wpisu TOTP, skopiuj TOTP do schowka</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Podczas autouzupełniania wpisu TOTP, aktywuj wbudowaną klawiaturę. Klawiatura ma przycisk TOTP.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Aktywuj wbudowaną klawiaturę</string>
<string name="TotpCopiedToClipboard">Skopiowano TOTP do schowka</string>
<string name="ShowKp2aKeyboardNotification_title">Powiadomienie klawiatury KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Udostępnij pełny wpis przez klawiaturę KP2A (zalecane).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Przełącz klawiaturę</string>
@@ -589,6 +597,7 @@
<string name="CouldntLoadChalAuxFile_Hint">Proszę użyć wtyczki KeeChallenge w KeePass 2.x (PC) do konfiguracji twojej bazy danych dla używania z twoją odpowiedzią na wyzwanie!</string>
<string name="ErrorUpdatingChalAuxFile">Błąd aktualizacji pomocniczego pliku OTP!</string>
<string name="TrayTotp_SeedField_title">Nazwa pola ziarna TOTP</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Jeżeli używasz wtyczki \"TrayTotp\" dla Keepass2 z ustawieniami innymi niż domyślne, wpisz tutaj nazwę pola dla pola ziarna zgodnie z ustawieniami na komputerze.</string>
<string name="TrayTotp_SettingsField_title">Nazwa pola ustawień TOTP</string>
<string name="TrayTotp_SettingsField_summary">Wpisz tutaj nazwę pola dla pola ustawień TrayTotp.</string>

View File

@@ -722,6 +722,19 @@
<string name="EntryChannel_desc">Notificação para simplificar o acesso à entrada selecionada.</string>
<string name="CloseDbAfterFailedAttempts">Fechar banco de dados após três tentativas de desbloqueio biométrico falhadas.</string>
<string name="WarnFingerprintInvalidated">Alerta! Autenticação biométrica pode ser invalidada pelo Android, por exemplo: depois de adicionar uma nova digital nas configurações do seu dispositivo. Esteja certo de sempre saber como desbloquear com sua senha mestra!</string>
<string-array name="ChangeLog_1_11">
<item>Adicionados botões de ação flutuantes para pesquisa e visão geral do TOTP (se entradas TOTP estiverem presentes).</item>
<item>Exibição aprimorada de campos TOTP adicionando um indicador de tempo limite e mostrando-o com mais destaque.</item>
<item>O TOTP agora pode ser visto na exibição do grupo.</item>
<item>Copie o valor do texto para a área de transferência pressionando longamente na exibição da entrada.</item>
<item>Torne o TOTP mais facilmente acessível no teclado integrado.</item>
<item>Mostrar notificação de entrada ao preencher automaticamente uma entrada TOTP. Isso permite copiar o TOTP para a área de transferência. Veja as preferências para configurar o comportamento.</item>
<item>Implementação TOTP atualizada para resolver problemas de compatibilidade com KeePass2 e TrayTOTP</item>
<item>Pequenas melhorias</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>Atualizado o pCloud SDK para fornecer acesso a pastas compartilhadas</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Adicionado suporte para permissões de notificação no Android 13+</item>
<item>Melhorado a implementação de FTP e SFTP</item>
@@ -963,7 +976,125 @@
* Ferramentas de compilação atualizadas --&gt; tamanho do apk aumentado :-(\n
Eu prometi mais algumas mudanças. Eles virão no próximo lançamento - desculpe. Eu queria publicar esses hot fixes o mais rápido possível.
</string>
<string name="ChangeLog_0_9_4"> <b>Versão 0.9.4</b>\n
* suporte a plug-ins adicionado: veja as configurações para obter plugins!\n
* plugin QR publicado (digitalizar senhas, exibir senhas como código QR, transferir entradas para outros dispositivos KP2A)\n
* plugin InputStick publicado (transfira credenciais para o seu PC via bluetooth - requer pendrive InputStick)\n
* Aplicativos de terceiros agora podem simplesmente implementar a consulta de credenciais do KP2A. Você é um desenvolvedor? Adicione isso ao seu aplicativo, se for adequado!\n
* adicionado suporte TOTP (compatível com KeeOTP e TrayTotp)\n
* o aplicativo não deve mais ser eliminado pelo Android quando o banco de dados estiver aberto\n
* o banco de dados não fica mais bloqueado ao sair do aplicativo com o botão Voltar (veja configurações)\n
* exibir nomes de grupos na visualização dos resultados da pesquisa (*)\n
* menu de contexto adicionado na visualização dos resultados da pesquisa, incluindo a opção \'Navegar até o pai\' (*)\n
* adicionada opção para exibir o nome do grupo na visualização de entrada (*)\n
* (*) obrigado ao Matthieu por implementar esses recursos!\n
* suporte KeeChallenge (com Yubikey NEO). Agradecemos a Ben Rush por implementar o conector!\n
* interface de usuário aprimorada\n
* corrigido um bug na interface do Google Drive\n
* adicionada opção para desativar a opção \'doar\'\n
* Ícone QuickUnlock agora oculto em dispositivos Android 4.2+ por padrão\n
</string>
<string name="ChangeLog_0_9_3_r5"> <b>Versão 0.9.3 r5</b>\n
* Correções incorporadas do Xamarin: Keepass2Android agora compatível com ART no Android 4.4.2. Finalmente!\n
* Correções de bugs: bugs na sincronização (atualização de exibição, verificação correta de alterações em http), bugs em dispositivos Android 2.x, bugs nas implementações de armazenamento do Google Drive e OneDrive, limpeza da área de transferência no banco de dados próximo, bug na abertura de anexos, problemas de exibição com teclado\n
</string>
<string name="ChangeLog_0_9_3"> <b>Versão 0.9.3</b>\n
* Novo teclado com muitas melhorias. Veja as configurações para personalizar.\n
* Suporte somente leitura para kdb (arquivos Keepass 1). Experimental!\n
* Adicionado suporte a SFTP\n
* Adicionada solução alternativa para bug no ART (Android 4.4.2)\n
* Correções de bugs\n
</string>
<string name="ChangeLog_0_9_2"> <b>Versão 0.9.2</b>\n
* Adicionado suporte OTP (compatível com o plugin OtpKeyProv)\n
* Suporte NFC integrado para OTPs da YubiKey NEO \n
* Várias melhorias na interface do usuário\n
* Biblioteca Keepass 2.24 integrada\n
* Adicionada opção para encerrar o processo do aplicativo (veja configurações)\n
* Validação aprimorada de certificado SSL\n
* Correções de bugs\n
</string>
<string name="ChangeLog_0_9_1"> <b>Versão 0.9.1</b>\n
* Suporte integrado ao SkyDrive (somente edição regular do Keepass2Android)\n
* Corrigidos problemas com a integração do Google Drive\n
* Adicionado suporte NTLM
</string>
<string name="ChangeLog_0_9"> <b>Versão 0.9</b>\n
* Suporte integrado ao Dropbox e ao Google Drive (leitura/gravação de bancos de dados; somente edição regular do Keepass2Android)\n
* Navegador de arquivos personalizado integrado (baseado no android-filechooser da HBA)\n
* Interface de usuário aprimorada para criação de novos bancos de dados\n
* Fonte personalizada DejaVu Sans Mono incluída para exibição de senhas\n
* Correções de bugs
</string>
<string name="ChangeLog_0_8_6"> <b>Versão 0.8.6</b>\n
* Suporte para cifra Twofish\n
* Permitir edição de grupos\n
* Permitir movimentação de entradas e grupos\n
* O ícone do QuickUnlock pode ficar transparente (consulte as configurações)\n
* Correções de bugs
</string>
<string name="ChangeLog_0_8_5"> <b>Versão 0.8.5</b>\n
* Os arquivos remotos são armazenados no cache local do aplicativo para permitir o uso offline (incluindo edição e sincronização posterior). Veja configurações. \n
* Ícone de notificação para visualizar o estado de bloqueio do banco de dados (ver configurações)\n
* Melhor determinação do estado de bloqueio em algumas situações\n
* Os arquivos do banco de dados são carregados na memória enquanto você digita sua senha para aumentar a velocidade de carregamento (consulte as configurações)\n
* As entradas podem ser adicionadas ao grupo raiz\n
* Correções de bugs (resolvendo campos de referência, problemas com teclado em dispositivos italianos e chineses)
</string>
<string name="ChangeLog_0_8_4"> <b>Versão 0.8.4</b>\n
* Alterações externas no banco de dados são detectadas e mescladas ao salvar\n
* Melhor desempenho de carregamento\n
* Barra de ferramentas de pesquisa aprimorada com sugestões\n
* Novo logotipo do aplicativo!\n
* Adicionado suporte ao formato .kdbp para carregamento/salvamento mais rápido\n
* Edição aprimorada de campos extras e exibição oculta quando protegida\n
Agradecemos a Alex Vallat por suas contribuições de código!\n
Obrigado a Niki Hüttner (www.close-cut.de) pelo novo logotipo!\n
</string>
<string name="ChangeLog_0_8_3"> <b>Versão 0.8.3</b>\n
* Nome de usuário/índice TAN exibido na lista de entradas (veja configurações)\n
* As entradas poderão ser criadas se a pesquisa no navegador não retornar resultados\n
* O teclado KP2A oferece a possibilidade de pesquisar credenciais do aplicativo atual\n
* O aplicativo fecha automaticamente após selecionar uma entrada para uso no teclado\n
* A caixa de diálogo de seleção do teclado é aberta automaticamente após a pesquisa do URL (consulte as configurações)\n
* Os espaços reservados nos campos de entrada são substituídos antes da cópia (a maioria dos espaços reservados é compatível)\n
* pequenas correções de bugs
</string>
<string name="ChangeLog_0_8_2"> <b>Versão 0.8.2</b>\n
* Suporte para autenticação Digest em WebDAV\n
* Correções de bugs (Gerenciador de arquivos OI, Abrir URL)
</string>
<string name="ChangeLog_0_8_1"> <b>Versão 0.8.1</b>\n
* KP2A Offline e \'Online\' podem ser instalados novamente\n
* Adicionadas novas traduções (obrigado a todos os colaboradores!)
</string>
<string name="ChangeLog_0_8"> <b>Versão 0.8</b>\n
* Interface de usuário aprimorada especialmente para dispositivos Android 4.x\n
* Permitir o uso de gerenciadores de arquivos deliberados para selecionar arquivos existentes\n
* Adicionada uma maneira mais segura de abrir anexos (através do diretório de cache)\n
* bugs corrigidos na atividade de edição\n
* provavelmente introduziu novos bugs :-)
</string>
<string name="ChangeLog_keptDonate">Estendida a possibilidade de doar uma cerveja ou outra coisa</string>
<string name="ChangeLog_0_7"> <b>Versão 0.7</b>\n
* Maior velocidade de carregamento: transformações principais agora 10 vezes mais rápidas!\n
* Adicionado teclado virtual Keepass2Android: mude para este teclado para inserir credenciais. Protege você contra detectores de senha baseados na área de transferência (desative as notificações antigas da área de transferência nas opções)\n
* Adicionada opção de doar uma cerveja ou outra coisa (ver o menu)
</string>
<string name="ChangeLog"> <b>Versão 0.6.2</b>\n
* Integração Google Drive/Dropbox/...: Use o aplicativo oficial Google Drive ou Dropbox e abra qualquer arquivo .kdbx. Isso agora abrirá o KP2A.\n
* Caixa de diálogo de pesquisa aprimorada \n
* Resultados de pesquisa aprimorados para Compartilhar URL com subdomínios\n
* Adicionadas opções para dar feedback, avaliar e traduzir o app no menu\n
\n
<b>Versão 0.6.1</b>\n
* Detectar quando o banco de dados for alterado em segundo plano (ou seja, devido à atividade de um aplicativo de sincronização)\n
* Pesquisa aprimorada de URLs no navegador\n
* Caixa de diálogo de confirmação ao descartar alterações\n
\n
<b>Versão 0.6</b>\n
Lançamento público inicial
</string>
<string-array name="clipboard_timeout_options">
<item>30 segundos</item>
<item>1 minuto</item>

View File

@@ -720,6 +720,19 @@
<string name="EntryChannel_desc">Obvestilo o enostavnem dostopu do trenutno izbranega vnosa.</string>
<string name="CloseDbAfterFailedAttempts">Zaprite bazo podatkov po treh neuspelih poskusih biometričnega odklepanja.</string>
<string name="WarnFingerprintInvalidated">Opozorilo! Biometrično overjanje lahko Android razveljavi, npr. po dodajanju novega prstnega odtisa v nastavitvah naprave. Poskrbite, da boste vedno vedeli odkleniti z glavnim geslom!</string>
<string-array name="ChangeLog_1_11">
<item>Dodani so plavajoči gumbi za iskanje in pregled TOTP (če so prisotni vnosi TOTP).</item>
<item>Izboljšanje prikaza polj TOTP z dodajanjem kazalnika časovne omejitve in njegovim vidnejšim prikazom.</item>
<item>TOTP je zdaj viden v pogledu skupine.</item>
<item>Kopiranje vrednosti besedila v odložišče ob dolgem pritisku v prikazu vnosa.</item>
<item>Na vgrajeni tipkovnici omogočen lažji dostop do TOTP.</item>
<item>Prikaži obvestilo o vnosu pri samodejnem izpolnjevanju vnosa TOTP. To omogoča kopiranje vnosa TOTP v odložišče. Za nastavitev glejte nastavitve.</item>
<item>Posodobljeno izvajanje TOTP za odpravo težav z združljivostjo s KeePass2 in TrayTOTP</item>
<item>Manjše izboljšave</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>Posodobitev pCloud SDK za zagotavljanje dostopa do map v skupni rabi</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Dodajanje podpore za dovoljenja za obvestila v operacijskem sistemu Android 13+</item>
<item>Izboljšanje izvajanja FTP in SFTP</item>

View File

@@ -793,6 +793,7 @@
<string name="autofill_enable_for">%1$s karşılığında otomatik doldurmayı etkinleştir</string>
<string name="invalid_link_association">Web alanı ilişkilendirmek Could %1$s uygulaması ile %2$s</string>
<string name="enable_fingerprint_hint">Keepass2Android biyometrik donanım tespit etti. Bu veri tabanı için Biyometrik Kilit Açma özelliğini etkinleştirmek ister misiniz?</string>
<string name="post_notifications_dialog_notnow">Şimdi değil</string>
<string name="understand">Anladım</string>
<string name="dont_show_again">Tekrar gösterme</string>
<string name="masterkey_infotext_head">Ana parolanızı hatırlıyor musunuz?</string>

View File

@@ -720,6 +720,13 @@
<string name="EntryChannel_desc">选定条目快速进入通知</string>
<string name="CloseDbAfterFailedAttempts">三次失败的生物识别解锁后关闭数据库。</string>
<string name="WarnFingerprintInvalidated">警告!生物识别认证可能会被Android系统作废例如在你的设备设置中添加一个新的指纹后。确保你总是知道如何用你的主密码解锁</string>
<string-array name="ChangeLog_1_10">
<item>在 Android 13+ 上添加对通知权限的支持</item>
<item>改善FTP和SFTP的代码实现</item>
<item>Add access to full pCloud</item>
<item>Allow to select System language in the language dialog</item>
<item>Fix issue with remembering Keyfile + Challenge password type</item>
</string-array>
<string-array name="ChangeLog_1_09e">
<item>修复崩溃和意外注销的 bug</item>
<item>切换到新的 SFTP 实现,支持现代公钥算法,例如 rsa-sha2-256</item>
@@ -785,6 +792,15 @@
<item>BUG修复</item>
<item>Bug 修复</item>
</string-array>
<string name="ChangeLog_1_07b"> 版本 1.07b\n
* 采用原生实现改进 Argon2 性能(感谢 Chih-Hsuan Yen!\n
* 允许点按指纹图标来禁用指纹(避免屏下指纹识别的问题,感谢 marcoDallas!\n
* 切换密码可见性时恢复光标位置(感谢 DDoSolitary!\n
* 改进 pCloud 实现(再次感谢 gilbsgilbs again!\n
* 为更多的数个浏览器增加自动填写支持 \n
* 新的 OneDrive 实现:支持 OneDrive for Business、共享文件、可选权限范围、多账户以及修复离线访问问题\n
* 其他问题修复
</string>
<string name="ChangeLog_keptDonate">捐出一杯啤酒或别的来支持我们的发展吧。</string>
<string-array name="clipboard_timeout_options">
<item>30秒</item>

View File

@@ -727,6 +727,21 @@
<string name="CloseDbAfterFailedAttempts">Close database after three failed biometric unlock attempts.</string>
<string name="WarnFingerprintInvalidated">Warning! Biometric authentication can be invalidated by Android, e.g. after adding a new fingerprint in your device settings. Make sure you always know how to unlock with your master password!</string>
<string-array name="ChangeLog_1_11">
<item>Added floating action buttons for search and TOTP overview (if TOTP entries are present).</item>
<item>Improved display of TOTP fields by adding a timeout indicator and showing it more prominently.</item>
<item>TOTP can now be seen from the group view.</item>
<item>Copy text value to clipboard on long-press in entry view.</item>
<item>Make TOTP more easily accessible on the built-in keyboard.</item>
<item>Show entry notification when autofilling a TOTP entry. This allows to copy the TOTP to clipboard. See preferences to configure the behavior.</item>
<item>Updated TOTP implementation to resolve compatibility issues with KeePass2 and TrayTOTP</item>
<item>Minor improvements</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>Update pCloud SDK to provide access to shared folders</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Add support for notification permissions on Android 13+</item>
<item>Improve the FTP and SFTP implementation</item>

View File

@@ -828,7 +828,7 @@ namespace keepass2android
new DropboxAppFolderFileStorage(LocaleManager.LocalizedAppContext, this),
GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(LocaleManager.LocalizedAppContext)==ConnectionResult.Success ? new GoogleDriveFileStorage(LocaleManager.LocalizedAppContext, this) : null,
GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(LocaleManager.LocalizedAppContext)==ConnectionResult.Success ? new GoogleDriveAppDataFileStorage(LocaleManager.LocalizedAppContext, this) : null,
new OneDriveFileStorage(LocaleManager.LocalizedAppContext, this),
new OneDriveFileStorage(),
new OneDrive2FullFileStorage(),
new OneDrive2MyFilesFileStorage(),
new OneDrive2AppFolderFileStorage(),

View File

@@ -88,7 +88,7 @@
</Choose>
<ItemGroup Condition=" '$(Flavor)'=='NoNet' ">
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
<Version>13.0.3</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
@@ -227,6 +227,7 @@
<Compile Include="fileselect\FileSelectActivity.cs" />
<Compile Include="fileselect\FileDbHelper.cs" />
<Compile Include="search\SearchProvider.cs" />
<Compile Include="search\SearchTotpResults.cs" />
<Compile Include="SelectStorageLocationActivity.cs" />
<Compile Include="services\AutofillBase\AutofillFieldMetadata.cs" />
<Compile Include="services\AutofillBase\AutofillFieldMetadataCollection.cs" />
@@ -1988,6 +1989,18 @@
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\ic_entry_totp.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\ic_fab_search.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\ic_fab_search.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\ic_fab_totp.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\ic_fab_totp.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -0,0 +1,162 @@
/*
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 3 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 <http://www.gnu.org/licenses/>.
*/
using System;
using System.Linq;
using System.Text.RegularExpressions;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Preferences;
using Android.Views;
using Android.Widget;
using keepass2android.view;
using KeePassLib;
namespace keepass2android.search
{
/// <summary>
/// Activity to show search results
/// </summary>
[Activity(Label = "@string/app_name", Theme = "@style/MyTheme_ActionBar", LaunchMode = Android.Content.PM.LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]
public class SearchTotpResults : GroupBaseActivity
{
public static void Launch(Activity act, AppTask appTask, ActivityFlags? flags = null)
{
Intent i = new Intent(act, typeof(SearchTotpResults));
if (flags != null)
i.SetFlags((ActivityFlags)flags);
appTask.ToIntent(i);
if (flags != null && (((ActivityFlags)flags) | ActivityFlags.ForwardResult) == ActivityFlags.ForwardResult)
act.StartActivity(i);
else
act.StartActivityForResult(i, 0);
}
public override bool MayPreviewTotp
{
get
{
return true;
}
}
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
if ( IsFinishing ) {
return;
}
SetResult(KeePass.ExitNormal);
// Likely the app has been killed exit the activity
if (!App.Kp2a.DatabaseIsUnlocked)
{
Finish();
}
Group = new PwGroup()
{
Name = GetString(Resource.String.TOTP)
};
try
{
foreach (var db in App.Kp2a.OpenDatabases)
{
foreach (var entry in db.EntriesById.Values)
{
var totpData = new Kp2aTotp().TryGetTotpData(new PwEntryOutput(entry, db));
if (totpData?.IsTotpEntry == true)
Group.AddEntry(entry, false);
}
}
}
catch (Exception e)
{
Kp2aLog.LogUnexpectedError(e);
Toast.MakeText(this, e.Message, ToastLength.Long).Show();
Finish();
return;
}
if (Group == null || (!Group.Entries.Any()))
{
SetContentView(Resource.Layout.group_empty);
}
SetGroupTitle();
FragmentManager.FindFragmentById<GroupListFragment>(Resource.Id.list_fragment).ListAdapter = new PwGroupListAdapter(this, Group);
}
public override bool EntriesBelongToCurrentDatabaseOnly
{
get { return false; }
}
public override ElementAndDatabaseId FullGroupId
{
get { return null; }
}
public override void OnCreateContextMenu(IContextMenu menu, View v,
IContextMenuContextMenuInfo menuInfo)
{
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) menuInfo;
ClickView cv = (ClickView) acmi.TargetView;
cv.OnCreateMenu(menu, menuInfo);
}
public override bool OnContextItemSelected(IMenuItem item) {
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo)item.MenuInfo;
ClickView cv = (ClickView) acmi.TargetView;
bool result;
return cv.OnContextItemSelected(item);
}
public override bool OnSearchRequested()
{
Intent i = new Intent(this, typeof(SearchActivity));
this.AppTask.ToIntent(i);
i.SetFlags(ActivityFlags.ForwardResult);
StartActivity(i);
return true;
}
public override bool IsSearchResult
{
get { return true; }
}
}
}

View File

@@ -13,9 +13,6 @@ using keepass2android.services.AutofillBase.model;
using System.Linq;
using Android.Content.PM;
using Kp2aAutofillParser;
#if !NoNet
using Com.Dropbox.Core.V2.Teamlog;
#endif
using AlertDialog = Android.App.AlertDialog;
namespace keepass2android.services.AutofillBase

View File

@@ -6,8 +6,10 @@ using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Content.Res;
using Android.Graphics;
using Android.Preferences;
using Android.Runtime;
using Android.Support.V4.Content;
using Android.Util;
using Android.Views;
using Android.Widget;
@@ -30,10 +32,12 @@ namespace keepass2android
public Dictionary<string, bool> DisabledQueriesValues = new Dictionary<string, bool>();
private readonly AutofillDisabledQueriesPreference _pref;
private readonly Context _context;
public DisabledQueryPreferenceScreenAdapter(AutofillDisabledQueriesPreference pref, Context context)
{
_pref = pref;
_context = context;
}
@@ -41,11 +45,25 @@ namespace keepass2android
{
private TextView text = null;
private CheckBox checkbox = null;
public CustomHolder(View row, int position, AutofillDisabledQueriesPreference pref)
public CustomHolder(View row, int position, AutofillDisabledQueriesPreference pref, Context context)
{
text = (TextView) row.FindViewById(Resource.Id.disabled_query_text);
text.Text = pref.DisabledQueries[position].DisplayName;
TypedValue typedValue = new TypedValue();
Resources.Theme theme = context.Theme;
if (theme != null)
{
theme.ResolveAttribute(Android.Resource.Attribute.TextColorPrimary, typedValue, true);
using (TypedArray arr = context.ObtainStyledAttributes(typedValue.Data, new int[] { Android.Resource.Attribute.TextColorPrimary }))
{
var primaryColor = arr.GetColorStateList(0);
text.SetTextColor(primaryColor);
}
}
checkbox = (CheckBox) row.FindViewById(Resource.Id.disabled_query_checkbox);
checkbox.Id = position;
@@ -79,7 +97,7 @@ namespace keepass2android
int p = position;
row = LayoutInflater.From(_pref.Context)
.Inflate(Resource.Layout.disabled_queries_preference_row, parent, false);
holder = new CustomHolder(row, position, _pref);
holder = new CustomHolder(row, position, _pref, _context);
row.Tag = holder;

View File

@@ -26,6 +26,10 @@ using Android.Text;
using Android.Text.Style;
using Android.Preferences;
using KeePass.Util.Spr;
using KeeTrayTOTP.Libraries;
using PluginTOTP;
using Android.Content;
using System.ComponentModel;
namespace keepass2android.view
@@ -37,8 +41,11 @@ namespace keepass2android.view
private readonly TextView _textView;
private readonly TextView _textviewDetails;
private readonly TextView _textgroupFullPath;
private readonly ProgressBar _totpCountdown;
private readonly TextView _totpText;
private readonly LinearLayout _totpLayout;
private int _pos;
private int _pos;
private int? _defaultTextColor;
@@ -82,7 +89,18 @@ namespace keepass2android.view
_textgroupFullPath = (TextView)ev.FindViewById(Resource.Id.group_detail);
_textgroupFullPath.TextSize = PrefsUtil.GetListDetailTextSize(groupActivity);
_showDetail = PreferenceManager.GetDefaultSharedPreferences(groupActivity).GetBoolean(
_totpCountdown = ev.FindViewById<ProgressBar>(Resource.Id.TotpCountdownProgressBar);
_totpText = ev.FindViewById<TextView>(Resource.Id.totp_text);
_totpLayout = ev.FindViewById<LinearLayout>(Resource.Id.totp_layout);
_totpLayout.LongClick += (sender, args) =>
{
string totp = UpdateTotp();
if (!String.IsNullOrEmpty(totp))
CopyToClipboardService.CopyValueToClipboardWithTimeout(_groupActivity, totp, true);
};
_showDetail = PreferenceManager.GetDefaultSharedPreferences(groupActivity).GetBoolean(
groupActivity.GetString(Resource.String.ShowUsernameInList_key),
Resources.GetBoolean(Resource.Boolean.ShowUsernameInList_default));
@@ -112,20 +130,20 @@ namespace keepass2android.view
ev.FindViewById(Resource.Id.icon).Visibility = ViewStates.Visible;
ev.FindViewById(Resource.Id.check_mark).Visibility = ViewStates.Invisible;
Database db = App.Kp2a.FindDatabaseForElement(_entry);
_db = App.Kp2a.FindDatabaseForElement(_entry);
ImageView iv = (ImageView)ev.FindViewById(Resource.Id.icon);
bool isExpired = pw.Expires && pw.ExpiryTime < DateTime.Now;
if (isExpired)
{
db.DrawableFactory.AssignDrawableTo(iv, Context, db.KpDatabase, PwIcon.Expired, PwUuid.Zero, false);
_db.DrawableFactory.AssignDrawableTo(iv, Context, _db.KpDatabase, PwIcon.Expired, PwUuid.Zero, false);
} else
{
db.DrawableFactory.AssignDrawableTo(iv, Context, db.KpDatabase, pw.IconId, pw.CustomIconUuid, false);
_db.DrawableFactory.AssignDrawableTo(iv, Context, _db.KpDatabase, pw.IconId, pw.CustomIconUuid, false);
}
String title = pw.Strings.ReadSafe(PwDefs.TitleField);
title = SprEngine.Compile(title, new SprContext(_entry, db.KpDatabase, SprCompileFlags.All));
title = SprEngine.Compile(title, new SprContext(_entry, _db.KpDatabase, SprCompileFlags.All));
var str = new SpannableString(title);
if (isExpired)
@@ -146,7 +164,7 @@ namespace keepass2android.view
_textView.SetTextColor(new Color((int)_defaultTextColor));
String detail = pw.Strings.ReadSafe(PwDefs.UserNameField);
detail = SprEngine.Compile(detail, new SprContext(_entry, db.KpDatabase, SprCompileFlags.All));
detail = SprEngine.Compile(detail, new SprContext(_entry, _db.KpDatabase, SprCompileFlags.All));
if ((_showDetail == false) || (String.IsNullOrEmpty(detail)))
{
@@ -173,7 +191,7 @@ namespace keepass2android.view
String groupDetail = pw.ParentGroup.GetFullPath();
if (App.Kp2a.OpenDatabases.Count() > 1)
{
groupDetail += "(" + App.Kp2a.GetFileStorage(db.Ioc).GetDisplayName(db.Ioc) + ")";
groupDetail += "(" + App.Kp2a.GetFileStorage(_db.Ioc).GetDisplayName(_db.Ioc) + ")";
}
var strGroupDetail = new SpannableString (groupDetail);
@@ -186,7 +204,16 @@ namespace keepass2android.view
_textgroupFullPath.Visibility = ViewStates.Visible;
}
}
//try to get totp data
UpdateTotp();
}
public void ConvertView(PwEntry pw, int pos)
{
@@ -248,6 +275,42 @@ namespace keepass2android.view
{
LaunchEntry();
}
}
private TotpData _totpData;
private Database _db;
public string UpdateTotp()
{
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(_groupActivity);
bool showTotpDefault = _groupActivity.MayPreviewTotp;
if (showTotpDefault)
_totpData = new Kp2aTotp().TryGetTotpData(new PwEntryOutput(_entry, _db));
else
_totpData = null;
if (_totpData?.IsTotpEntry != true)
{
_totpLayout.Visibility = ViewStates.Gone;
return null;
}
_totpLayout.Visibility = ViewStates.Visible;
TOTPProvider prov = new TOTPProvider(_totpData);
string totp = prov.GenerateByByte(_totpData.TotpSecret);
_totpText.Text = totp;
var progressBar = _totpCountdown;
progressBar.Progress = prov.Timer;
progressBar.Max = prov.Duration;
return totp;
}
}
}