Compare commits

..
35 Commits
Author SHA1 Message Date
Alexander Bakker 0046e8827e Release v3.2
build / test (push) Canceled after 0s
build / build (push) Canceled after 0s
2024-09-08 18:41:30 +02:00
Alexander Bakker 5640b8be83 Update translations from Crowdin 2024-09-08 18:28:07 +02:00
Alexander BakkerandGitHub 3bc3448b5c Merge pull request #1468 from michaelschattgen/feature/add-search-behavior
Add preference to change search behavior
2024-09-06 19:36:54 +02:00
Michael SchättgenandGitHub 7472e32b25 Merge pull request #1466 from alexbakker/fix-audit-log-crash
Account for audit log entries that reference deleted entries
2024-09-04 11:31:12 +02:00
Michael Schättgen 3425256c29 Add preference to switch search behavior 2024-08-28 16:32:23 +02:00
Alexander Bakker b92956dece Account for audit log entries that reference deleted entries
This fixes the following crash I noticed in the developer console:

```
Exception java.lang.AssertionError:
  at com.beemdevelopment.aegis.util.UUIDMap.getByUUID (UUIDMap.java:127)
  at com.beemdevelopment.aegis.vault.VaultRepository.getEntryByUUID (VaultRepository.java:229)
  at com.beemdevelopment.aegis.ui.fragments.preferences.AuditLogPreferencesFragment.lambda$onViewCreated$0 (AuditLogPreferencesFragment.java:70)
  at androidx.lifecycle.LiveData.considerNotify (LiveData.java:133)
  at androidx.lifecycle.LiveData.dispatchingValue (LiveData.java:151)
  at androidx.lifecycle.LiveData.setValue (LiveData.java:309)
  at androidx.lifecycle.LiveData$1.run (LiveData.java:93)
  at android.os.Handler.handleCallback (Handler.java:959)
  at android.os.Handler.dispatchMessage (Handler.java:100)
  at android.os.Looper.loopOnce (Looper.java:232)
  at android.os.Looper.loop (Looper.java:317)
  at android.app.ActivityThread.main (ActivityThread.java:8592)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:580)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:878)
```
2024-08-27 23:01:33 +02:00
Michael SchättgenandGitHub 20c5236cfa Merge pull request #1467 from alexbakker/trim-search
Trim spaces from the search filter
2024-08-27 22:18:46 +02:00
Alexander Bakker 7e1daf731f Trim spaces from the search filter 2024-08-27 22:05:25 +02:00
Michael SchättgenandGitHub 2add8aab14 Merge pull request #1464 from alexbakker/shapeableimageview
Replace CircleImageView with ShapeableImageView
2024-08-27 20:49:38 +02:00
Alexander Bakker 99e633d61a Replace CircleImageView with ShapeableImageView 2024-08-27 20:02:06 +02:00
Michael SchättgenandGitHub 7ce72e046a Merge pull request #1465 from alexbakker/vendor-jcenter-libs
Vendor TextDrawable and TrustedIntents
2024-08-26 23:55:33 +02:00
Alexander Bakker 991da65af0 Vendor TextDrawable and TrustedIntents
These were the only two libraries we were still getting from JCenter,
which was permanently shut down recently: https://jfrog.com/blog/jcenter-sunset/
2024-08-26 23:06:09 +02:00
Alexander BakkerandGitHub 9eae773efb Merge pull request #1458 from michaelschattgen/fix/hidden-dots-size
Fix sizing inconsistency of the dots in hidden view
2024-08-23 23:08:35 +02:00
Michael Schättgen 4ddc42ea51 Fix sizing inconsistency of the dots in hidden view 2024-08-22 01:05:35 +02:00
Alexander BakkerandGitHub a46c816167 Merge pull request #1447 from michaelschattgen/feature/hide-account-name-tiles
Add ability to hide account name in tiles mode
2024-08-12 22:30:44 +02:00
Michael Schättgen 71c0ad2a08 Add ability to hide account name in tiles mode 2024-08-12 21:53:55 +02:00
Michael SchättgenandGitHub bc5cb488f5 Merge pull request #1454 from alexbakker/pass-popup-check
Add an extra check before showing the password reminder popup
2024-08-11 18:07:22 +02:00
Alexander Bakker 010e2628e8 Add an extra check before showing the password reminder popup
This is another attempt to fix a rare crash we're seeing in the
developer console:

```
Exception android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
  at android.view.ViewRootImpl.setView (ViewRootImpl.java:1423)
  at android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:408)
  at android.view.WindowManagerImpl.addView (WindowManagerImpl.java:148)
  at android.widget.PopupWindow.invokePopup (PopupWindow.java:1583)
  at android.widget.PopupWindow.showAsDropDown (PopupWindow.java:1430)
  at android.widget.PopupWindow.showAsDropDown (PopupWindow.java:1386)
  at com.beemdevelopment.aegis.ui.AuthActivity.lambda$showPasswordReminder$5 (AuthActivity.java:253)
  at android.os.Handler.handleCallback (Handler.java:942)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loopOnce (Looper.java:211)
  at android.os.Looper.loop (Looper.java:300)
  at android.app.ActivityThread.main (ActivityThread.java:8294)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:580)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1028)
```
2024-08-10 13:13:03 +02:00
Alexander Bakker db4c738c8f Update dependencies 2024-08-09 19:49:08 +02:00
Michael SchättgenandGitHub e79c2c174b Merge pull request #1444 from alexbakker/scroll-export-dialog
Make the export dialog scrollable
2024-08-02 22:56:27 +02:00
Alexander Bakker 655881e852 Make the export dialog scrollable
Reported by @valentinb102 on Matrix.
2024-08-02 19:43:47 +02:00
Alexander BakkerandGitHub 29eccaf9cf Merge pull request #1429 from r3dh3ck/fix/preferences_result_location
Remove preferences result
2024-07-23 21:08:27 +02:00
r3dh3ckandAlexander Bakker f796e4542a Remove preferences result 2024-07-23 20:52:59 +02:00
Alexander Bakker a10693e79e Expand the number of cases covered under the slot exclusion tests 2024-07-23 20:30:36 +02:00
Alexander BakkerandGitHub b76e7a369c Merge pull request #1424 from r3dh3ck/fix/biometric_slot_stripping
Strip a biometric slot when a backup is made
2024-07-23 20:26:16 +02:00
Alexander Bakker 4ea19a2b7a Don't enforce backup versioning if versionsToKeep <= 0 2024-07-23 20:12:07 +02:00
Alexander BakkerandGitHub 6a67ca43e4 Merge pull request #1433 from r3dh3ck/feature/infinite_backups
Infinite backups
2024-07-23 20:11:41 +02:00
r3dh3ck fc8cdc6502 Implement infinite backups 2024-07-23 06:08:52 +00:00
Alexander BakkerandGitHub 27a723205e Merge pull request #1437 from michaelschattgen/fix/duplicate-dialog
Fix showing duplicate time sync dialogs
2024-07-22 20:59:55 +02:00
Michael Schättgen 7d76be577d Fix showing duplicate time sync dialogs 2024-07-22 20:08:48 +02:00
r3dh3ck 62f25d9ae9 Strip a biometric slot when a backup is made 2024-07-22 17:53:04 +00:00
Alexander BakkerandGitHub 9d374a2098 Merge pull request #1435 from michaelschattgen/fix/i18n-auditlog
Fix datetime parsing in Audit Log
2024-07-22 19:48:54 +02:00
Michael Schättgen e53688d30d Fix datetime parsing in Audit Log 2024-07-22 19:04:34 +02:00
Michael SchättgenandGitHub ec237ecb4e Merge pull request #1349 from InfiniteCoder06/feature-multi-group
Support for Adding Multiple Groups
2024-07-22 00:36:54 +02:00
Praveen Kumar 2e9efa0617 Support for Adding Multiple Groups 2024-07-21 19:35:36 +05:30
87 changed files with 3336 additions and 906 deletions
+5
View File
@@ -155,3 +155,8 @@ Swing by our Matrix room to interact with other contributors:
This project is licensed under the GNU General Public License v3.0. See the
[LICENSE](LICENSE) file for details.
A couple of libraries vendored in Aegis' repository are licensed under a
different license:
- [TextDrawable](app/src/main/java/com/amulyakhare/textdrawable)
- [TrustedIntents](app/src/main/java/info/guardianproject/trustedintents)
+41 -36
View File
@@ -28,13 +28,19 @@ android {
applicationId "${packageName}"
minSdkVersion 21
targetSdkVersion 34
versionCode 70
versionName "3.1.1"
versionCode 71
versionName "3.2"
multiDexEnabled true
buildConfigField "String", "GIT_HASH", "\"${getGitHash()}\""
buildConfigField "String", "GIT_BRANCH", "\"${getGitBranch()}\""
buildConfigField "java.util.concurrent.atomic.AtomicBoolean", "TEST", "new java.util.concurrent.atomic.AtomicBoolean(false)"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas"]
}
}
testInstrumentationRunner "com.beemdevelopment.aegis.AegisTestRunner"
testInstrumentationRunnerArguments clearPackageData: 'true'
}
@@ -104,6 +110,9 @@ android {
checkDependencies true
disable 'MissingQuantity', 'MissingTranslation'
}
buildFeatures {
buildConfig true
}
}
protobuf {
@@ -133,36 +142,34 @@ aboutLibraries {
}
dependencies {
def cameraxVersion = '1.3.1'
def cameraxVersion = '1.3.4'
def glideVersion = '4.16.0'
def guavaVersion = '33.0.0'
def hiltVersion = '2.50'
def guavaVersion = '33.2.1'
def hiltVersion = '2.52'
def junitVersion = '4.13.2'
def libsuVersion = '5.2.2'
def libsuVersion = '6.0.0'
def roomVersion = "2.6.1"
annotationProcessor 'androidx.annotation:annotation:1.7.1'
annotationProcessor 'androidx.annotation:annotation:1.8.2'
annotationProcessor "androidx.room:room-compiler:$roomVersion"
annotationProcessor "com.google.dagger:hilt-compiler:$hiltVersion"
annotationProcessor "com.github.bumptech.glide:compiler:${glideVersion}"
annotationProcessor "androidx.room:room-compiler:$roomVersion"
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.activity:activity:1.8.2'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.activity:activity:1.9.1'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation "androidx.biometric:biometric:1.1.0"
implementation "androidx.camera:camera-camera2:$cameraxVersion"
implementation "androidx.camera:camera-lifecycle:$cameraxVersion"
implementation "androidx.camera:camera-view:$cameraxVersion"
implementation "androidx.core:core:1.12.0"
implementation 'androidx.core:core:1.13.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation "androidx.lifecycle:lifecycle-process:2.6.2"
implementation 'androidx.lifecycle:lifecycle-process:2.8.4'
implementation "androidx.preference:preference:1.2.1"
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation "androidx.room:room-runtime:$roomVersion"
implementation "androidx.viewpager2:viewpager2:1.0.0"
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
implementation 'androidx.viewpager2:viewpager2:1.1.0'
implementation 'com.caverock:androidsvg-aar:1.4'
implementation "com.google.dagger:hilt-android:$hiltVersion"
implementation 'com.github.avito-tech:krop:0.52'
@@ -174,37 +181,35 @@ dependencies {
implementation "com.github.topjohnwu.libsu:core:${libsuVersion}"
implementation "com.github.topjohnwu.libsu:io:${libsuVersion}"
implementation "com.google.guava:guava:${guavaVersion}-android"
implementation 'com.google.android.material:material:1.11.0'
implementation 'com.google.protobuf:protobuf-javalite:3.25.1'
implementation 'com.google.zxing:core:3.5.2'
implementation("com.mikepenz:aboutlibraries:11.1.0") {
implementation 'com.google.android.material:material:1.12.0'
implementation 'com.google.protobuf:protobuf-javalite:4.27.3'
implementation 'com.google.zxing:core:3.5.3'
implementation('com.mikepenz:aboutlibraries:11.2.2') {
exclude group: 'com.mikepenz', module: 'aboutlibraries-core'
}
implementation "com.mikepenz:aboutlibraries-core-android:11.1.0"
implementation 'com.nulab-inc:zxcvbn:1.8.2'
implementation 'de.hdodenhof:circleimageview:3.1.0'
implementation 'com.mikepenz:aboutlibraries-core-android:11.2.2'
implementation 'com.nulab-inc:zxcvbn:1.9.0'
implementation 'net.lingala.zip4j:zip4j:2.11.5'
implementation 'info.guardianproject.trustedintents:trustedintents:0.2'
implementation 'org.bouncycastle:bcprov-jdk18on:1.77'
implementation "org.simpleflatmapper:sfm-csv:8.2.3"
implementation 'org.bouncycastle:bcprov-jdk18on:1.78.1'
implementation 'org.simpleflatmapper:sfm-csv:8.2.3'
androidTestAnnotationProcessor "com.google.dagger:hilt-android-compiler:$hiltVersion"
androidTestImplementation "com.google.dagger:hilt-android-testing:$hiltVersion"
androidTestImplementation 'androidx.test:core:1.5.0'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test:rules:1.5.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.5.1'
androidTestImplementation 'androidx.test:core:1.6.1'
androidTestImplementation 'androidx.test:runner:1.6.1'
androidTestImplementation 'androidx.test:rules:1.6.1'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.6.1'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
androidTestImplementation "junit:junit:${junitVersion}"
androidTestUtil 'androidx.test:orchestrator:1.4.2'
androidTestUtil 'androidx.test:orchestrator:1.5.0'
testImplementation 'androidx.test:core:1.5.0'
testImplementation 'androidx.test:core:1.6.1'
testImplementation "com.google.guava:guava:${guavaVersion}-jre"
testImplementation "junit:junit:${junitVersion}"
testImplementation 'org.json:json:20231013'
testImplementation 'org.robolectric:robolectric:4.11.1'
testImplementation 'org.json:json:20240303'
testImplementation 'org.robolectric:robolectric:4.13'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}
+9
View File
@@ -1,5 +1,14 @@
{
"uniqueId": "com.amulyakhare:com.amulyakhare.textdrawable",
"funding": [
],
"developers": [
],
"artifactVersion": "1.0.1",
"description": "This light-weight library provides images with letter/text like the Gmail app. It extends the Drawable class thus can be used with existing/custom/network ImageView classes. Also included is a fluent interface for creating drawables and a customizable ColorGenerator.",
"name": "textdrawable",
"licenses": [
"MIT"
]
+23
View File
@@ -0,0 +1,23 @@
{
"uniqueId": "info.guardianproject.trustedintents:trustedintents",
"funding": [
],
"developers": [
{
"name": "Guardian Project"
}
],
"artifactVersion": "0.2",
"description": "TrustedIntents is a library for flexible trusted interactions between Android apps. It is modeled after Android's `signature` protection level for permissions. The key difference is that the framework allows the trusted signature to be set, rather than requiring to match the current app's signature.",
"scm": {
"connection": "scm:https://github.com/guardianproject/TrustedIntents.git",
"url": "scm:https://github.com/guardianproject/TrustedIntents",
"developerConnection": "scm:git@github.com:guardianproject/TrustedIntents.git"
},
"name": "TrustedIntents",
"website": "https://guardianproject.info/code/trustedintents",
"licenses": [
"3ca920d1875f7ad7ab04a2a331958577"
]
}
@@ -0,0 +1,5 @@
{
"hash": "3ca920d1875f7ad7ab04a2a331958577",
"url": "https://github.com/guardianproject/TrustedIntents/blob/master/LICENSE.txt",
"name": "LGPLv2.1"
}
@@ -0,0 +1,52 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "392278bdb797d013cb2ada67a3b1cc60",
"entities": [
{
"tableName": "audit_logs",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `event_type` TEXT NOT NULL, `reference` TEXT, `timestamp` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "_eventType",
"columnName": "event_type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "_reference",
"columnName": "reference",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "_timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '392278bdb797d013cb2ada67a3b1cc60')"
]
}
}
@@ -7,6 +7,7 @@ import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard;
import static androidx.test.espresso.action.ViewActions.longClick;
import static androidx.test.espresso.action.ViewActions.pressBack;
import static androidx.test.espresso.action.ViewActions.scrollTo;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA;
@@ -118,10 +119,11 @@ public class OverallTest extends AegisTest {
onView(withId(R.id.rvKeyProfiles)).perform(RecyclerViewActions.actionOnItemAtPosition(entryPosOffset + 1, longClick()));
onView(withId(R.id.action_edit)).perform(click());
onView(withId(R.id.text_name)).perform(clearText(), typeText("Bob"), closeSoftKeyboard());
onView(withId(R.id.dropdown_group)).perform(click());
onView(withText(R.string.new_group)).inRoot(RootMatchers.isPlatformPopup()).perform(click());
onView(withId(R.id.text_group)).perform(click());
onView(withId(R.id.addGroup)).inRoot(RootMatchers.isDialog()).perform(click());
onView(withId(R.id.text_input)).perform(typeText(_groupName), closeSoftKeyboard());
onView(withId(android.R.id.button1)).perform(click());
onView(withText(R.string.save)).perform(click());
onView(isRoot()).perform(pressBack());
onView(withId(android.R.id.button1)).perform(click());
@@ -188,7 +190,7 @@ public class OverallTest extends AegisTest {
onView(withId(R.id.fab)).perform(click());
onView(withId(R.id.fab_enter)).perform(click());
onView(withId(R.id.accordian_header)).perform(click());
onView(withId(R.id.accordian_header)).perform(scrollTo(), click());
onView(withId(R.id.text_name)).perform(typeText(entry.getName()), closeSoftKeyboard());
onView(withId(R.id.text_issuer)).perform(typeText(entry.getIssuer()), closeSoftKeyboard());
@@ -208,7 +210,7 @@ public class OverallTest extends AegisTest {
throw new RuntimeException(String.format("Unexpected entry type: %s", entry.getInfo().getClass().getSimpleName()));
}
onView(withId(R.id.dropdown_type)).perform(click());
onView(withId(R.id.dropdown_type)).perform(scrollTo(), click());
onView(withText(otpType)).inRoot(RootMatchers.isPlatformPopup()).perform(click());
}
+15
View File
@@ -31,6 +31,21 @@
</head>
<body>
<div></div>
<h3>Version 3.2</h3>
<h4>New</h4>
<ul>
<li>The ability to add a single entry to multiple groups</li>
<li>Option to keep an infinite number of backups</li>
<li>Option to customize which fields to search for in entries</li>
<li>Allow hiding entry names in the tiled view mode</li>
</ul>
<h4>Fixes</h4>
<ul>
<li>With "Tap to reveal" enabled, the size of the shown dots would not be consistent with the size of the code digits, on some devices</li>
<li>After importing a backup, the UI would in some cases incorrectly claim that biometric unlock is enabled</li>
<li>The export dialog was not fully visible on some devices</li>
<li>Various other minor UI, stability and performance improvements</li>
</ul>
<h3>Version 3.1.1</h3>
<h4>Fixes</h4>
<p>
@@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2014 Amulya Khare
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,316 @@
package com.amulyakhare.textdrawable;
import android.graphics.*;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.graphics.drawable.shapes.RectShape;
import android.graphics.drawable.shapes.RoundRectShape;
/**
* @author amulya
* @datetime 14 Oct 2014, 3:53 PM
*/
public class TextDrawable extends ShapeDrawable {
private final Paint textPaint;
private final Paint borderPaint;
private static final float SHADE_FACTOR = 0.9f;
private final String text;
private final int color;
private final RectShape shape;
private final int height;
private final int width;
private final int fontSize;
private final float radius;
private final int borderThickness;
private TextDrawable(Builder builder) {
super(builder.shape);
// shape properties
shape = builder.shape;
height = builder.height;
width = builder.width;
radius = builder.radius;
// text and color
text = builder.toUpperCase ? builder.text.toUpperCase() : builder.text;
color = builder.color;
// text paint settings
fontSize = builder.fontSize;
textPaint = new Paint();
textPaint.setColor(builder.textColor);
textPaint.setAntiAlias(true);
textPaint.setFakeBoldText(builder.isBold);
textPaint.setStyle(Paint.Style.FILL);
textPaint.setTypeface(builder.font);
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setStrokeWidth(builder.borderThickness);
// border paint settings
borderThickness = builder.borderThickness;
borderPaint = new Paint();
borderPaint.setColor(getDarkerShade(color));
borderPaint.setStyle(Paint.Style.STROKE);
borderPaint.setStrokeWidth(borderThickness);
// drawable paint color
Paint paint = getPaint();
paint.setColor(color);
}
private int getDarkerShade(int color) {
return Color.rgb((int)(SHADE_FACTOR * Color.red(color)),
(int)(SHADE_FACTOR * Color.green(color)),
(int)(SHADE_FACTOR * Color.blue(color)));
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
Rect r = getBounds();
// draw border
if (borderThickness > 0) {
drawBorder(canvas);
}
int count = canvas.save();
canvas.translate(r.left, r.top);
// draw text
int width = this.width < 0 ? r.width() : this.width;
int height = this.height < 0 ? r.height() : this.height;
int fontSize = this.fontSize < 0 ? (Math.min(width, height) / 2) : this.fontSize;
textPaint.setTextSize(fontSize);
canvas.drawText(text, width / 2, height / 2 - ((textPaint.descent() + textPaint.ascent()) / 2), textPaint);
canvas.restoreToCount(count);
}
private void drawBorder(Canvas canvas) {
RectF rect = new RectF(getBounds());
rect.inset(borderThickness/2, borderThickness/2);
if (shape instanceof OvalShape) {
canvas.drawOval(rect, borderPaint);
}
else if (shape instanceof RoundRectShape) {
canvas.drawRoundRect(rect, radius, radius, borderPaint);
}
else {
canvas.drawRect(rect, borderPaint);
}
}
@Override
public void setAlpha(int alpha) {
textPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
textPaint.setColorFilter(cf);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public int getIntrinsicWidth() {
return width;
}
@Override
public int getIntrinsicHeight() {
return height;
}
public static IShapeBuilder builder() {
return new Builder();
}
public static class Builder implements IConfigBuilder, IShapeBuilder, IBuilder {
private String text;
private int color;
private int borderThickness;
private int width;
private int height;
private Typeface font;
private RectShape shape;
public int textColor;
private int fontSize;
private boolean isBold;
private boolean toUpperCase;
public float radius;
private Builder() {
text = "";
color = Color.GRAY;
textColor = Color.WHITE;
borderThickness = 0;
width = -1;
height = -1;
shape = new RectShape();
font = Typeface.create("sans-serif-light", Typeface.NORMAL);
fontSize = -1;
isBold = false;
toUpperCase = false;
}
public IConfigBuilder width(int width) {
this.width = width;
return this;
}
public IConfigBuilder height(int height) {
this.height = height;
return this;
}
public IConfigBuilder textColor(int color) {
this.textColor = color;
return this;
}
public IConfigBuilder withBorder(int thickness) {
this.borderThickness = thickness;
return this;
}
public IConfigBuilder useFont(Typeface font) {
this.font = font;
return this;
}
public IConfigBuilder fontSize(int size) {
this.fontSize = size;
return this;
}
public IConfigBuilder bold() {
this.isBold = true;
return this;
}
public IConfigBuilder toUpperCase() {
this.toUpperCase = true;
return this;
}
@Override
public IConfigBuilder beginConfig() {
return this;
}
@Override
public IShapeBuilder endConfig() {
return this;
}
@Override
public IBuilder rect() {
this.shape = new RectShape();
return this;
}
@Override
public IBuilder round() {
this.shape = new OvalShape();
return this;
}
@Override
public IBuilder roundRect(int radius) {
this.radius = radius;
float[] radii = {radius, radius, radius, radius, radius, radius, radius, radius};
this.shape = new RoundRectShape(radii, null, null);
return this;
}
@Override
public TextDrawable buildRect(String text, int color) {
rect();
return build(text, color);
}
@Override
public TextDrawable buildRoundRect(String text, int color, int radius) {
roundRect(radius);
return build(text, color);
}
@Override
public TextDrawable buildRound(String text, int color) {
round();
return build(text, color);
}
@Override
public TextDrawable build(String text, int color) {
this.color = color;
this.text = text;
return new TextDrawable(this);
}
}
public interface IConfigBuilder {
public IConfigBuilder width(int width);
public IConfigBuilder height(int height);
public IConfigBuilder textColor(int color);
public IConfigBuilder withBorder(int thickness);
public IConfigBuilder useFont(Typeface font);
public IConfigBuilder fontSize(int size);
public IConfigBuilder bold();
public IConfigBuilder toUpperCase();
public IShapeBuilder endConfig();
}
public static interface IBuilder {
public TextDrawable build(String text, int color);
}
public static interface IShapeBuilder {
public IConfigBuilder beginConfig();
public IBuilder rect();
public IBuilder round();
public IBuilder roundRect(int radius);
public TextDrawable buildRect(String text, int color);
public TextDrawable buildRoundRect(String text, int color, int radius);
public TextDrawable buildRound(String text, int color);
}
}
@@ -0,0 +1,69 @@
package com.amulyakhare.textdrawable.util;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
/**
* @author amulya
* @datetime 14 Oct 2014, 5:20 PM
*/
public class ColorGenerator {
public static ColorGenerator DEFAULT;
public static ColorGenerator MATERIAL;
static {
DEFAULT = create(Arrays.asList(
0xfff16364,
0xfff58559,
0xfff9a43e,
0xffe4c62e,
0xff67bf74,
0xff59a2be,
0xff2093cd,
0xffad62a7,
0xff805781
));
MATERIAL = create(Arrays.asList(
0xffe57373,
0xfff06292,
0xffba68c8,
0xff9575cd,
0xff7986cb,
0xff64b5f6,
0xff4fc3f7,
0xff4dd0e1,
0xff4db6ac,
0xff81c784,
0xffaed581,
0xffff8a65,
0xffd4e157,
0xffffd54f,
0xffffb74d,
0xffa1887f,
0xff90a4ae
));
}
private final List<Integer> mColors;
private final Random mRandom;
public static ColorGenerator create(List<Integer> colorList) {
return new ColorGenerator(colorList);
}
private ColorGenerator(List<Integer> colorList) {
mColors = colorList;
mRandom = new Random(System.currentTimeMillis());
}
public int getRandomColor() {
return mColors.get(mRandom.nextInt(mColors.size()));
}
public int getColor(Object key) {
return mColors.get(Math.abs(key.hashCode()) % mColors.size());
}
}
@@ -34,12 +34,26 @@ public class Preferences {
public static final int AUTO_LOCK_ON_MINIMIZE = 1 << 2;
public static final int AUTO_LOCK_ON_DEVICE_LOCK = 1 << 3;
public static final int SEARCH_IN_ISSUER = 1 << 0;
public static final int SEARCH_IN_NAME = 1 << 1;
public static final int SEARCH_IN_NOTE = 1 << 2;
public static final int SEARCH_IN_GROUPS = 1 << 3;
public static final int BACKUPS_VERSIONS_INFINITE = -1;
public static final int[] AUTO_LOCK_SETTINGS = {
AUTO_LOCK_ON_BACK_BUTTON,
AUTO_LOCK_ON_MINIMIZE,
AUTO_LOCK_ON_DEVICE_LOCK
};
public static final int[] SEARCH_BEHAVIOR_SETTINGS = {
SEARCH_IN_ISSUER,
SEARCH_IN_NAME,
SEARCH_IN_NOTE,
SEARCH_IN_GROUPS
};
private SharedPreferences _prefs;
public Preferences(Context context) {
@@ -162,6 +176,20 @@ public class Preferences {
return _prefs.getInt("pref_auto_lock_mask", def);
}
public int getSearchBehaviorMask() {
final int def = SEARCH_IN_ISSUER | SEARCH_IN_NAME;
return _prefs.getInt("pref_search_behavior_mask", def);
}
public boolean isSearchBehaviorTypeEnabled(int searchBehaviorType) {
return (getSearchBehaviorMask() & searchBehaviorType) == searchBehaviorType;
}
public void setSearchBehaviorMask(int searchBehavior) {
_prefs.edit().putInt("pref_search_behavior_mask", searchBehavior).apply();
}
public boolean isAutoLockEnabled() {
return getAutoLockMask() != AUTO_LOCK_OFF;
}
@@ -0,0 +1,30 @@
package com.beemdevelopment.aegis.helpers;
import android.graphics.Rect;
import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;
import androidx.annotation.NonNull;
public class CenterVerticalSpan extends MetricAffectingSpan {
Rect _substringBounds;
public CenterVerticalSpan(Rect substringBounds) {
_substringBounds = substringBounds;
}
@Override
public void updateMeasureState(@NonNull TextPaint textPaint) {
applyBaselineShift(textPaint);
}
@Override
public void updateDrawState(@NonNull TextPaint textPaint) {
applyBaselineShift(textPaint);
}
private void applyBaselineShift(TextPaint textPaint) {
float topDifference = textPaint.getFontMetrics().top - _substringBounds.top;
textPaint.baselineShift -= (topDifference / 2f);
}
}
@@ -241,7 +241,7 @@ public class AuthActivity extends AegisActivity {
popup.setFocusable(false);
popup.setOutsideTouchable(true);
_textPassword.post(() -> {
if (isFinishing()) {
if (isFinishing() || !_textPassword.isAttachedToWindow()) {
return;
}
@@ -1,6 +1,5 @@
package com.beemdevelopment.aegis.ui;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
@@ -16,6 +15,7 @@ import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
@@ -68,7 +68,10 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
@@ -85,14 +88,11 @@ import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import de.hdodenhof.circleimageview.CircleImageView;
public class EditEntryActivity extends AegisActivity {
private boolean _isNew = false;
private boolean _isManual = false;
@@ -102,11 +102,13 @@ public class EditEntryActivity extends AegisActivity {
// keep track of icon changes separately as the generated jpeg's are not deterministic
private boolean _hasChangedIcon = false;
private IconPack.Icon _selectedIcon;
private CircleImageView _iconView;
private ShapeableImageView _iconView;
private ImageView _saveImageButton;
private TextInputEditText _textName;
private TextInputEditText _textIssuer;
private TextInputLayout _textGroupLayout;
private TextInputEditText _textGroup;
private TextInputEditText _textPeriodCounter;
private TextInputLayout _textPeriodCounterLayout;
private TextInputEditText _textDigits;
@@ -121,8 +123,7 @@ public class EditEntryActivity extends AegisActivity {
private AutoCompleteTextView _dropdownType;
private AutoCompleteTextView _dropdownAlgo;
private TextInputLayout _dropdownAlgoLayout;
private AutoCompleteTextView _dropdownGroup;
private List<VaultGroupModel> _dropdownGroupList = new ArrayList<>();
private List<UUID> _selectedGroups = new ArrayList<>();
private KropView _kropView;
@@ -195,6 +196,8 @@ public class EditEntryActivity extends AegisActivity {
_saveImageButton = findViewById(R.id.iv_saveImage);
_textName = findViewById(R.id.text_name);
_textIssuer = findViewById(R.id.text_issuer);
_textGroup = findViewById(R.id.text_group);
_textGroupLayout = findViewById(R.id.text_group_layout);
_textPeriodCounter = findViewById(R.id.text_period_counter);
_textPeriodCounterLayout = findViewById(R.id.text_period_counter_layout);
_textDigits = findViewById(R.id.text_digits);
@@ -210,9 +213,6 @@ public class EditEntryActivity extends AegisActivity {
_dropdownAlgoLayout = findViewById(R.id.dropdown_algo_layout);
_dropdownAlgo = findViewById(R.id.dropdown_algo);
DropdownHelper.fillDropdown(this, _dropdownAlgo, R.array.otp_algo_array);
_dropdownGroup = findViewById(R.id.dropdown_group);
updateGroupDropdownList();
DropdownHelper.fillDropdown(this, _dropdownGroup, _dropdownGroupList);
// if this is NOT a manually entered entry, move the "Secret" field from basic to advanced settings
if (!_isNew || !_isManual) {
@@ -286,10 +286,15 @@ public class EditEntryActivity extends AegisActivity {
Set<UUID> groups = _origEntry.getGroups();
if (groups.isEmpty()) {
setGroup(new VaultGroupModel(getString(R.string.no_group)));
_textGroup.setText(getString(R.string.no_group));
} else {
VaultGroup group = _vaultManager.getVault().getGroupByUUID(groups.iterator().next());
setGroup(new VaultGroupModel(group));
String text = groups.stream().map(uuid -> {
VaultGroup group = _vaultManager.getVault().getGroupByUUID(uuid);
return group.getName();
})
.collect(Collectors.joining(", "));
_selectedGroups.addAll(groups);
_textGroup.setText(text);
}
// Update the icon if the issuer or name has changed
@@ -298,11 +303,11 @@ public class EditEntryActivity extends AegisActivity {
// Register listeners to trigger validation
_textIssuer.addTextChangedListener(_validationListener);
_textGroup.addTextChangedListener(_validationListener);
_textName.addTextChangedListener(_validationListener);
_textNote.addTextChangedListener(_validationListener);
_textSecret.addTextChangedListener(_validationListener);
_dropdownType.addTextChangedListener(_validationListener);
_dropdownGroup.addTextChangedListener(_validationListener);
_dropdownAlgo.addTextChangedListener(_validationListener);
_textPeriodCounter.addTextChangedListener(_validationListener);
_textDigits.addTextChangedListener(_validationListener);
@@ -354,38 +359,109 @@ public class EditEntryActivity extends AegisActivity {
startIconSelection();
});
_dropdownGroup.setOnItemClickListener((parent, view, position, id) -> {
VaultGroupModel selectedGroup = _dropdownGroupList.get(position);
if (selectedGroup.isPlaceholder() && Objects.equals(selectedGroup.getName(), getString(R.string.new_group))) {
Dialogs.TextInputListener onAddGroup = text -> {
String groupName = new String(text).trim();
if (!groupName.isEmpty()) {
VaultGroup group = _vaultManager.getVault().findGroupByName(groupName);
if (group == null) {
group = new VaultGroup(groupName);
_vaultManager.getVault().addGroup(group);
}
updateGroupDropdownList();
setGroup(new VaultGroupModel(group));
}
};
DialogInterface.OnCancelListener onCancel = dialogInterface -> {
VaultGroupModel previous = (VaultGroupModel) _dropdownGroup.getTag();
_dropdownGroup.setText(previous.getName(), false);
};
Dialogs.showTextInputDialog(EditEntryActivity.this, R.string.set_group, R.string.group_name_hint, onAddGroup, onCancel);
} else {
setGroup(_dropdownGroupList.get(position));
_textGroup.setShowSoftInputOnFocus(false);
_textGroup.setOnClickListener(v -> showGroupSelectionDialog());
_textGroup.setOnFocusChangeListener((v, hasFocus) -> {
if (hasFocus) {
showGroupSelectionDialog();
}
});
_textGroupLayout.setOnClickListener(v -> {
showGroupSelectionDialog();
});
_textUsageCount.setText(_prefs.getUsageCount(entryUUID).toString());
setLastUsedTimestamp(_prefs.getLastUsedTimestamp(entryUUID));
}
private void showGroupSelectionDialog() {
BottomSheetDialog dialog = new BottomSheetDialog(this);
View view = getLayoutInflater().inflate(R.layout.dialog_select_groups, null);
dialog.setContentView(view);
ChipGroup chipGroup = view.findViewById(R.id.groupChipGroup);
TextView addGroupInfo = view.findViewById(R.id.addGroupInfo);
LinearLayout addGroup = view.findViewById(R.id.addGroup);
Button clearButton = view.findViewById(R.id.btnClear);
Button saveButton = view.findViewById(R.id.btnSave);
chipGroup.removeAllViews();
addGroupInfo.setVisibility(View.VISIBLE);
addGroup.setVisibility(View.VISIBLE);
for (VaultGroup group : _groups) {
addChipTo(chipGroup, new VaultGroupModel(group), false);
}
addGroup.setOnClickListener(v1 -> {
Dialogs.TextInputListener onAddGroup = text -> {
String groupName = new String(text).trim();
if (!groupName.isEmpty()) {
VaultGroup group = _vaultManager.getVault().findGroupByName(groupName);
if (group == null) {
group = new VaultGroup(groupName);
_vaultManager.getVault().addGroup(group);
}
_selectedGroups.add(group.getUUID());
addChipTo(chipGroup, new VaultGroupModel(group), true);
}
};
Dialogs.showTextInputDialog(EditEntryActivity.this, R.string.set_group, R.string.group_name_hint, onAddGroup);
});
saveButton.setOnClickListener(v1 -> {
if(getCheckedUUID(chipGroup).isEmpty()) {
_selectedGroups.clear();
_textGroup.setText(getString(R.string.no_group));
} else {
_selectedGroups.clear();
_selectedGroups.addAll(getCheckedUUID(chipGroup));
_textGroup.setText(getCheckedNames(chipGroup));
}
dialog.dismiss();
});
clearButton.setOnClickListener(v1 -> {
chipGroup.clearCheck();
});
Dialogs.showSecureDialog(dialog);
}
private void addChipTo(ChipGroup chipGroup, VaultGroupModel group, Boolean isNew) {
Chip chip = (Chip) getLayoutInflater().inflate(R.layout.chip_group_filter, null, false);
chip.setText(group.getName());
chip.setCheckable(true);
chip.setChecked((!_selectedGroups.isEmpty() && _selectedGroups.contains(group.getUUID())) || isNew);
chip.setCheckedIconVisible(true);
chip.setTag(group);
chipGroup.addView(chip);
}
private static Set<UUID> getCheckedUUID(ChipGroup chipGroup) {
return chipGroup.getCheckedChipIds().stream()
.map(i -> {
Chip chip = chipGroup.findViewById(i);
VaultGroupModel group = (VaultGroupModel) chip.getTag();
return group.getUUID();
})
.collect(Collectors.toSet());
}
private static String getCheckedNames(ChipGroup chipGroup) {
return chipGroup.getCheckedChipIds().stream()
.map(i -> {
Chip chip = chipGroup.findViewById(i);
VaultGroupModel group = (VaultGroupModel) chip.getTag();
return group.getName();
})
.collect(Collectors.joining(", "));
}
private void updateAdvancedFieldStatus(String otpType) {
boolean enabled = !otpType.equals(SteamInfo.ID) && !otpType.equals(YandexInfo.ID)
&& !otpType.equals(MotpInfo.ID) && (!_isNew || _isManual);
@@ -400,11 +476,6 @@ public class EditEntryActivity extends AegisActivity {
_textPin.setHint(otpType.equals(MotpInfo.ID) ? R.string.motp_pin : R.string.yandex_pin);
}
private void setGroup(VaultGroupModel group) {
_dropdownGroup.setText(group.getName(), false);
_dropdownGroup.setTag(group);
}
private void openAdvancedSettings() {
Animation fadeOut = new AlphaAnimation(1, 0);
fadeOut.setInterpolator(new AccelerateInterpolator());
@@ -421,13 +492,6 @@ public class EditEntryActivity extends AegisActivity {
}));
}
private void updateGroupDropdownList() {
_dropdownGroupList.clear();
_dropdownGroupList.add(new VaultGroupModel(getString(R.string.new_group)));
_dropdownGroupList.addAll(_groups.stream().map(VaultGroupModel::new).collect(Collectors.toList()));
_dropdownGroupList.add(new VaultGroupModel(getString(R.string.no_group)));
}
private boolean hasUnsavedChanges(VaultEntry newEntry) {
return _hasChangedIcon || !_origEntry.equals(newEntry);
}
@@ -727,13 +791,10 @@ public class EditEntryActivity extends AegisActivity {
entry.setName(_textName.getText().toString());
entry.setNote(_textNote.getText().toString());
VaultGroupModel group = (VaultGroupModel) _dropdownGroup.getTag();
if (group.isPlaceholder()) {
if (_selectedGroups.isEmpty()) {
entry.setGroups(new HashSet<>());
} else {
Set<UUID> groups = new HashSet<>();
groups.add(group.getUUID());
entry.setGroups(groups);
entry.setGroups(new HashSet<>(_selectedGroups));
}
if (_hasChangedIcon) {
@@ -38,12 +38,9 @@ import androidx.appcompat.widget.SearchView;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.beemdevelopment.aegis.AccountNamePosition;
import com.beemdevelopment.aegis.CopyBehavior;
import com.beemdevelopment.aegis.Preferences;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.SortCategory;
import com.beemdevelopment.aegis.ViewMode;
import com.beemdevelopment.aegis.helpers.FabScrollHelper;
import com.beemdevelopment.aegis.helpers.PermissionHelper;
import com.beemdevelopment.aegis.otp.GoogleAuthInfo;
@@ -136,12 +133,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
});
private final ActivityResultLauncher<Intent> preferenceResultLauncher =
registerForActivityResult(new StartActivityForResult(), activityResult -> {
if (activityResult.getResultCode() != RESULT_OK || activityResult.getData() == null) {
return;
}
onPreferencesResult(activityResult.getData());
});
registerForActivityResult(new StartActivityForResult(), activityResult -> onPreferencesResult());
private final ActivityResultLauncher<Intent> editEntryResultLauncher =
registerForActivityResult(new StartActivityForResult(), activityResult -> {
@@ -203,6 +195,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
_entryListView.setSortCategory(_prefs.getCurrentSortCategory(), false);
_entryListView.setViewMode(_prefs.getCurrentViewMode());
_entryListView.setCopyBehavior(_prefs.getCopyBehavior());
_entryListView.setSearchBehaviorMask(_prefs.getSearchBehaviorMask());
_entryListView.setPrefGroupFilter(_prefs.getGroupFilter());
FloatingActionButton fab = findViewById(R.id.fab);
@@ -299,34 +292,10 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
}
}
private void onPreferencesResult(Intent data) {
private void onPreferencesResult() {
// refresh the entire entry list if needed
if (_loaded) {
if (data.getBooleanExtra("needsRecreate", false)) {
recreate();
} else if (data.getBooleanExtra("needsRefresh", false)) {
AccountNamePosition accountNamePosition = _prefs.getAccountNamePosition();
boolean showIcons = _prefs.isIconVisible();
boolean onlyShowNecessaryAccountNames = _prefs.onlyShowNecessaryAccountNames();
Preferences.CodeGrouping codeGroupSize = _prefs.getCodeGroupSize();
boolean highlightEntry = _prefs.isEntryHighlightEnabled();
boolean pauseFocused = _prefs.isPauseFocusedEnabled();
boolean tapToReveal = _prefs.isTapToRevealEnabled();
int tapToRevealTime = _prefs.getTapToRevealTime();
ViewMode viewMode = _prefs.getCurrentViewMode();
CopyBehavior copyBehavior = _prefs.getCopyBehavior();
_entryListView.setAccountNamePosition(accountNamePosition);
_entryListView.setOnlyShowNecessaryAccountNames(onlyShowNecessaryAccountNames);
_entryListView.setShowIcon(showIcons);
_entryListView.setCodeGroupSize(codeGroupSize);
_entryListView.setHighlightEntry(highlightEntry);
_entryListView.setPauseFocused(pauseFocused);
_entryListView.setTapToReveal(tapToReveal);
_entryListView.setTapToRevealTime(tapToRevealTime);
_entryListView.setViewMode(viewMode);
_entryListView.setCopyBehavior(copyBehavior);
_entryListView.refresh(true);
}
recreate();
}
}
@@ -520,7 +489,6 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
private void onIntroResult() {
loadEntries();
checkTimeSyncSetting();
}
private void checkTimeSyncSetting() {
@@ -537,7 +505,6 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
_auditLogRepository.addVaultUnlockedEvent();
loadEntries();
checkTimeSyncSetting();
}
private void startScanActivity() {
@@ -873,7 +840,9 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
_entryListView.setUsageCounts(_prefs.getUsageCounts());
_entryListView.setLastUsedTimestamps(_prefs.getLastUsedTimestamps());
_entryListView.addEntries(_vaultManager.getVault().getEntries());
_entryListView.runEntriesAnimation();
if (!_isRecreated) {
_entryListView.runEntriesAnimation();
}
_loaded = true;
}
}
@@ -57,24 +57,8 @@ public class PreferencesActivity extends AegisActivity implements
}
}
@Override
protected void onRestoreInstanceState(@NonNull final Bundle inState) {
if (_fragment instanceof PreferencesFragment) {
// pass the stored result intent back to the fragment
if (inState.containsKey("result")) {
((PreferencesFragment) _fragment).setResult(inState.getParcelable("result"));
}
}
super.onRestoreInstanceState(inState);
}
@Override
protected void onSaveInstanceState(@NonNull final Bundle outState) {
if (_fragment instanceof PreferencesFragment) {
// save the result intent of the fragment
// this is done so we don't lose anything if the fragment calls recreate on this activity
outState.putParcelable("result", ((PreferencesFragment) _fragment).getResult());
}
outState.putCharSequence("prefTitle", _prefTitle);
super.onSaveInstanceState(outState);
}
@@ -244,8 +244,8 @@ public class Dialogs {
showTextInputDialog(context, titleId, 0, hintId, listener, null, isSecret, null);
}
public static void showTextInputDialog(Context context, @StringRes int titleId, @StringRes int hintId, TextInputListener listener, @Nullable DialogInterface.OnCancelListener onCancel) {
showTextInputDialog(context, titleId, 0, hintId, listener, onCancel, false, null);
public static void showTextInputDialog(Context context, @StringRes int titleId, @StringRes int hintId, TextInputListener listener) {
showTextInputDialog(context, titleId, 0, hintId, listener, null, false, null);
}
public static void showPasswordInputDialog(Context context, TextInputListener listener) {
@@ -318,25 +318,32 @@ public class Dialogs {
}
public static void showBackupVersionsPickerDialog(Context context, int currentVersionCount, NumberInputListener listener) {
final int max = 30;
String[] numbers = new String[max / 5];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = Integer.toString(i * 5 + 5);
String infinite = context.getString(R.string.pref_backups_versions_infinite);
String[] values = {"5", "10", "15", "20", "25", "30", infinite};
int[] numbers = {5, 10, 15, 20, 25, 30, Preferences.BACKUPS_VERSIONS_INFINITE};
int selectedIndex;
if (currentVersionCount == Preferences.BACKUPS_VERSIONS_INFINITE) {
selectedIndex = numbers.length - 1;
} else {
selectedIndex = currentVersionCount / 5 - 1;
}
View view = LayoutInflater.from(context).inflate(R.layout.dialog_number_picker, null);
NumberPicker numberPicker = view.findViewById(R.id.numberPicker);
numberPicker.setDisplayedValues(numbers);
numberPicker.setMaxValue(numbers.length - 1);
numberPicker.setDisplayedValues(values);
numberPicker.setMaxValue(values.length - 1);
numberPicker.setMinValue(0);
numberPicker.setValue(currentVersionCount / 5 - 1);
numberPicker.setValue(selectedIndex);
numberPicker.setWrapSelectorWheel(false);
AlertDialog dialog = new MaterialAlertDialogBuilder(context)
.setTitle(R.string.set_number)
.setView(view)
.setPositiveButton(android.R.string.ok, (dialog1, which) ->
listener.onNumberInputResult(numberPicker.getValue()))
.setPositiveButton(android.R.string.ok, (dialog1, which) -> {
int index = numberPicker.getValue();
int number = numbers[index];
listener.onNumberInputResult(number);
})
.create();
showSecureDialog(dialog);
@@ -27,7 +27,6 @@ public class AppearancePreferencesFragment extends PreferencesFragment {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
addPreferencesFromResource(R.xml.preferences_appearance);
_groupsPreference = requirePreference("pref_groups");
@@ -62,7 +61,6 @@ public class AppearancePreferencesFragment extends PreferencesFragment {
dialog.dismiss();
getResult().putExtra("needsRecreate", true);
requireActivity().recreate();
})
.setNegativeButton(android.R.string.cancel, null)
@@ -74,7 +72,6 @@ public class AppearancePreferencesFragment extends PreferencesFragment {
Preference dynamicColorsPreference = requirePreference("pref_dynamic_colors");
dynamicColorsPreference.setEnabled(DynamicColors.isDynamicColorAvailable());
dynamicColorsPreference.setOnPreferenceChangeListener((preference, newValue) -> {
getResult().putExtra("needsRecreate", true);
requireActivity().recreate();
return true;
});
@@ -96,7 +93,6 @@ public class AppearancePreferencesFragment extends PreferencesFragment {
dialog.dismiss();
getResult().putExtra("needsRecreate", true);
requireActivity().recreate();
})
.setNegativeButton(android.R.string.cancel, null)
@@ -120,8 +116,7 @@ public class AppearancePreferencesFragment extends PreferencesFragment {
int i = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
_prefs.setCurrentViewMode(ViewMode.fromInteger(i));
viewModePreference.setSummary(String.format("%s: %s", getString(R.string.selected), getResources().getStringArray(R.array.view_mode_titles)[i]));
getResult().putExtra("needsRefresh", true);
overrideAccountNamePosition(ViewMode.fromInteger(i) == ViewMode.TILES);
refreshAccountNamePositionText();
dialog.dismiss();
})
.setNegativeButton(android.R.string.cancel, null)
@@ -143,19 +138,12 @@ public class AppearancePreferencesFragment extends PreferencesFragment {
_prefs.setCodeGroupSize(Preferences.CodeGrouping.valueOf(codeGroupings[newCodeGroupingIndex]));
dialog.dismiss();
getResult().putExtra("needsRefresh", true);
})
.setNegativeButton(android.R.string.cancel, null)
.create());
return true;
});
Preference onlyShowNecessaryAccountNames = requirePreference("pref_shared_issuer_account_name");
onlyShowNecessaryAccountNames.setOnPreferenceChangeListener((preference, newValue) -> {
getResult().putExtra("needsRefresh", true);
return true;
});
int currentAccountNamePosition = _prefs.getAccountNamePosition().ordinal();
_currentAccountNamePositionPreference = requirePreference("pref_account_name_position");
_currentAccountNamePositionPreference.setSummary(String.format("%s: %s", getString(R.string.selected), getResources().getStringArray(R.array.account_name_position_titles)[currentAccountNamePosition]));
@@ -168,7 +156,7 @@ public class AppearancePreferencesFragment extends PreferencesFragment {
int i = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
_prefs.setAccountNamePosition(AccountNamePosition.fromInteger(i));
_currentAccountNamePositionPreference.setSummary(String.format("%s: %s", getString(R.string.selected), getResources().getStringArray(R.array.account_name_position_titles)[i]));
getResult().putExtra("needsRefresh", true);
refreshAccountNamePositionText();
dialog.dismiss();
})
.setNegativeButton(android.R.string.cancel, null)
@@ -177,21 +165,15 @@ public class AppearancePreferencesFragment extends PreferencesFragment {
return true;
});
Preference showIconsPreference = requirePreference("pref_show_icons");
showIconsPreference.setOnPreferenceChangeListener((preference, newValue) -> {
getResult().putExtra("needsRefresh", true);
return true;
});
overrideAccountNamePosition(_prefs.getCurrentViewMode() == ViewMode.TILES);
refreshAccountNamePositionText();
}
private void overrideAccountNamePosition(boolean override) {
private void refreshAccountNamePositionText() {
boolean override = (_prefs.getCurrentViewMode() == ViewMode.TILES && _prefs.getAccountNamePosition() == AccountNamePosition.END);
if (override) {
_currentAccountNamePositionPreference.setEnabled(false);
_currentAccountNamePositionPreference.setSummary(getString(R.string.pref_account_name_position_summary_override));
_currentAccountNamePositionPreference.setSummary(String.format("%s: %s. %s", getString(R.string.selected), getResources().getStringArray(R.array.account_name_position_titles)[_prefs.getAccountNamePosition().ordinal()], getString(R.string.pref_account_name_position_summary_override)));
} else {
_currentAccountNamePositionPreference.setEnabled(true);
_currentAccountNamePositionPreference.setSummary(String.format("%s: %s", getString(R.string.selected), getResources().getStringArray(R.array.account_name_position_titles)[_prefs.getAccountNamePosition().ordinal()]));
}
}
@@ -6,10 +6,8 @@ import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -64,10 +62,12 @@ public class AuditLogPreferencesFragment extends Fragment {
_noAuditLogsView.setVisibility(entries1.isEmpty() ? View.VISIBLE : View.GONE);
for (AuditLogEntry entry : entries1) {
VaultEntry referencedEntry = null;
if (entry.getReference() != null) {
referencedEntry = _vaultManager.getVault().getEntryByUUID(UUID.fromString(entry.getReference()));
UUID referencedEntryUUID = UUID.fromString(entry.getReference());
if (_vaultManager.getVault().hasEntryByUUID(referencedEntryUUID)) {
referencedEntry = _vaultManager.getVault().getEntryByUUID(referencedEntryUUID);
}
}
AuditLogEntryModel auditLogEntryModel = new AuditLogEntryModel(entry, referencedEntry);
@@ -52,7 +52,6 @@ public class BackupsPreferencesFragment extends PreferencesFragment {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
addPreferencesFromResource(R.xml.preferences_backups);
_backupsPasswordWarningPreference = requirePreference("pref_backups_warning_password");
@@ -131,12 +130,11 @@ public class BackupsPreferencesFragment extends PreferencesFragment {
});
_backupsVersionsPreference = requirePreference("pref_backups_versions");
_backupsVersionsPreference.setSummary(getResources().getQuantityString(R.plurals.pref_backups_versions_summary, _prefs.getBackupsVersionCount(), _prefs.getBackupsVersionCount()));
updateBackupsVersionsSummary();
_backupsVersionsPreference.setOnPreferenceClickListener(preference -> {
Dialogs.showBackupVersionsPickerDialog(requireContext(), _prefs.getBackupsVersionCount(), number -> {
number = number * 5 + 5;
_prefs.setBackupsVersionCount(number);
_backupsVersionsPreference.setSummary(getResources().getQuantityString(R.plurals.pref_backups_versions_summary, _prefs.getBackupsVersionCount(), _prefs.getBackupsVersionCount()));
updateBackupsVersionsSummary();
});
return false;
});
@@ -242,4 +240,14 @@ public class BackupsPreferencesFragment extends PreferencesFragment {
Dialogs.showErrorDialog(requireContext(), R.string.backup_error, e);
}
}
private void updateBackupsVersionsSummary() {
int count = _prefs.getBackupsVersionCount();
if (count == Preferences.BACKUPS_VERSIONS_INFINITE) {
_backupsVersionsPreference.setSummary(R.string.pref_backups_versions_infinite_summary);
} else {
String summary = getResources().getQuantityString(R.plurals.pref_backups_versions_summary, count, count);
_backupsVersionsPreference.setSummary(summary);
}
}
}
@@ -1,23 +1,68 @@
package com.beemdevelopment.aegis.ui.fragments.preferences;
import android.os.Bundle;
import android.widget.Button;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
import com.beemdevelopment.aegis.CopyBehavior;
import com.beemdevelopment.aegis.Preferences;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
public class BehaviorPreferencesFragment extends PreferencesFragment {
private Preference _entryPausePreference;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
addPreferencesFromResource(R.xml.preferences_behavior);
Preference currentSearchBehaviorPreference = requirePreference("pref_search_behavior");
currentSearchBehaviorPreference.setSummary(getSearchBehaviorSummary());
currentSearchBehaviorPreference.setOnPreferenceClickListener((preference) -> {
final int[] items = Preferences.SEARCH_BEHAVIOR_SETTINGS;
final String[] textItems = getResources().getStringArray(R.array.pref_search_behavior_types);
final boolean[] checkedItems = new boolean[items.length];
for (int i = 0; i < items.length; i++) {
checkedItems[i] = _prefs.isSearchBehaviorTypeEnabled(items[i]);
}
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.pref_search_behavior_prompt)
.setMultiChoiceItems(textItems, checkedItems, (dialog, index, isChecked) -> {
checkedItems[index] = isChecked;
boolean containsAtLeastOneCheckedItem = false;
for(boolean b: checkedItems) {
if (b) {
containsAtLeastOneCheckedItem = true;
break;
}
}
AlertDialog alertDialog = (AlertDialog) dialog;
Button positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
positiveButton.setEnabled(containsAtLeastOneCheckedItem);
})
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
int searchBehavior = 0;
for (int i = 0; i < checkedItems.length; i++) {
if (checkedItems[i]) {
searchBehavior |= items[i];
}
}
_prefs.setSearchBehaviorMask(searchBehavior);
currentSearchBehaviorPreference.setSummary(getSearchBehaviorSummary());
})
.setNegativeButton(android.R.string.cancel, null);
Dialogs.showSecureDialog(builder.create());
return true;
});
int currentCopyBehavior = _prefs.getCopyBehavior().ordinal();
Preference copyBehaviorPreference = requirePreference("pref_copy_behavior");
copyBehaviorPreference.setSummary(String.format("%s: %s", getString(R.string.selected), getResources().getStringArray(R.array.copy_behavior_titles)[currentCopyBehavior]));
@@ -30,7 +75,6 @@ public class BehaviorPreferencesFragment extends PreferencesFragment {
int i = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
_prefs.setCopyBehavior(CopyBehavior.fromInteger(i));
copyBehaviorPreference.setSummary(String.format("%s: %s", getString(R.string.selected), getResources().getStringArray(R.array.copy_behavior_titles)[i]));
getResult().putExtra("needsRefresh", true);
dialog.dismiss();
})
.setNegativeButton(android.R.string.cancel, null)
@@ -39,18 +83,31 @@ public class BehaviorPreferencesFragment extends PreferencesFragment {
return true;
});
Preference entryPausePreference = requirePreference("pref_pause_entry");
entryPausePreference.setEnabled(_prefs.isTapToRevealEnabled() || _prefs.isEntryHighlightEnabled());
Preference entryHighlightPreference = requirePreference("pref_highlight_entry");
entryHighlightPreference.setOnPreferenceChangeListener((preference, newValue) -> {
getResult().putExtra("needsRefresh", true);
_entryPausePreference.setEnabled(_prefs.isTapToRevealEnabled() || (boolean) newValue);
entryPausePreference.setEnabled(_prefs.isTapToRevealEnabled() || (boolean) newValue);
return true;
});
}
_entryPausePreference = requirePreference("pref_pause_entry");
_entryPausePreference.setOnPreferenceChangeListener((preference, newValue) -> {
getResult().putExtra("needsRefresh", true);
return true;
});
_entryPausePreference.setEnabled(_prefs.isTapToRevealEnabled() || _prefs.isEntryHighlightEnabled());
private String getSearchBehaviorSummary() {
final int[] settings = Preferences.SEARCH_BEHAVIOR_SETTINGS;
final String[] descriptions = getResources().getStringArray(R.array.pref_search_behavior_types);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < settings.length; i++) {
if (_prefs.isSearchBehaviorTypeEnabled(settings[i])) {
if (builder.length() != 0) {
builder.append(", ");
}
builder.append(descriptions[i].toLowerCase());
}
}
return getString(R.string.pref_search_behavior_summary, builder.toString());
}
}
@@ -23,7 +23,6 @@ import androidx.preference.Preference;
import com.beemdevelopment.aegis.BuildConfig;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.database.AuditLogRepository;
import com.beemdevelopment.aegis.helpers.DropdownHelper;
import com.beemdevelopment.aegis.importers.DatabaseImporter;
import com.beemdevelopment.aegis.otp.GoogleAuthInfo;
@@ -64,18 +63,12 @@ import java.util.UUID;
import java.util.stream.Collectors;
import javax.crypto.Cipher;
import javax.inject.Inject;
public class ImportExportPreferencesFragment extends PreferencesFragment {
// keep a reference to the type of database converter that was selected
private DatabaseImporter.Definition _importerDef;
private Vault.EntryFilter _exportFilter;
private final ActivityResultLauncher<Intent> importResultLauncher =
registerForActivityResult(new StartActivityForResult(), activityResult -> {
getResult().putExtra("needsRecreate", true);
});
private final ActivityResultLauncher<Intent> importSelectResultLauncher =
registerForActivityResult(new StartActivityForResult(), activityResult -> {
Intent data = activityResult.getData();
@@ -102,7 +95,6 @@ public class ImportExportPreferencesFragment extends PreferencesFragment {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
addPreferencesFromResource(R.xml.preferences_import_export);
if (savedInstanceState != null) {
@@ -169,7 +161,7 @@ public class ImportExportPreferencesFragment extends PreferencesFragment {
Intent intent = new Intent(requireContext(), ImportEntriesActivity.class);
intent.putExtra("importerDef", importerDef);
intent.putExtra("file", file);
importResultLauncher.launch(intent);
startActivity(intent);
}
private void startExport() {
@@ -7,7 +7,6 @@ import com.beemdevelopment.aegis.R;
public class MainPreferencesFragment extends PreferencesFragment {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
addPreferencesFromResource(R.xml.preferences);
}
}
@@ -1,8 +1,6 @@
package com.beemdevelopment.aegis.ui.fragments.preferences;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.animation.Animation;
import androidx.annotation.CallSuper;
@@ -31,8 +29,6 @@ public abstract class PreferencesFragment extends PreferenceFragmentCompat {
public static final int CODE_EXPORT_GOOGLE_URI = 7;
public static final int CODE_EXPORT_HTML = 8;
private Intent _result;
@Inject
Preferences _prefs;
@@ -42,12 +38,6 @@ public abstract class PreferencesFragment extends PreferenceFragmentCompat {
@Inject
protected AuditLogRepository _auditLogRepository;
@Override
@CallSuper
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setResult(new Intent());
}
@Override
@CallSuper
public void onResume() {
@@ -61,10 +51,6 @@ public abstract class PreferencesFragment extends PreferenceFragmentCompat {
}
}
public Intent getResult() {
return _result;
}
@Override
@Nullable
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
@@ -75,11 +61,6 @@ public abstract class PreferencesFragment extends PreferenceFragmentCompat {
return super.onCreateAnimation(transit, enter, nextAnim);
}
public void setResult(Intent result) {
_result = result;
requireActivity().setResult(Activity.RESULT_OK, _result);
}
protected boolean saveAndBackupVault() {
try {
_vaultManager.saveAndBackup();
@@ -55,18 +55,10 @@ public class SecurityPreferencesFragment extends PreferencesFragment {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
super.onCreatePreferences(savedInstanceState, rootKey);
addPreferencesFromResource(R.xml.preferences_security);
Preference tapToRevealPreference = requirePreference("pref_tap_to_reveal");
tapToRevealPreference.setOnPreferenceChangeListener((preference, newValue) -> {
getResult().putExtra("needsRefresh", true);
return true;
});
Preference screenPreference = requirePreference("pref_secure_screen");
screenPreference.setOnPreferenceChangeListener((preference, newValue) -> {
getResult().putExtra("needsRecreate", true);
Window window = requireActivity().getWindow();
if ((boolean) newValue) {
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE);
@@ -82,7 +74,6 @@ public class SecurityPreferencesFragment extends PreferencesFragment {
Dialogs.showTapToRevealTimeoutPickerDialog(requireContext(), _prefs.getTapToRevealTime(), number -> {
_prefs.setTapToRevealTime(number);
tapToRevealTimePreference.setSummary(number + " seconds");
getResult().putExtra("needsRefresh", true);
});
return false;
});
@@ -20,6 +20,7 @@ import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.ChronoUnit;
public class AuditLogHolder extends RecyclerView.ViewHolder {
@@ -60,6 +61,10 @@ public class AuditLogHolder extends RecyclerView.ViewHolder {
if (auditLogEntryModel.getReferencedVaultEntry() != null) {
VaultEntry referencedVaultEntry = auditLogEntryModel.getReferencedVaultEntry();
_auditLogEntryReference.setText(String.format("%s (%s)", referencedVaultEntry.getIssuer(), referencedVaultEntry.getName()));
_auditLogEntryReference.setVisibility(View.VISIBLE);
} else if (auditLogEntryModel.getAuditLogEntry().getReference() != null) {
_auditLogEntryReference.setText(R.string.audit_log_entry_deleted);
_auditLogEntryReference.setVisibility(View.VISIBLE);
} else {
_auditLogEntryReference.setVisibility(View.GONE);
}
@@ -133,7 +138,7 @@ public class AuditLogHolder extends RecyclerView.ViewHolder {
String formattedTime = timestamp.format(timeFormatter);
return context.getString(R.string.day_of_week_at_time, dayOfWeek, formattedTime);
} else {
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(context.getString(R.string.date_format));
DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
return timestamp.format(dateFormatter);
}
}
@@ -32,6 +32,7 @@ import com.beemdevelopment.aegis.otp.TotpInfo;
import com.beemdevelopment.aegis.ui.models.ErrorCardInfo;
import com.beemdevelopment.aegis.util.CollectionUtils;
import com.beemdevelopment.aegis.vault.VaultEntry;
import com.beemdevelopment.aegis.vault.VaultGroup;
import java.util.ArrayList;
import java.util.Collection;
@@ -51,6 +52,7 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
private List<VaultEntry> _entries;
private List<VaultEntry> _shownEntries;
private List<VaultEntry> _selectedEntries;
private Collection<VaultGroup> _groups;
private Map<UUID, Integer> _usageCounts;
private Map<UUID, Long> _lastUsedTimestamps;
private VaultEntry _focusedEntry;
@@ -64,6 +66,7 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
private boolean _tapToReveal;
private int _tapToRevealTime;
private CopyBehavior _copyBehavior;
private int _searchBehaviorMask;
private Set<UUID> _groupFilter;
private SortCategory _sortCategory;
private ViewMode _viewMode;
@@ -130,6 +133,8 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
public void setCopyBehavior(CopyBehavior copyBehavior) { _copyBehavior = copyBehavior; }
public void setSearchBehaviorMask(int searchBehaviorMask) { _searchBehaviorMask = searchBehaviorMask; }
public void setPauseFocused(boolean pauseFocused) {
_pauseFocused = pauseFocused;
}
@@ -308,6 +313,7 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
Set<UUID> groups = entry.getGroups();
String issuer = entry.getIssuer().toLowerCase();
String name = entry.getName().toLowerCase();
String note = entry.getNote().toLowerCase();
if (!_groupFilter.isEmpty()) {
if (groups.isEmpty() && !_groupFilter.contains(null)) {
@@ -322,7 +328,17 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
return false;
}
return !issuer.contains(_searchFilter) && !name.contains(_searchFilter);
return ((_searchBehaviorMask & Preferences.SEARCH_IN_ISSUER) == 0 || !issuer.contains(_searchFilter))
&& ((_searchBehaviorMask & Preferences.SEARCH_IN_NAME) == 0 || !name.contains(_searchFilter))
&& ((_searchBehaviorMask & Preferences.SEARCH_IN_NOTE) == 0 || !note.contains(_searchFilter))
&& ((_searchBehaviorMask & Preferences.SEARCH_IN_GROUPS) == 0 || !doesAnyGroupMatchSearchFilter(entry.getGroups(), _searchFilter));
}
private boolean doesAnyGroupMatchSearchFilter(Set<UUID> entryGroupUUIDs, String searchFilter) {
return _groups.stream()
.filter(group -> entryGroupUUIDs.contains(group.getUUID()))
.map(VaultGroup::getName)
.anyMatch(groupName -> groupName.toLowerCase().contains(searchFilter.toLowerCase()));
}
public void refresh(boolean hard) {
@@ -362,7 +378,7 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
}
public void setSearchFilter(String search) {
_searchFilter = (search != null && !search.isEmpty()) ? search.toLowerCase() : null;
_searchFilter = (search != null && !search.isEmpty()) ? search.toLowerCase().trim() : null;
updateShownEntries();
}
@@ -411,6 +427,8 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
public Map<UUID, Integer> getUsageCounts() { return _usageCounts; }
public void setGroups(Collection<VaultGroup> groups) { _groups = groups; }
public void setLastUsedTimestamps(Map<UUID, Long> lastUsedTimestamps) { _lastUsedTimestamps = lastUsedTimestamps; }
public Map<UUID, Long> getLastUsedTimestamps() { return _lastUsedTimestamps; }
@@ -550,7 +568,7 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
case SINGLETAP:
if (!handled) {
_view.onEntryCopy(entry);
entryHolder.animateCopyText(_viewMode != ViewMode.TILES);
entryHolder.animateCopyText();
_clickedEntry = null;
}
break;
@@ -559,7 +577,7 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
if(entry == _clickedEntry) {
_view.onEntryCopy(entry);
entryHolder.animateCopyText(_viewMode != ViewMode.TILES);
entryHolder.animateCopyText();
_clickedEntry = null;
} else {
_clickedEntry = entry;
@@ -1,7 +1,14 @@
package com.beemdevelopment.aegis.ui.views;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.RelativeSizeSpan;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@@ -15,6 +22,7 @@ import com.beemdevelopment.aegis.Preferences;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.ViewMode;
import com.beemdevelopment.aegis.helpers.AnimationsHelper;
import com.beemdevelopment.aegis.helpers.CenterVerticalSpan;
import com.beemdevelopment.aegis.helpers.SimpleAnimationEndListener;
import com.beemdevelopment.aegis.helpers.UiRefresher;
import com.beemdevelopment.aegis.otp.HotpInfo;
@@ -108,6 +116,9 @@ public class EntryHolder extends RecyclerView.ViewHolder {
_codeGrouping = groupSize;
_viewMode = viewMode;
_accountNamePosition = accountNamePosition;
if (viewMode.equals(ViewMode.TILES) && _accountNamePosition == AccountNamePosition.END) {
_accountNamePosition = AccountNamePosition.BELOW;
}
_selected.clearAnimation();
_selected.setVisibility(View.GONE);
@@ -143,15 +154,25 @@ public class EntryHolder extends RecyclerView.ViewHolder {
}
private void setAccountNameLayout(AccountNamePosition accountNamePosition, Boolean hasBothIssuerAndName) {
if (_viewMode == ViewMode.TILES) {
return;
}
RelativeLayout.LayoutParams profileNameLayoutParams;
RelativeLayout.LayoutParams copiedLayoutParams;
switch (accountNamePosition) {
case HIDDEN:
_profileName.setVisibility(View.GONE);
if (_viewMode == ViewMode.TILES) {
_profileCopied.setGravity(Gravity.CENTER_VERTICAL);
((RelativeLayout.LayoutParams)_profileCopied.getLayoutParams()).removeRule(RelativeLayout.BELOW);
_profileCopied.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
_profileCopied.setTextSize(14);
_profileIssuer.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
_profileIssuer.setGravity(Gravity.CENTER_VERTICAL);
_profileIssuer.setTextSize(14);
_profileName.setVisibility(View.GONE);
}
break;
case BELOW:
@@ -261,6 +282,10 @@ public class EntryHolder extends RecyclerView.ViewHolder {
}
private void updateCode() {
_profileCode.setText(getOtp());
}
private String getOtp() {
OtpInfo info = _entry.getInfo();
// In previous versions of Aegis, it was possible to import entries with an empty
@@ -277,7 +302,7 @@ public class EntryHolder extends RecyclerView.ViewHolder {
otp = _view.getResources().getString(R.string.error_all_caps);
}
_profileCode.setText(otp);
return otp;
}
private String formatCode(String code) {
@@ -315,12 +340,53 @@ public class EntryHolder extends RecyclerView.ViewHolder {
}
public void hideCode() {
String hiddenText = new String(new char[_entry.getInfo().getDigits()]).replace("\0", Character.toString(HIDDEN_CHAR));
hiddenText = formatCode(hiddenText);
_profileCode.setText(hiddenText);
String code = getOtp();
String hiddenText = code.replaceAll("\\S", Character.toString(HIDDEN_CHAR));
updateTextViewWithDots(_profileCode, hiddenText, code);
_hidden = true;
}
private void updateTextViewWithDots(TextView textView, String hiddenCode, String code) {
Paint paint = new Paint();
paint.setTextSize(_profileCode.getTextSize());
// Calculate the difference between the actual code width and the dots width
float codeWidth = paint.measureText(code);
float dotsWidth = paint.measureText(hiddenCode);
float scaleFactor = codeWidth / dotsWidth;
scaleFactor = (float)(Math.round(scaleFactor * 10.0) / 10.0);
// If scale is higher or equal to 0.8, do nothing and proceed with the normal text rendering
if (scaleFactor >= 0.8) {
textView.setText(hiddenCode);
return;
}
// We need to use an invisible character in order to get the height of the profileCode textview consistent
// Tokens without a space (ie Steam TOTP) will get misaligned without this
SpannableString dotsString = new SpannableString("\u200B" + hiddenCode);
// Only scale the digits/characters, skip the spaces
int start = 1;
for (int i = 0; i <= dotsString.length(); i++) {
if (i == dotsString.length() || dotsString.charAt(i) == ' ') {
if (i > start) {
dotsString.setSpan(new RelativeSizeSpan(scaleFactor), start, i, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
start = i + 1;
}
}
Rect dotsRectBounds = new Rect();
paint.getTextBounds(hiddenCode, 1, hiddenCode.length(), dotsRectBounds);
// Use custom CenterVerticalSpan to make sure the dots are vertically aligned
dotsString.setSpan(new CenterVerticalSpan(dotsRectBounds), 1, dotsString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(dotsString);
}
public void showIcon(boolean show) {
if (show) {
_profileDrawable.setVisibility(View.VISIBLE);
@@ -349,7 +415,7 @@ public class EntryHolder extends RecyclerView.ViewHolder {
animateAlphaTo(DEFAULT_ALPHA);
}
public void animateCopyText(boolean includeSlideAnimation) {
public void animateCopyText() {
_animationHandler.removeCallbacksAndMessages(null);
Animation slideDownFadeIn = AnimationsHelper.loadScaledAnimation(itemView.getContext(), R.anim.slide_down_fade_in);
@@ -357,23 +423,25 @@ public class EntryHolder extends RecyclerView.ViewHolder {
Animation fadeOut = AnimationsHelper.loadScaledAnimation(itemView.getContext(), R.anim.fade_out);
Animation fadeIn = AnimationsHelper.loadScaledAnimation(itemView.getContext(), R.anim.fade_in);
if (includeSlideAnimation) {
// Use slideDown animation when user is not using Tiles mode
if (_viewMode != ViewMode.TILES) {
_profileCopied.startAnimation(slideDownFadeIn);
View fadeOutView = (_accountNamePosition == AccountNamePosition.BELOW) ? _profileName : _description;
fadeOutView.startAnimation(slideDownFadeOut);
View fadeOutView = (_accountNamePosition == AccountNamePosition.BELOW) ? _profileName : _description;
fadeOutView.startAnimation(slideDownFadeOut);
_animationHandler.postDelayed(() -> {
_profileCopied.startAnimation(fadeOut);
fadeOutView.startAnimation(fadeIn);
}, 3000);
} else {
View visibleProfileText = _accountNamePosition == AccountNamePosition.BELOW ? _profileName : _profileIssuer;
_profileCopied.startAnimation(fadeIn);
_profileName.startAnimation(fadeOut);
visibleProfileText.startAnimation(fadeOut);
_animationHandler.postDelayed(() -> {
_profileCopied.startAnimation(fadeOut);
_profileName.startAnimation(fadeIn);
visibleProfileText.startAnimation(fadeIn);
}, 3000);
}
}
@@ -222,6 +222,10 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
_adapter.setCopyBehavior(copyBehavior);
}
public void setSearchBehaviorMask(int searchBehaviorMask) {
_adapter.setSearchBehaviorMask(searchBehaviorMask);
}
public List<VaultEntry> selectAllEntries() {
return _adapter.selectAllEntries();
}
@@ -599,6 +603,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
public void setGroups(Collection<VaultGroup> groups) {
_groups = groups;
_adapter.setGroups(groups);
_groupChip.setVisibility(_groups.isEmpty() ? View.GONE : View.VISIBLE);
updateDividerDecoration();
@@ -118,6 +118,10 @@ public class VaultBackupManager {
}
private void enforceVersioning(DocumentFile dir, int versionsToKeep) {
if (versionsToKeep <= 0) {
return;
}
Log.i(TAG, String.format("Scanning directory %s for backup files", Uri.decode(dir.getUri().toString())));
List<BackupFile> files = new ArrayList<>();
@@ -225,6 +225,10 @@ public class VaultRepository {
_vault.getEntries().add(entry);
}
public boolean hasEntryByUUID(UUID uuid) {
return _vault.getEntries().has(uuid);
}
public VaultEntry getEntryByUUID(UUID uuid) {
return _vault.getEntries().getByUUID(uuid);
}
@@ -75,6 +75,7 @@ public class SlotList extends UUIDMap<Slot> {
/**
* Returns a copy of this SlotList that is suitable for exporting.
* Strips biometric slots.
* In case there's a backup password slot, any regular password slots are stripped.
*/
public SlotList exportable() {
@@ -85,18 +86,16 @@ public class SlotList extends UUIDMap<Slot> {
break;
}
}
if (!hasBackupSlots) {
return this;
}
SlotList slots = new SlotList();
for (Slot slot : this) {
if (!(slot instanceof PasswordSlot) || ((PasswordSlot) slot).isBackup()) {
slots.add(slot);
if (slot instanceof BiometricSlot) {
continue;
}
if (hasBackupSlots && slot instanceof PasswordSlot && !((PasswordSlot) slot).isBackup()) {
continue;
}
slots.add(slot);
}
return slots;
}
}
@@ -0,0 +1,117 @@
package info.guardianproject;
import info.guardianproject.trustedintents.ApkSignaturePin;
/**
* This is the second Guardian Project APK signing key. It was generated since
* RSA 1024-bit keys are deprecated. So any new Guardian Project app will be
* signed by this key. It is used to sign these apps:
* <ul>
* <li>Checkey</li>
* <li>Courier</li>
* </ul>
*
* @author hans
*/
public final class GuardianProjectRSA4096 extends ApkSignaturePin {
public GuardianProjectRSA4096() {
fingerprints = new String[] {
"f006a20481c71a690de02e385ab0c9fa4ac1245240f68102682703ba0656867a",
};
certificates = new byte[][] {
{
48, -126, 5, -84, 48, -126, 3, -108, 2, 9, 0, -126, -20, 93, -43, 112, 34,
-87, 29, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 5, 5, 0, 48, -127,
-105, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 17, 48, 15, 6, 3,
85, 4, 8, 12, 8, 78, 101, 119, 32, 89, 111, 114, 107, 49, 17, 48, 15, 6, 3,
85, 4, 7, 12, 8, 78, 101, 119, 32, 89, 111, 114, 107, 49, 25, 48, 23, 6, 3,
85, 4, 10, 12, 16, 71, 117, 97, 114, 100, 105, 97, 110, 32, 80, 114, 111,
106, 101, 99, 116, 49, 29, 48, 27, 6, 3, 85, 4, 3, 12, 20, 103, 117, 97,
114, 100, 105, 97, 110, 112, 114, 111, 106, 101, 99, 116, 46, 105, 110,
102, 111, 49, 40, 48, 38, 6, 9, 42, -122, 72, -122, -9, 13, 1, 9, 1, 22,
25, 114, 111, 111, 116, 64, 103, 117, 97, 114, 100, 105, 97, 110, 112, 114,
111, 106, 101, 99, 116, 46, 105, 110, 102, 111, 48, 30, 23, 13, 49, 52, 48,
53, 49, 52, 49, 55, 53, 55, 50, 57, 90, 23, 13, 52, 49, 48, 57, 50, 56, 49,
55, 53, 55, 50, 57, 90, 48, -127, -105, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19,
2, 85, 83, 49, 17, 48, 15, 6, 3, 85, 4, 8, 12, 8, 78, 101, 119, 32, 89,
111, 114, 107, 49, 17, 48, 15, 6, 3, 85, 4, 7, 12, 8, 78, 101, 119, 32, 89,
111, 114, 107, 49, 25, 48, 23, 6, 3, 85, 4, 10, 12, 16, 71, 117, 97, 114,
100, 105, 97, 110, 32, 80, 114, 111, 106, 101, 99, 116, 49, 29, 48, 27, 6,
3, 85, 4, 3, 12, 20, 103, 117, 97, 114, 100, 105, 97, 110, 112, 114, 111,
106, 101, 99, 116, 46, 105, 110, 102, 111, 49, 40, 48, 38, 6, 9, 42, -122,
72, -122, -9, 13, 1, 9, 1, 22, 25, 114, 111, 111, 116, 64, 103, 117, 97,
114, 100, 105, 97, 110, 112, 114, 111, 106, 101, 99, 116, 46, 105, 110,
102, 111, 48, -126, 2, 34, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1,
1, 5, 0, 3, -126, 2, 15, 0, 48, -126, 2, 10, 2, -126, 2, 1, 0, -51, 108,
83, -44, 61, 81, 46, 61, 2, -61, 46, 60, 2, -30, 44, 38, -70, -63, -93,
-66, -57, 1, 2, -32, -80, -82, 98, -26, -70, -34, 60, -65, -55, -43, 16,
-63, -89, -104, 50, 108, -26, -2, -3, -55, -77, 47, 75, 89, 99, 12, -32,
32, 120, -26, -81, 54, 95, -57, -114, -100, -39, -110, -4, 120, 90, 90,
-40, -89, -53, 63, -122, -45, -80, 32, -6, -12, -29, -107, 45, 10, -23, 76,
5, 112, -15, -63, 48, 35, -61, 0, -107, -110, 44, -46, -126, -30, -30, -33,
86, 22, 30, 8, -72, 29, 75, 121, 31, -120, 119, 59, -57, 19, -64, 31, 84,
-94, -38, 91, 82, 92, -95, 66, 2, 120, -37, -113, 126, 54, -83, 83, -125,
122, 110, -106, 80, 59, -127, -72, -23, 64, 105, 20, 25, -41, -3, -61, -44,
51, -28, 17, 36, -90, -18, -25, 96, 37, -93, -48, 98, 47, 27, 49, 40, -31,
-62, -102, -49, 28, -55, 50, -38, -70, -83, 101, 97, 96, -122, -114, 18,
47, 119, 117, -7, -55, -64, -1, 96, -120, 61, -89, -70, -7, -89, 113, -41,
88, 27, 26, 95, -52, 53, 59, 7, 11, 79, 86, 31, -109, -21, 120, -15, 38,
106, 33, -121, 82, 18, 45, 32, 49, 93, -26, -74, -104, 4, -122, 96, 39,
126, -24, 16, 119, -45, -119, 110, -31, 55, -109, 53, 53, -11, -58, -124,
-84, 41, -42, 64, 17, -5, -78, -57, -100, 118, -105, -38, -94, 84, -16,
-53, -106, -11, 76, 81, 70, -83, -56, 73, -96, -100, -18, 55, -3, -3, 34,
-97, -62, 59, -17, -79, 91, -9, 122, 95, -108, -121, -76, -62, -72, 61,
-82, 105, -99, -59, 10, 51, 52, 77, -105, -127, 37, 79, 88, -127, 27, 39,
44, 15, 123, -59, -118, -96, 61, -28, 23, -54, 124, 100, 57, 37, 123, -83,
-124, 11, 123, 73, -53, 18, 119, -39, -13, 46, 123, -55, 4, -91, 114, 93,
-116, -98, 21, 95, -30, -82, -108, 87, -65, -8, 30, 67, 14, 22, 79, -64,
86, -128, -83, 74, 69, -42, 9, -18, -120, -52, 7, 62, 78, 88, -53, -125,
41, -122, -91, -34, -110, 111, -118, -25, 25, -83, 90, -95, 84, -121, 95,
72, -53, -14, -14, -48, 65, 4, 23, 99, 56, 23, -20, 9, 46, 63, 83, -26,
-86, 54, -104, 79, 9, 94, -91, -69, 10, -125, -17, -28, -32, -79, 5, -11,
37, 103, -46, -75, 71, -119, 39, 48, -53, -51, 118, 43, 28, 68, 14, -33,
-82, -76, -98, 1, 41, 94, -128, -86, 51, -89, 17, -31, 38, -70, -2, -27,
-105, -87, 103, 93, 19, 73, -106, -82, -76, 110, -48, -124, -51, 92, -91,
-51, 22, 1, -48, 52, -127, -24, 26, -77, 4, 22, 33, 24, -128, -1, 9, -42,
23, -53, 78, 10, -39, -115, -95, 17, 100, 90, 16, -23, -127, -38, 10, -62,
-64, 113, -115, -114, 78, -11, -124, 113, 113, -42, -66, 114, -98, -40,
-41, 2, 3, 1, 0, 1, 48, 13, 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 5, 5,
0, 3, -126, 2, 1, 0, -54, 125, -113, -9, -45, 82, 2, -79, -87, 31, -17,
-10, 117, 16, 1, 67, -63, 57, -49, -81, -90, 48, 7, -58, 89, -29, 120, 84,
116, 51, 54, -94, 74, -111, -11, 53, -13, 53, -125, -76, -64, 46, -35, 19,
-19, 25, 36, -82, 66, 113, -14, -6, -63, 83, 15, 8, -77, -74, -94, -53,
-35, -61, -75, 52, 13, -128, 9, 96, 66, 46, 46, -57, 24, -28, -39, -46, 96,
-115, -63, 92, -70, 51, 49, -94, 96, 77, 16, 108, -59, -28, 112, -2, -3,
-87, 27, 56, 118, 29, -95, -76, -70, 34, -105, -24, -104, 70, 24, -88, -29,
-28, -101, -98, 24, -48, -32, -111, 97, 61, -70, -21, -111, 70, -55, 68,
-76, 125, -61, 56, -122, 48, -118, 74, 61, -101, -46, -43, -12, -114, -116,
-57, -108, 91, -109, -62, -117, -76, -48, 109, 81, -22, -113, -73, 64, -61,
102, 92, -117, -9, -100, 62, -90, 99, 102, -50, -41, -75, 31, 5, -76, -31,
-85, 118, -57, -21, 102, 71, 41, -34, -45, -92, 88, 82, -95, 65, -100, -31,
-28, -85, -37, 94, -52, 72, 39, 55, -42, 18, 29, 115, 23, -106, -2, -54,
-45, 61, 53, 62, 107, 109, -65, 69, 4, -123, 124, -30, -54, -44, 38, 119,
49, -123, -27, -50, 77, -9, -40, -114, -50, -70, -123, 86, -115, 127, 45,
42, 23, -25, -83, -81, -38, -84, -3, 99, -36, 12, -67, -39, -110, 21, -40,
-128, 6, -96, -24, -116, -62, 63, 127, 39, 57, -83, -63, 0, 127, -12, 73,
85, -41, -101, -70, -48, -94, -94, -73, -38, -115, -62, -34, 62, -92, 96,
16, 6, -19, -84, 38, -93, -117, -52, 32, 92, -21, 123, -117, 81, 50, -71,
103, 121, 127, 4, -3, -40, 62, 100, 22, -123, -68, -69, -54, -127, -67, 50,
-114, 77, -30, 26, -102, 29, 106, 48, 83, 99, 73, 96, 124, -77, 51, 8, 15,
40, 72, -108, 105, 62, 119, -113, -90, 57, -62, 127, -57, -21, -40, -109,
96, 101, 71, -40, -101, 127, 69, 110, 43, 59, -102, -8, -42, -70, -24, 51,
-51, 54, 42, -110, -119, 41, -101, 45, -101, -124, 56, -75, -26, 86, -65,
54, 21, -88, -30, 79, -26, -127, 121, -102, -48, -25, -62, 99, 76, -90,
-48, -37, 123, 9, 67, 51, -41, -116, 29, 69, 88, 93, -42, 23, 73, -112, 24,
-85, 60, 1, 3, -95, 12, -49, -55, 95, 109, -37, 10, -124, 119, -52, -31,
91, 55, -67, 99, 87, -55, 97, 25, -9, -119, -41, -98, 100, -14, 70, -44,
-63, 60, -127, -99, 15, 49, 22, -118, -49, 66, -106, 36, -34, -5, 6, -48,
123, -79, 115, 57, 30, -3, -34, -67, 91, 34, 3, -52, -106, 79, -63, 125,
123, -16, -120, -53, -98, 34, 86, -60, 94, 78, -91, -34, 0, -8, 73, -119,
-87, 12, -101, -112, -10, -79, 10, 105, -82, 120, -106, -9, 99, 57, -63,
-26, 125, -80, 102, -106, -11, -91, -1, 37, 33
},
};
}
}
@@ -0,0 +1,87 @@
package info.guardianproject.trustedintents;
import android.content.pm.Signature;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public abstract class ApkSignaturePin {
protected String[] fingerprints; // hex-encoded SHA-256 hashes of the certs
protected byte[][] certificates; // array of DER-encoded X.509 certificates
private Signature[] signatures;
public Signature[] getSignatures() {
if (signatures == null) {
signatures = new Signature[certificates.length];
for (int i = 0; i < certificates.length; i++)
signatures[i] = new Signature(certificates[i]);
}
return signatures;
}
/**
* Gets the fingerprint of the first certificate in the signature.
*
* @param algorithm - Which hash to use (e.g. MD5, SHA1, SHA-256)
* @return the fingerprint as hex String
*/
public String getFingerprint(String algorithm) {
try {
MessageDigest md = MessageDigest.getInstance(algorithm);
byte[] hashBytes = md.digest(certificates[0]);
BigInteger bi = new BigInteger(1, hashBytes);
md.reset();
return String.format("%0" + (hashBytes.length << 1) + "x", bi);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* Gets the MD5 fingerprint of the first certificate in the signature.
*
* @return the MD5 sum as hex String
*/
public String getMD5Fingerprint() {
return getFingerprint("MD5");
}
/**
* Gets the SHA1 fingerprint of the first certificate in the signature.
*
* @return the SHA1 sum as hex String
*/
public String getSHA1Fingerprint() {
return getFingerprint("SHA1");
}
/**
* Gets the SHA-256 fingerprint of the first certificate in the signature.
*
* @return the SHA-256 sum as hex String
*/
public String getSHA256Fingerprint() {
return getFingerprint("SHA-256");
}
/**
* Compares the calculated SHA-256 cert fingerprint to the stored one.
*
* @return the result of the comparison
*/
public boolean doFingerprintsMatchCertificates() {
if (fingerprints == null || certificates == null)
return false;
String[] calcedFingerprints = new String[certificates.length];
for (int i = 0; i < calcedFingerprints.length; i++)
calcedFingerprints[i] = getSHA256Fingerprint();
if (fingerprints.length == 0 || calcedFingerprints.length == 0)
return false;
return Arrays.equals(fingerprints, calcedFingerprints);
}
}
@@ -0,0 +1,502 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
@@ -0,0 +1,271 @@
package info.guardianproject.trustedintents;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.Signature;
import android.text.TextUtils;
import android.util.Log;
import java.lang.reflect.Constructor;
import java.security.cert.CertificateException;
import java.util.LinkedHashSet;
public class TrustedIntents {
private static TrustedIntents instance;
private static PackageManager pm;
private final LinkedHashSet<ApkSignaturePin> pinList;
private TrustedIntents(Context context) {
pm = context.getPackageManager();
this.pinList = new LinkedHashSet<ApkSignaturePin>();
}
public static TrustedIntents get(Context context) {
if (instance == null)
instance = new TrustedIntents(context);
return instance;
}
/**
* Check whether a resolved {@link Activity} is trusted.
*
* @param resolveInfo the one to check
* @return whether the {@code Intent}'s receiver is trusted
*/
public boolean isReceiverTrusted(ResolveInfo resolveInfo) {
return isPackageNameTrusted(resolveInfo.activityInfo.packageName);
}
/**
* Check whether a resolved {@link Activity} is trusted.
*
* @param activityInfo the one to check
* @return whether the {@code Intent}'s receiver is trusted
*/
public boolean isReceiverTrusted(ActivityInfo activityInfo) {
return isPackageNameTrusted(activityInfo.packageName);
}
/**
* Check an {@link Intent} is trusted based on the {@code packageName} set
* by {@link Intent#setPackage(String)}
*
* @param intent the one to check
* @return whether the {@code Intent}'s receiver is trusted
*/
public boolean isReceiverTrusted(Intent intent) {
if (!isIntentSane(intent))
return false;
String packageName = intent.getPackage();
if (TextUtils.isEmpty(packageName)) {
packageName = intent.getComponent().getPackageName();
}
return isPackageNameTrusted(packageName);
}
/**
* Check whether a {@code packageName} is trusted.
*
* @param packageName the one to check
* @return whether the {@code packageName} is trusted
*/
public boolean isPackageNameTrusted(String packageName) {
try {
checkTrustedSigner(packageName);
} catch (NameNotFoundException e) {
e.printStackTrace();
return false;
} catch (CertificateException e) {
return false;
}
return true;
}
/**
* Returns an {@link Intent} if the sending app is signed by one of
* the trusted signing keys as set in {@link #addTrustedSigner(Class)}.
*
* @returns {@code null} if there is no {@code Intent} or if the
* sender is not trusted.
* @see #addTrustedSigner(Class)
*/
public Intent getIntentFromTrustedSender(Activity activity) {
Intent intent = activity.getIntent();
String packageName = getCallingPackageName(activity);
if (TextUtils.isEmpty(packageName)) {
return null;
}
if (isPackageNameTrusted(packageName)) {
return intent;
}
return null;
}
/**
* Get the package name of the {@link Activity} that sent the
* {@link Intent} that started this {@code Activity}.
* <p/>
* <strong>WARNING</strong>: If the {@code Activity} has
* {@code android:launchMode="singleInstance"} or {@code "singleTask"}, then
* this method will not disconnect because it is not possible to get the
* calling {@code Activity}, as set by
* {@link Activity#startActivityForResult(Intent, int)}
*
* @param activity the {@code Activity} to check for the {@code Intent}
* @return the package of the sending app or {@code null} if it was not a
* {@code ACTION_CONNECT Intent} or the {@code Intent} was not sent
* with {@link Activity#startActivityForResult(Intent, int)}
*/
public static String getCallingPackageName(Activity activity) {
// getCallingPackage() was unstable until android-18, use this
ComponentName componentName = activity.getCallingActivity();
if (componentName == null)
return null;
String packageName = componentName.getPackageName();
if (TextUtils.isEmpty(packageName)) {
Log.e(activity.getClass().getSimpleName(),
"Received Intent without sender! The Intent must be sent using startActivityForResult() and received without launchMode singleTask or singleInstance!");
}
return packageName;
}
/**
* This is used to check whether an {@link Intent} that will be sent is
* complete. It should <strong>not</strong> be used with {@code Intent}s
* that have been received already.
*/
private boolean isIntentSane(Intent intent) {
if (intent == null)
return false;
if (TextUtils.isEmpty(intent.getPackage())) {
ComponentName componentName = intent.getComponent();
if (componentName == null || TextUtils.isEmpty(componentName.getPackageName())) {
return false;
}
}
return true;
}
/**
* Add an APK signature that is always trusted for any packageName.
*
* @param cls {@link Class} of the {@link ApkSignaturePin} to trust
* @return boolean
* @throws {@link IllegalArgumentException} the class cannot be instantiated
*/
public boolean addTrustedSigner(Class<? extends ApkSignaturePin> cls) {
try {
Constructor<? extends ApkSignaturePin> constructor = cls.getConstructor();
return pinList.add((ApkSignaturePin) constructor.newInstance((Object[]) null));
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException(e);
}
}
/**
* Remove an APK signature from the trusted set.
*
* @param cls {@link Class} of the {@link ApkSignaturePin} to remove
*/
public boolean removeTrustedSigner(Class<? extends ApkSignaturePin> cls) {
for (ApkSignaturePin pin : pinList) {
if (pin.getClass().equals(cls)) {
return pinList.remove(pin);
}
}
return false;
}
/**
* Remove all {@link ApkSignaturePin}s from the trusted set.
*/
public boolean removeAllTrustedSigners() {
pinList.clear();
return pinList.isEmpty();
}
/**
* Check if a {@link ApkSignaturePin} is trusted.
*
* @param cls {@link Class} of the {@link ApkSignaturePin} to check
*/
public boolean isTrustedSigner(Class<? extends ApkSignaturePin> cls) {
for (ApkSignaturePin pin : pinList) {
if (pin.getClass().equals(cls)) {
return true;
}
}
return false;
}
public void checkTrustedSigner(String packageName)
throws NameNotFoundException, CertificateException {
PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
checkTrustedSigner(packageInfo.signatures);
}
public void checkTrustedSigner(PackageInfo packageInfo)
throws NameNotFoundException, CertificateException {
checkTrustedSigner(packageInfo.signatures);
}
public void checkTrustedSigner(Signature[] signatures)
throws NameNotFoundException, CertificateException {
if (signatures == null || signatures.length == 0)
throw new CertificateException("signatures cannot be null or empty!");
for (int i = 0; i < signatures.length; i++)
if (signatures[i] == null || signatures[i].toByteArray().length == 0)
throw new CertificateException("Certificates cannot be null or empty!");
// check whether the APK signer is trusted for all apps
for (ApkSignaturePin pin : pinList)
if (areSignaturesEqual(signatures, pin.getSignatures()))
return; // found a matching trusted APK signer
throw new CertificateException("APK signatures did not match!");
}
public boolean areSignaturesEqual(Signature[] sigs0, Signature[] sigs1) {
// TODO where is Android's implementation of this that I can just call?
if (sigs0 == null || sigs1 == null)
return false;
if (sigs0.length == 0 || sigs1.length == 0)
return false;
if (sigs0.length != sigs1.length)
return false;
for (int i = 0; i < sigs0.length; i++)
if (!sigs0[i].equals(sigs1[i]))
return false;
return true;
}
public void startActivity(Context context, Intent intent) throws CertificateException {
if (!isIntentSane(intent))
throw new ActivityNotFoundException("The intent was null or empty!");
String packageName = intent.getPackage();
if (TextUtils.isEmpty(packageName)) {
packageName = intent.getComponent().getPackageName();
intent.setPackage(packageName);
}
try {
checkTrustedSigner(packageName);
} catch (NameNotFoundException e) {
e.printStackTrace();
throw new ActivityNotFoundException(e.getLocalizedMessage());
}
context.startActivity(intent);
}
}
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M40,800L40,688Q40,654 57.5,625.5Q75,597 104,582Q166,551 230,535.5Q294,520 360,520Q426,520 490,535.5Q554,551 616,582Q645,597 662.5,625.5Q680,654 680,688L680,800L40,800ZM760,800L760,680Q760,636 735.5,595.5Q711,555 666,526Q717,532 762,546.5Q807,561 846,582Q882,602 901,626.5Q920,651 920,680L920,800L760,800ZM360,480Q294,480 247,433Q200,386 200,320Q200,254 247,207Q294,160 360,160Q426,160 473,207Q520,254 520,320Q520,386 473,433Q426,480 360,480ZM760,320Q760,386 713,433Q666,480 600,480Q589,480 572,477.5Q555,475 544,472Q571,440 585.5,401Q600,362 600,320Q600,278 585.5,239Q571,200 544,168Q558,163 572,161.5Q586,160 600,160Q666,160 713,207Q760,254 760,320ZM120,720L600,720L600,688Q600,677 594.5,668Q589,659 580,654Q526,627 471,613.5Q416,600 360,600Q304,600 249,613.5Q194,627 140,654Q131,659 125.5,668Q120,677 120,688L120,720ZM360,400Q393,400 416.5,376.5Q440,353 440,320Q440,287 416.5,263.5Q393,240 360,240Q327,240 303.5,263.5Q280,287 280,320Q280,353 303.5,376.5Q327,400 360,400ZM360,720L360,720L360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720Q360,720 360,720L360,720ZM360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Q360,320 360,320Z"/>
</vector>
@@ -37,12 +37,13 @@
android:layout_width="match_parent"
android:layout_height="250dp">
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/profile_drawable"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
android:layout_centerVertical="true"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
<com.avito.android.krop.KropView
android:id="@+id/krop_view"
@@ -110,7 +111,6 @@
android:hint="@string/issuer"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="5dp"
android:layout_weight="1">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/text_issuer"
@@ -119,20 +119,36 @@
android:layout_height="wrap_content"
android:inputType="text"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_outline_group_24"
app:tint="?attr/colorOnSurface"
android:layout_marginStart="5dp"
android:layout_marginEnd="15dp"
android:layout_gravity="center_vertical"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/text_group_layout"
android:hint="@string/group"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_weight="1"
android:hint="@string/group"
style="?attr/dropdownStyle">
<AutoCompleteTextView
android:id="@+id/dropdown_group"
android:layout_weight="1">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/text_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cursorVisible="false"
android:inputType="none"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -47,11 +47,12 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivOldImage"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center_vertical" />
android:layout_gravity="center_vertical"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
<ImageView
android:layout_width="32dp"
@@ -62,11 +63,12 @@
android:layout_marginEnd="15dp"
android:layout_gravity="center_vertical"/>
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivNewImage"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center_vertical" />
android:layout_gravity="center_vertical"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
<View
android:layout_width="0dp"
+6 -4
View File
@@ -34,14 +34,15 @@
android:layout_height="match_parent"
android:paddingStart="14dp">
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivTextDrawable"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerVertical="true"
android:layout_alignParentStart="true" />
android:layout_alignParentStart="true"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivSelected"
android:layout_width="60dp"
android:layout_height="60dp"
@@ -49,7 +50,8 @@
android:layout_centerVertical="true"
android:src="@drawable/item_selected"
android:visibility="gone"
app:civ_circle_background_color="?attr/colorPrimaryAlternative" />
android:background="?attr/colorPrimaryAlternative"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
</RelativeLayout>
<RelativeLayout
@@ -36,14 +36,15 @@
android:layout_height="match_parent"
android:paddingStart="12dp">
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivTextDrawable"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true" />
android:layout_centerVertical="true"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivSelected"
android:layout_width="45dp"
android:layout_height="45dp"
@@ -51,7 +52,8 @@
android:layout_centerVertical="true"
android:src="@drawable/item_selected"
android:visibility="gone"
app:civ_circle_background_color="?attr/colorPrimaryAlternative" />
android:background="?attr/colorPrimaryAlternative"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
</RelativeLayout>
<RelativeLayout
+6 -4
View File
@@ -36,14 +36,15 @@
android:layout_height="match_parent"
android:paddingStart="14dp">
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivTextDrawable"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_centerVertical="true"
android:layout_alignParentStart="true" />
android:layout_alignParentStart="true"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivSelected"
android:layout_width="45dp"
android:layout_height="45dp"
@@ -51,7 +52,8 @@
android:layout_centerVertical="true"
android:src="@drawable/item_selected"
android:visibility="gone"
app:civ_circle_background_color="?attr/colorPrimaryAlternative" />
android:background="?attr/colorPrimaryAlternative"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
</RelativeLayout>
<RelativeLayout
+9 -10
View File
@@ -46,14 +46,15 @@
android:layout_width="wrap_content"
android:layout_height="match_parent">
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivTextDrawable"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="6dp"
android:layout_alignParentStart="true" />
android:layout_alignParentStart="true"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
<de.hdodenhof.circleimageview.CircleImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivSelected"
android:layout_width="24dp"
android:layout_height="24dp"
@@ -61,14 +62,15 @@
android:layout_alignParentStart="true"
android:src="@drawable/item_selected"
android:visibility="gone"
app:civ_circle_background_color="?attr/colorPrimaryAlternative" />
android:background="?attr/colorPrimaryAlternative"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Aegis.ImageView.Circle" />
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_height="24dp"
android:id="@+id/description"
android:layout_toEndOf="@+id/layoutImage">
android:layout_toEndOf="@id/layoutImage">
<TextView
android:layout_width="wrap_content"
@@ -80,19 +82,16 @@
android:textSize="11sp"
android:ellipsize="end"
android:maxLines="1"/>
<TextView
android:id="@+id/profile_copied"
android:layout_width="wrap_content"
android:layout_below="@id/profile_issuer"
android:layout_height="wrap_content"
android:layout_below="@id/profile_issuer"
android:maxLines="1"
android:includeFontPadding="false"
android:visibility="invisible"
android:text="@string/copied"
android:textSize="9sp" />
<TextView
android:id="@+id/profile_account_name"
android:layout_width="wrap_content"
+93 -88
View File
@@ -1,96 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:paddingBottom="10dp"
android:paddingTop="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:text="@string/export_help" />
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginTop="15dp"
android:hint="@string/export_format_hint"
style="?attr/dropdownStyle">
<AutoCompleteTextView
android:id="@+id/dropdown_export_format"
android:orientation="vertical"
android:paddingBottom="10dp"
android:paddingTop="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none" />
</com.google.android.material.textfield.TextInputLayout>
<CheckBox
android:id="@+id/checkbox_export_encrypt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="5dp"
android:text="@string/export_encrypted"
android:checked="true" />
<TextView
android:id="@+id/text_separate_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginTop="5dp"
android:textStyle="italic"
android:text="@string/export_warning_password" />
<TextView
android:id="@+id/text_export_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginTop="5dp"
android:text="@string/export_warning_unencrypted"
android:textColor="?attr/colorError"
android:visibility="gone" />
<CheckBox
android:id="@+id/checkbox_accept"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="5dp"
android:text="@string/understand_risk_accept"
android:checked="false"
android:visibility="gone" />
<CheckBox
android:id="@+id/export_selected_groups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="5dp"
android:text="@string/export_all_groups"
android:checked="true"
android:visibility="gone" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/group_selection_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginTop="15dp"
android:hint="@string/export_choose_groups"
android:visibility="gone"
style="?attr/dropdownStyle">
<com.beemdevelopment.aegis.ui.components.DropdownCheckBoxes
android:id="@+id/group_selection_dropdown"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:text="@string/export_help" />
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:allow_filtering="false" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginTop="15dp"
android:hint="@string/export_format_hint"
style="?attr/dropdownStyle">
<AutoCompleteTextView
android:id="@+id/dropdown_export_format"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none" />
</com.google.android.material.textfield.TextInputLayout>
<CheckBox
android:id="@+id/checkbox_export_encrypt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="5dp"
android:text="@string/export_encrypted"
android:checked="true" />
<TextView
android:id="@+id/text_separate_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginTop="5dp"
android:textStyle="italic"
android:text="@string/export_warning_password" />
<TextView
android:id="@+id/text_export_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginTop="5dp"
android:text="@string/export_warning_unencrypted"
android:textColor="?attr/colorError"
android:visibility="gone" />
<CheckBox
android:id="@+id/checkbox_accept"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="5dp"
android:text="@string/understand_risk_accept"
android:checked="false"
android:visibility="gone" />
<CheckBox
android:id="@+id/export_selected_groups"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="5dp"
android:text="@string/export_all_groups"
android:checked="true"
android:visibility="gone" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/group_selection_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:layout_marginTop="15dp"
android:hint="@string/export_choose_groups"
android:visibility="gone"
style="?attr/dropdownStyle">
<com.beemdevelopment.aegis.ui.components.DropdownCheckBoxes
android:id="@+id/group_selection_dropdown"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:allow_filtering="false" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</ScrollView>
@@ -25,6 +25,47 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/addGroupInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:padding="8dp"
android:text="@string/no_group_selection"
app:layout_constraintTop_toBottomOf="@+id/text_title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:visibility="gone"/>
<LinearLayout
android:id="@+id/addGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
android:layout_marginTop="15dp"
android:background="?android:attr/selectableItemBackground"
android:gravity="center"
android:orientation="horizontal"
android:padding="8dp"
app:layout_constraintTop_toBottomOf="@+id/addGroupInfo"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:visibility="gone">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/new_group"
android:src="@drawable/ic_outline_add_24" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="@string/new_group"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
</LinearLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/scrollView"
android:layout_marginTop="15dp"
@@ -32,7 +73,7 @@
android:layout_height="0dp"
android:minWidth="150dp"
app:layout_constraintHeight_default="wrap"
app:layout_constraintTop_toBottomOf="@+id/text_title"
app:layout_constraintTop_toBottomOf="@+id/addGroup"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
File diff suppressed because it is too large Load Diff
+4 -3
View File
@@ -46,7 +46,6 @@
<string name="pref_account_name_position_title">اضهِر اسم الحساب</string>
<string name="pref_shared_issuer_account_name_title">اضهِر اسم الحساب فقط عند الضرورة</string>
<string name="pref_shared_issuer_account_name_summary">أضهِر أسماء الحسابات فقط عندما يشتركون نفس المصدر. سيتم إخفاء أسماء الحسابات الأخرى.</string>
<string name="pref_account_name_position_summary_override">تجاوز هذا الإعداد عن طريق وضع عرض البلاط. سيتم عرض اسم الحساب دائمًا أسفل المصدر.</string>
<string name="pref_import_file_title">استيراد من ملف</string>
<string name="pref_import_file_summary">استيراد الرموز من ملف</string>
<string name="pref_android_backups_title">النسخ الاحتياطية السحابية للأندرويد</string>
@@ -63,6 +62,7 @@
<string name="pref_backups_trigger_title">اصنع نسخة احتياطية</string>
<string name="pref_backups_trigger_summary">قم بعمل نسخة احتياطية يدويًّا</string>
<string name="pref_backups_versions_title">عدد الإصدارات المراد الاحتفاظ بها</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="zero">احتفظ ب%1$d إصدارات من النسخ الاحتياطية</item>
<item quantity="one">احتفظ بإصدار واحد من النسخ الاحتياطية</item>
@@ -71,6 +71,7 @@
<item quantity="many">احتفظ ب%1$d إصدارات من النسخ الاحتياطية</item>
<item quantity="other">احتفظ ب%1$d إصدارات من النسخ الاحتياطية</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">الاحتفاظ بعدد غير محدود من النُسخ الاحتياطية</string>
<string name="pref_import_app_title">استيراد من تطبيق</string>
<string name="pref_import_app_summary">استيراد الرموز من تطبيق (يتطلب الوصول إلى الجذر root)</string>
<string name="pref_export_title">تصدير</string>
@@ -131,7 +132,6 @@
<string name="event_unknown">نوع الحدث غير معروف</string>
<string name="today_at_time">اليوم على %1$s</string>
<string name="day_of_week_at_time">%1$s في %2$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">تشفير المخزن</string>
<string name="export_help">هذا الإجراء سيصدر المخزن خارج ذاكرة تخزين Aegis الداخلية. حدد الصيغة التي ترغب بأن يكون التصدير عليها:</string>
<string name="export_warning_unencrypted">أنت على وشك تصدير نسخة غير مشفرة من مخزن Aegis. <b>لا يُنصح بهذا</b>.</string>
@@ -334,8 +334,9 @@
<string name="no_tokens_can_be_imported">نتيجة لذلك، لا يمكن استيراد أي رموز</string>
<string name="unlocking_vault">يتم فتح قفل المخزن</string>
<string name="rename_group">إعادة تسمية المجموعة</string>
<string name="no_group_selection">إذا لم يكن الإدخال جزءا من أي مجموعة، يمكن العثور عليه تحت \"بلا مجموعة\".</string>
<string name="remove_group">إزالة المجموعة</string>
<string name="remove_group_description">هل ترغب حقًا في إزالة هذه المجموعة؟ ستتحول المدخلات في هذه المجموعة تلقائيًا إلى &quot;غير مجمّعة&quot;</string>
<string name="remove_group_description">هل ترغب حقًا في إزالة هذه المجموعة؟ ستتحول المدخلات في هذه المجموعة تلقائيًا إلى \'بلا مجموعة\'.</string>
<string name="remove_unused_groups">حذف المجموعات غير المستخدمة</string>
<string name="remove_unused_groups_description">هل أنت متأكد من أنك تريد حذف جميع المجموعات التي لم يتم تعيينها إلى إدخال؟</string>
<string name="remove_icon_pack">حذف حزمة الأيقونات</string>
+42 -32
View File
@@ -27,7 +27,7 @@
<string name="pref_section_security_title">Сигурност</string>
<string name="pref_section_security_summary">Настройки на шифроване, отключване с биометрични данни, автоматично заключване и други настройки за сигурност.</string>
<string name="pref_section_import_export_title">Внасяне и изнасяне</string>
<string name="pref_section_import_export_summary">Внасяне на резервни копия от Aegis или други приложения за удостоверяване. Ръчно изнасяне на трезора на Aegis.</string>
<string name="pref_section_import_export_summary">Внасяне на резервни копия от Aegis или други приложения за удостоверяване. Ръчно изнасяне на хранилището на Aegis.</string>
<string name="pref_section_audit_log_title">Одитен дневник</string>
<string name="pref_section_audit_log_summary">Списък с всички важни събития, докладвани от приложението.</string>
<string name="pref_section_backups_title">Резервни копия</string>
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Име на профила</string>
<string name="pref_shared_issuer_account_name_title">Показване на името на профила при необходимост</string>
<string name="pref_shared_issuer_account_name_summary">Показва имената на профилите само когато имат един и същ издател. Другите имена на профили ще бъдат скрити.</string>
<string name="pref_account_name_position_summary_override">Тази настройка е заменена от режима на изглед на плочки. Името на профила винаги ще се показва под издателя.</string>
<string name="pref_account_name_position_summary_override">Тази настройка е заменена от режима на изглед на плочки. Името на профила ще се показва под издателя.</string>
<string name="pref_import_file_title">Внасяне от файл</string>
<string name="pref_import_file_summary">Внасяне на кодове за защита от файл</string>
<string name="pref_android_backups_title">Облачни резервни копия на Андроид</string>
@@ -63,14 +63,16 @@
<string name="pref_backups_trigger_title">Създаване на резервно копие</string>
<string name="pref_backups_trigger_summary">Ръчно създава резервни копия</string>
<string name="pref_backups_versions_title">Брой версии, които трябва да се запазят</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Запазва се %1$d резервно копие</item>
<item quantity="other">Запазват се %1$d резервни копия</item>
</plurals>
<string name="pref_import_app_title">Импортиране от приложение</string>
<string name="pref_import_app_summary">Импортиране на токени от приложение (изисква root достъп)</string>
<string name="pref_backups_versions_infinite_summary">Пазене на неограничен брой архивни копия</string>
<string name="pref_import_app_title">Внасяне от приложение</string>
<string name="pref_import_app_summary">Внасяне на кодове за защита от приложение (изисква суперпотребител)</string>
<string name="pref_export_title">Изнасяне</string>
<string name="pref_export_summary">Изнасяне на трезора</string>
<string name="pref_export_summary">Изнасяне на хранилището</string>
<string name="pref_password_reminder_title">Припомняне на паролата</string>
<string name="pref_google_auth_export_title">Изнасяне за Google Authenticator</string>
<string name="pref_google_auth_export_descriptor">Създава кодове за QR, съвместими с Google Authenticator</string>
@@ -84,8 +86,8 @@
<string name="pref_secure_screen_title">Сигурност на екрана</string>
<string name="pref_secure_screen_summary">Блокирайте екранни снимки и други опити за заснемане на екрана в приложението</string>
<string name="pref_tap_to_reveal_title">Показване при докосване</string>
<string name="pref_tap_to_reveal_summary">Токените ще бъдат скрити по подразбиране. Докоснете токените, за да разкриете кода.</string>
<string name="pref_tap_to_reveal_time_title">Време за изчакване, за да се разкрие</string>
<string name="pref_tap_to_reveal_summary">Кодовете за защита ще бъдат скрити по подразбиране. Докоснете елемент от списъка, за да се покаже кода.</string>
<string name="pref_tap_to_reveal_time_title">Период на показване при докосване</string>
<string name="pref_auto_lock_title">Авт. заключване</string>
<string name="pref_auto_lock_summary">Когато %s</string>
<string name="pref_auto_lock_summary_disabled">Изключен</string>
@@ -99,14 +101,20 @@
<string name="pref_backup_password_change_title">Промяна на паролата за резервни копия и изнасяне</string>
<string name="pref_backup_password_change_summary">Задава нова парола за шифроване на хранилището при създаване на резервни копия и изнасяне.</string>
<string name="pref_encryption_title">Шифроване</string>
<string name="pref_encryption_summary">Шифроване на хранилището, отключване с парола или биометрични нанни</string>
<string name="pref_encryption_summary">Шифроване на хранилището, отключване с парола или биометрични данни</string>
<string name="pref_biometrics_title">Отключване с биометрични данни</string>
<string name="pref_biometrics_summary">Разрешава удостоверяване с биометрични данни, за отключване на хранилището</string>
<string name="pref_search_behavior_summary">Търсене в: %s</string>
<string name="pref_search_behavior_prompt">Търсене в следните полета</string>
<string name="pref_search_behavior_type_name">Име</string>
<string name="pref_search_behavior_type_issuer">Издател</string>
<string name="pref_search_behavior_type_note">Бележка</string>
<string name="pref_search_behavior_type_groups">Групи</string>
<string name="pref_set_password_title">Смяна на паролата</string>
<string name="pref_set_password_summary">Задайте нова парола, която ще ви трябва, за да отключите трезора си</string>
<string name="pref_set_password_summary">Задайте нова парола, с която да отключвате хранилището</string>
<string name="no_events_title">Не са докладвани събития</string>
<string name="no_events_description">Няма важни събития, докладвани от приложението</string>
<string name="event_title_vault_unlocked">Отключено е хранилище</string>
<string name="event_title_vault_unlocked">Хранилището е отключено</string>
<string name="event_description_vault_unlocked">Хранилището успешно е отключено</string>
<string name="event_title_backup_created">Създадено е резервно копие</string>
<string name="event_description_backup_created">Резервно копие на хранилището успешно е създадено</string>
@@ -116,17 +124,17 @@
<string name="event_description_vault_exported">Копие на хранилището е изнесено</string>
<string name="event_title_entry_shared">Споделен е запис</string>
<string name="event_description_entry_shared">Запис е споделен</string>
<string name="event_title_vault_unlock_failed_password">Неуспешно отключване на хранилище (парола)</string>
<string name="event_title_vault_unlock_failed_password">Неуспешно отключване на хранилището (парола)</string>
<string name="event_description_vault_unlock_failed_password">Опит за отключване на хранилището с парола е неуспешен</string>
<string name="event_title_vault_unlock_failed_biometrics">Неуспешно отключване на хранилище (биометрични данни)</string>
<string name="event_title_vault_unlock_failed_biometrics">Неуспешно отключване на хранилището (биометрични данни)</string>
<string name="event_description_vault_unlock_failed_biometrics">Опит за отключване на хранилището с биометрични данни е неуспешен</string>
<string name="event_unknown">Неизвестен вид събитие</string>
<string name="audit_log_entry_deleted">(премахнато)</string>
<string name="today_at_time">Днес в %1$s</string>
<string name="day_of_week_at_time">%1$s в %2$s</string>
<string name="date_format">dd.MM.yyyy</string>
<string name="export_encrypted">Шифровайте трезора</string>
<string name="export_help">По този начин ще бъде изнесен трезора на Aegis от вътрешното хранилище. Изберете формата на данните, в който искате да бъдат изнесени:</string>
<string name="export_warning_unencrypted">На път сте да изнесете нешифровано копие на трезора на Aegis. <b>Това е силно непрепоръчително</b>.</string>
<string name="export_encrypted">Шифроване на хранилището</string>
<string name="export_help">По този начин ще бъде изнесено хранилището на Aegis от вътрешната памет. Изберете формата на данните, в който искате да бъдат изнесени:</string>
<string name="export_warning_unencrypted">На път сте да изнесете нешифровано копие на хранилището на Aegis. <b>Това е силно непрепоръчително</b>.</string>
<string name="export_warning_password">Изнасяните данни се шифроват с отделна парола, която се задава в раздел Сигурност.</string>
<string name="understand_risk_accept">Разбирам риска</string>
<string name="export_format_aegis">Aegis (.JSON)</string>
@@ -142,26 +150,26 @@
<string name="export_no_groups_selected">Не са избрани групи, които да бъдат изнесени</string>
<string name="export_html_title" comment="The title of an HTML export document">Изнесени данни от Aegis Authenticator</string>
<string name="choose_authentication_method">Сигурност</string>
<string name="authentication_method_explanation">Aegis е 2FA приложение, фокусирано върху сигурността. Токените се съхраняват в трезор, който по желание може да бъде шифрован с избрана от вас парола. Ако нападател получи вашия шифрован файл на трезора, той няма да може да осъществи достъп до съдържанието, без да знае паролата. \n\nПодбрахме опцията, която според нас най-добре пасва на вашето устройство.</string>
<string name="authentication_method_explanation">Aegis е 2FA приложение, фокусирано върху сигурността. Кодовете за защита се пазят в хранилище, което по желание може да бъде шифровано с избрана от вас парола. Ако нападател получи шифрования файл на хранилището, той няма да може да осъществи достъп до съдържанието му, без паролата. \n\nПодбрахме стойността, която според нас най-добре пасва на устройството.</string>
<string name="authentication_method_none">Нищо</string>
<string name="authentication_method_none_description">За отключване на трезора не е необходима парола, следователно той няма да бъде шифрован. <b>Тази опция не се препоръчва</b>.</string>
<string name="authentication_method_none_description">За отключване на хранилището не е необходима парола и то няма да бъде шифровано. <b>Това е силно непрепоръчително</b>.</string>
<string name="authentication_method_password">Парола</string>
<string name="authentication_method_password_description">За отключване на трезора е необходима парола.</string>
<string name="authentication_method_password_explanation">Предупреждение: Ако забравите паролата си, ще загубите трайно достъп до вашите токени. Няма начин да ги възстановите без паролата.</string>
<string name="authentication_method_password_description">Хранилището се отключва с парола.</string>
<string name="authentication_method_password_explanation">Предупреждение: Ако забравите паролата си, ще загубите трайно достъп до кодовете за защита. Няма начин да ги възстановите без паролата.</string>
<string name="authentication_method_biometrics">Биометрични данни</string>
<string name="authentication_method_biometrics_description">В допълнение към парола, биометрични данни, регистрирани на това устройство, като пръстов отпечатък или лицето Ви, могат да се използват за отключване на трезора.</string>
<string name="authentication">Отключете трезора</string>
<string name="authentication_multiline" comment="The newline in the middle is used for aesthetic purposes">Отключете\nтрезора</string>
<string name="authentication_method_biometrics_description">В допълнение към паролата, биометрични данни, регистрирани на това устройство, като пръстов отпечатък или лицето ви, могат да се използват за отключване на хранилището.</string>
<string name="authentication">Отключване на хранилище</string>
<string name="authentication_multiline" comment="The newline in the middle is used for aesthetic purposes">Отключете\nхранилището</string>
<string name="auth_use_biometrics">Или докоснете тук, за да използвате <font fgcolor="#FF0D86C1">биометрични данни</font></string>
<string name="set_password">Моля въведете парола</string>
<string name="set_group">Моля, въведете име на групата</string>
<string name="set_number">Моля въведете номер</string>
<string name="set_number">Въведете число</string>
<string name="set_password_confirm">Моля, потвърдете паролата</string>
<string name="invalid_password">Паролата е неправилна</string>
<string name="invalidated_biometrics">Установена е промяна в настройките за защита на устройството. Посетете „Aegis -&gt; Настройки -&gt; Сигурност -&gt; Биометрично отключване“, изключете и отново включете биометричното отключване.</string>
<string name="password_reminder">Въведете паролата си. Понякога искаме от вас да я въвеждате, за да не я забравите.</string>
<string name="password_reminder_dialog_title">Отключване с биометрични данни по подразбиране</string>
<string name="password_reminder_dialog_message">Понякога искаме да въведете паролата си, за да не я забравите и така да останете без достъп до трезора. След като я въведете един път, Aegis отново ще използва биометрични данни при отключване, докато не дойде време отново да си припомните паролата.</string>
<string name="password_reminder_dialog_message">Понякога искаме от вас да въвеждате паролата си, за да не я забравите и така да останете без достъп до хранилището. След като я въведете веднъж Aegis отново ще използва биометрични данни при отключване, докато не дойде време отново да си припомните паролата.</string>
<string name="password_reminder_freq_never">Никога</string>
<string name="password_reminder_freq_weekly">Веднъж седмично</string>
<string name="password_reminder_freq_biweekly">Веднъж на две седмици</string>
@@ -274,7 +282,7 @@
<string name="file_not_found">Грешка: Файлът не е намерен</string>
<string name="reading_file_error">Грешка при прочитане на файла</string>
<string name="app_lookup_error">Грешка: Приложението не е инсталирано</string>
<string name="app_version_error">Инсталираното издание на %s не се поддържа. В последните издания някои от файловете, необходимите при внасяне са шифровани и недостъпни за Aegis. Евентуален опит за внасяне би довел до грешка. Искате ли да продължите въпреки това?</string>
<string name="app_version_error">Инсталираното издание на %s не се поддържа. В последните издания някои от файловете, необходими при внасяне са шифровани и недостъпни за Aegis. Евентуален опит за внасяне би довел до грешка. Желаете ли въпреки това да продължите?</string>
<string name="root_error">Грешка: неуспешнополучаване на достъп до правата на суперпотребителя</string>
<plurals name="imported_entries_count">
<item quantity="one">%d запис е внесен</item>
@@ -294,14 +302,15 @@
<string name="read_qr_error">Грешка при разчитане на QR кода</string>
<string name="read_qr_error_phonefactor">Приложението Aegis е съвместимо със собственическия алгоритъм за 2FA на Microsoft. Не забравяйте да изберете „Настройка на приложение без известия“, когато настройвате 2FA в Office 365.</string>
<string name="partial_google_auth_import">Установени са частично изнасени данни за Google Authenticator</string>
<string name="partial_google_auth_import_warning">Няколко QR кода не са внесени. Следните кодове липсват:\n\n<b>%s</b>\n\nМожете да продължите с частично внесените данни, но е препоръчително да направите нов опит с всички QR кодове без да рискувате загуба на кодове за достъп.</string>
<string name="partial_google_auth_import_warning">Няколко QR кода не са внесени. Следните кодове липсват:\n\n<b>%s</b>\n\nМожете да продължите с частично внесените данни, но е препоръчително да направите нов опит с всички QR кодове без да рискувате загуба на кодове за защите.</string>
<string name="missing_qr_code_descriptor">• QR код %d</string>
<string name="import_partial_export_anyway">Внасяне на %d кода за достъп въпреки това</string>
<string name="import_google_auth_failure">Грешка при внасяне към Google Authenticator</string>
<string name="unrelated_google_auth_batches_error">Изнесеното съдържа части от несвързана порция кодове. Внасяйте всяка порция поотделно.</string>
<string name="no_tokens_can_be_imported">Като резултат не са внесени кодове за достъп</string>
<string name="no_tokens_can_be_imported">Като резултат не са внесени кодове за защита</string>
<string name="unlocking_vault">Отключване на хранилището</string>
<string name="rename_group">Преименуване на група</string>
<string name="no_group_selection">Ако запис не принадлежи към никоя група, може да бъде намерен в „Без група“.</string>
<string name="remove_group">Премахване на група</string>
<string name="remove_group_description">Наистина ли искате да премахнете тази група? Записите в нея ще бъдат преместени в групата „Без група“.</string>
<string name="remove_unused_groups">Премахване на неизползваните групи</string>
@@ -337,9 +346,10 @@
<string name="pref_highlight_entry_summary">Прави записите в списъка по-лесни за различаване един от друг, като при докосване временно ги осветява</string>
<string name="pref_minimize_on_copy_title">Свиване при копиране</string>
<string name="pref_minimize_on_copy_summary">Приложението се свива при копиране на код за достъп</string>
<string name="pref_copy_behavior_title">Копиране на кодове за достъп в междинната памет</string>
<string name="pref_copy_behavior_title">Копиране на кодове за защита в междинната памет</string>
<string name="pref_search_behavior_title">Начин на търсене</string>
<string name="pref_pause_entry_title">Замразяване на запис при докосване</string>
<string name="pref_pause_entry_summary">Спира автоматичното опресняване на кодовете когато са избрани. Необходимо е да е включено или „Осветяване на запис при докосване“, или „Показване при докосване“.</string>
<string name="pref_pause_entry_summary">Спира автоматичното опресняване на кодовете след докосване. Необходимо е да е включено или „Осветяване на запис при докосване“, или „Показване при докосване“.</string>
<string name="pin_keyboard_description">За да бъде показана цифровата клавиатура въведете паролата си. Имайте предвид, че това е удачно само ако вашата парола се състои само от цифри</string>
<string name="pin_keyboard_error">Грешка при задаване на цифрова клавиатура</string>
<string name="pin_keyboard_error_description">Не е възможно да зададете цифрова клавиатура. Паролата ви трябва да се състои само от цифри.</string>
@@ -416,7 +426,7 @@
<string name="backup_reminder_bar_dialog_accept">Настройки на резервни копия</string>
<string name="backup_plaintext_export_warning"><b>Хранилището е било изнесено в чист текст</b></string>
<string name="pref_show_plaintext_warning_hint">Без повторно показване на предупреждението</string>
<string name="backup_plaintext_warning_explanation">Скоро е правено нешифровано резервно копие на хранилището. С оглед сигурността на кодовете за достъп е препоръчително да изтриете нешифрования файл след като вече не е необходим.</string>
<string name="backup_plaintext_warning_explanation">Скоро е правено нешифровано резервно копие на хранилището. С оглед сигурността на кодовете за защита е препоръчително да изтриете нешифрования файл след като вече не е необходим.</string>
<string name="switch_camera">Смяна на камера</string>
<string name="empty_list">Няма кодове, които да бъдат показани. Добавете записи от бутона със знак плюс в долния десен ъгъл</string>
<string name="empty_list_title">Не са открити записи</string>
@@ -461,7 +471,7 @@
<string name="dialog_wipe_entries_checkbox">Изпразване на хранилището</string>
<string name="panic_trigger_ignore_toast">Aegis получи сигнал за тревога, но настройката е изключена, пренебрегване на сигнала</string>
<string name="pref_panic_trigger_title">Изтриване на хранилището при сигнал за тревога</string>
<string name="pref_panic_trigger_summary">Изтрива хранилището, когато от Ripple се получи сигнал за тревога</string>
<string name="pref_panic_trigger_summary">Изтрива хранилището, когато от Ripple е получен сигнал за тревога</string>
<string name="import_vault">Внасяне на хранилище на Aegis</string>
<string name="import_vault_hint">Искате да внесете от друго приложение за 2FA? Завършете помощника и посетете меню Настройки.</string>
<plurals name="import_duplicate_toast">
+12 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Mostra el nom del compte</string>
<string name="pref_shared_issuer_account_name_title">Mostra el nom del compte només quan sigui necessari</string>
<string name="pref_shared_issuer_account_name_summary">Mostra el nom de compte només quan es comparteixi el mateix emissor. Altres noms de compte estaran ocults.</string>
<string name="pref_account_name_position_summary_override">S\'omet aquesta configuració en usar la visualització en mosaic. Els noms de compte es mostraran sempre a sota de l\'emissor.</string>
<string name="pref_account_name_position_summary_override">S\'omet aquesta configuració en usar la visualització en mosaic. Els noms de compte es mostraran a sota de l\'emissor.</string>
<string name="pref_import_file_title">Importa des d\'un fitxer</string>
<string name="pref_import_file_summary">Importar fitxes des d\'un fitxer</string>
<string name="pref_android_backups_title">Copies al núvol d\'Android</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">Disparador de còpia</string>
<string name="pref_backups_trigger_summary">Llançar còpia manualment</string>
<string name="pref_backups_versions_title">Nombre de versions a mantenir</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Mantindre %1$d versions a la còpia</item>
<item quantity="other">Mantindre %1$d versions a la còpia</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Mantén un nombre infinit de versions de la còpia de seguretat</string>
<string name="pref_import_app_title">Importar des d\'app</string>
<string name="pref_import_app_summary">Importar fitxes des d\'una aplicació (cal root)</string>
<string name="pref_export_title">Exporta</string>
@@ -102,6 +104,12 @@
<string name="pref_encryption_summary">Xifra la caixa forta i desbloqueja-la amb contrasenya o biomètrics</string>
<string name="pref_biometrics_title">Desbloqueig biomètric</string>
<string name="pref_biometrics_summary">Permet l\'autenticació biomètrica per a desbloquejar la caixa forta</string>
<string name="pref_search_behavior_summary">Busca a: %s</string>
<string name="pref_search_behavior_prompt">Buscar en qualsevol d\'aquests camps</string>
<string name="pref_search_behavior_type_name">Nom</string>
<string name="pref_search_behavior_type_issuer">Emissor</string>
<string name="pref_search_behavior_type_note">Nota</string>
<string name="pref_search_behavior_type_groups">Grups</string>
<string name="pref_set_password_title">Canvia la contrasenya</string>
<string name="pref_set_password_summary">Defineix una nova contrasenya per a desbloquejar la caixa forta</string>
<string name="no_events_title">Cap esdeveniment registrat</string>
@@ -121,9 +129,9 @@
<string name="event_title_vault_unlock_failed_biometrics">No s\'ha pogut desbloquejar la volta (dades biomètriques)</string>
<string name="event_description_vault_unlock_failed_biometrics">Hi ha hagut un intent de desbloquejar la volta amb dades biomètriques incorrectes</string>
<string name="event_unknown">Tipus d\'esdeveniment desconegut</string>
<string name="audit_log_entry_deleted">(esborrat)</string>
<string name="today_at_time">Avui a les %1$s</string>
<string name="day_of_week_at_time">%1$s a les %2$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">Xifra la caixa forta</string>
<string name="export_help">Això exportarà la caixa forta fora d\'Aegis. Tria el format en el que s\'ha d\'exportar:</string>
<string name="export_warning_unencrypted">Això exportarà una còpia sense xifrar de la caixa forta d\'Aegis. <b>No recomanat</b>.</string>
@@ -302,6 +310,7 @@
<string name="no_tokens_can_be_imported">Com a resultat, no es poden importar tokens</string>
<string name="unlocking_vault">Desbloquejant la caixa forta</string>
<string name="rename_group">Canvia el nom del grup</string>
<string name="no_group_selection">Si una entrada no pertany a cap grup, es podrà trobar a \"Sense grup\".</string>
<string name="remove_group">Elimina el grup</string>
<string name="remove_group_description">Segur que vols eliminar aquest grup? Les entrades canviaran automàticament a \"Sense grup\".</string>
<string name="remove_unused_groups">Esborrar grups no utilitzats</string>
@@ -338,6 +347,7 @@
<string name="pref_minimize_on_copy_title">Minimitzar al copiar</string>
<string name="pref_minimize_on_copy_summary">Minimitzar l\'aplicació després de copiar una fitxa</string>
<string name="pref_copy_behavior_title">Copia les fitxes al porta-retalls</string>
<string name="pref_search_behavior_title">Comportament de la cerca</string>
<string name="pref_pause_entry_title">Congela la fitxa al tocar</string>
<string name="pref_pause_entry_summary">Pausa l\'actualització automàtica de la fitxa al tocar-la. No s\'actualitzará mentre estigui marcada. Cal tenir \"Il·lumina les fitxes al tocar\" o \"Toca per a mostrar\".</string>
<string name="pin_keyboard_description">Introdueix la teva contrasenya per a activar el teclat PIN. Això només funcionarà si la contrasenya només té dígits</string>
+13 -3
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Zobrazit název účtu</string>
<string name="pref_shared_issuer_account_name_title">Název účtu zobrazit pouze v případě potřeby</string>
<string name="pref_shared_issuer_account_name_summary">Názvy účtů zobrazit pouze, pokud mají stejného poskytovatele. Ostatní názvy účtů budou skryty.</string>
<string name="pref_account_name_position_summary_override">Toto nastavení je přepsáno režimem zobrazení názvů. Název účtu bude vždy zobrazen pod poskytovatelem.</string>
<string name="pref_account_name_position_summary_override">Toto nastavení je přepsáno režimem zobrazení dlaždic. Název účtu bude zobrazen pod poskytovatelem.</string>
<string name="pref_import_file_title">Importovat ze souboru</string>
<string name="pref_import_file_summary">Importovat tokeny ze souboru</string>
<string name="pref_android_backups_title">Cloudové zálohování systému Android</string>
@@ -63,12 +63,14 @@
<string name="pref_backups_trigger_title">Spustit zálohování</string>
<string name="pref_backups_trigger_summary">Ručně spustit zálohování</string>
<string name="pref_backups_versions_title">Počet verzí k uchování</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Uchovat %1$d verzi zálohy</item>
<item quantity="few">Uchovat %1$d verze zálohy</item>
<item quantity="many">Uchovat %1$d verzí zálohy</item>
<item quantity="other">Uchovat %1$d verzí zálohy</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Ponechat nekonečný počet verzí zálohy</string>
<string name="pref_import_app_title">Importovat z aplikace</string>
<string name="pref_import_app_summary">Importovat tokeny z aplikace (vyžaduje root přístup)</string>
<string name="pref_export_title">Exportovat</string>
@@ -106,6 +108,12 @@
<string name="pref_encryption_summary">Šifrovat trezor a odemykat jej pomocí hesla, nebo biometrie</string>
<string name="pref_biometrics_title">Biometrické odemknutí</string>
<string name="pref_biometrics_summary">Povolit biometrické ověření pro odemčení trezoru</string>
<string name="pref_search_behavior_summary">Hledat v: %s</string>
<string name="pref_search_behavior_prompt">Hledat ve kterémkoli z následujících polí</string>
<string name="pref_search_behavior_type_name">Název</string>
<string name="pref_search_behavior_type_issuer">Vydavatel</string>
<string name="pref_search_behavior_type_note">Poznámka</string>
<string name="pref_search_behavior_type_groups">Skupiny</string>
<string name="pref_set_password_title">Změnit heslo</string>
<string name="pref_set_password_summary">Nastavení nového hesla potřebného pro odemčení trezoru</string>
<string name="no_events_title">Žádné nahlášené události</string>
@@ -125,9 +133,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Odemčení trezoru selhalo (biometrika)</string>
<string name="event_description_vault_unlock_failed_biometrics">Pokus o odemknutí trezoru pomocí biometriky se nezdařil</string>
<string name="event_unknown">Neznámý typ události</string>
<string name="audit_log_entry_deleted">(odstraněno)</string>
<string name="today_at_time">Dnes v %1$s</string>
<string name="day_of_week_at_time">%1$s v %2$s</string>
<string name="date_format">dd. MM. yyyy</string>
<string name="export_encrypted">Šifrovat trezor</string>
<string name="export_help">Trezor bude exportován mimo vnitřní úložiště Aegis. Zvolte formát, ve kterém chcete trezor exportovat:</string>
<string name="export_warning_unencrypted">Chystáte se exportovat nešifrovanou kopii vašeho Aegis trezoru. Toto <b>není doporučeno</b>.</string>
@@ -318,6 +326,7 @@
<string name="no_tokens_can_be_imported">Nebyly importovány žádné tokeny</string>
<string name="unlocking_vault">Odemykání trezoru</string>
<string name="rename_group">Přejmenovat skupinu</string>
<string name="no_group_selection">Pokud není záznam součástí žádné skupiny, najdete jej v kategorii „Žádná skupina“.</string>
<string name="remove_group">Odstranit skupinu</string>
<string name="remove_group_description">Opravdu chcete odstranit tuto skupinu? Záznamy z ní budou automaticky přemístěny do „Žádná skupina“.</string>
<string name="remove_unused_groups">Odstranit nepoužívané skupiny</string>
@@ -354,6 +363,7 @@
<string name="pref_minimize_on_copy_title">Minimalizovat při kopírování</string>
<string name="pref_minimize_on_copy_summary">Minimalizovat aplikaci po zkopírování tokenu</string>
<string name="pref_copy_behavior_title">Zkopírovat tokeny do schránky</string>
<string name="pref_search_behavior_title">Chování vyhledávání</string>
<string name="pref_pause_entry_title">Zmrazit tokeny po klepnutí</string>
<string name="pref_pause_entry_summary">Pozastavit automatické obnovování tokenů klepnutím na ně. Tokeny nebudou aktualizovány, dokud jsou zaměřeny. Vyžaduje \"Zvýraznit tokeny po klepnutí\" nebo \"Klepnutím zobrazit\".</string>
<string name="pin_keyboard_description">Zadejte své heslo pro povolení PIN klávesnice. Toto funguje jen pokud používáte číselné heslo.</string>
@@ -369,7 +379,7 @@
<string name="normal_viewmode_title">Normální</string>
<string name="compact_mode_title">Kompaktní</string>
<string name="small_mode_title">Malý</string>
<string name="tiles_mode_title">Názvy</string>
<string name="tiles_mode_title">Dlaždice</string>
<string name="unknown_issuer">Neznámý poskytovatel</string>
<string name="unknown_account_name">Neznámý název účtu</string>
<plurals name="import_error_dialog">
+11 -1
View File
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">Udløs sikkerhedskopiering</string>
<string name="pref_backups_trigger_summary">Udløs manuelt en sikkerhedskopiering</string>
<string name="pref_backups_versions_title">Antal versioner at beholde</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Behold %1$d version af sikkerhedskopien</item>
<item quantity="other">Behold %1$d versioner af sikkerhedskopien</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Opbevar et uendeligt antal versioner af sikkerhedskopien</string>
<string name="pref_import_app_title">Import fra app</string>
<string name="pref_import_app_summary">Importér tokens fra en app (kræver root-adgang)</string>
<string name="pref_export_title">Export</string>
@@ -102,6 +104,12 @@
<string name="pref_encryption_summary">Kryptér og oplås Boksen med adgangskode/biometri</string>
<string name="pref_biometrics_title">Biometrisk oplåsning</string>
<string name="pref_biometrics_summary">Tillad biometrisk godkendelse for at oplåse Boksen</string>
<string name="pref_search_behavior_summary">Søg gennem: %s</string>
<string name="pref_search_behavior_prompt">Søg i ethvert af de flg. felter</string>
<string name="pref_search_behavior_type_name">Navn</string>
<string name="pref_search_behavior_type_issuer">Udsteder</string>
<string name="pref_search_behavior_type_note">Notat</string>
<string name="pref_search_behavior_type_groups">Grupper</string>
<string name="pref_set_password_title">Skift adgangskode</string>
<string name="pref_set_password_summary">Sæt ny adgangskode til brug for oplåsning af din Boks</string>
<string name="no_events_title">Ingen rapporterede hændelser</string>
@@ -121,9 +129,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Boksoplåsning mislykkedes (biometri)</string>
<string name="event_description_vault_unlock_failed_biometrics">Et boksoplåsningsforsøg med biometri mislykkedes</string>
<string name="event_unknown">Ukendt hændelsestype</string>
<string name="audit_log_entry_deleted">(slettet)</string>
<string name="today_at_time">I dag kl. %1$s</string>
<string name="day_of_week_at_time">%1$s kl. %2$s</string>
<string name="date_format">dd-MM-yyyy</string>
<string name="export_encrypted">Kryptér boksen</string>
<string name="export_help">Denne handling eksporterer Boksen ud af Aegis\' interne lager. Vælg det format Boksen skal eksportere som:</string>
<string name="export_warning_unencrypted">Du er ved at eksportere en ukrypteret kopi af din Aegis-boks. <b>Dette er ikke anbefalet</b>.</string>
@@ -302,6 +310,7 @@
<string name="no_tokens_can_be_imported">Som konsekvens, kan ingen tokener importeres</string>
<string name="unlocking_vault">Låser boksen op</string>
<string name="rename_group">Omdøb gruppe</string>
<string name="no_group_selection">Er en post ikke en del af en gruppe, kan den findes under \"Ingen gruppe\".</string>
<string name="remove_group">Fjern gruppe</string>
<string name="remove_group_description">Sikker på, at denne gruppe skal fjernes? Poster heri vil automatisk skifte til \'Ingen gruppe\'.</string>
<string name="remove_unused_groups">Slet ubrugte grupper</string>
@@ -338,6 +347,7 @@
<string name="pref_minimize_on_copy_title">Minimér under kopiering</string>
<string name="pref_minimize_on_copy_summary">Minimér appen efter kopiering af et token</string>
<string name="pref_copy_behavior_title">Kopiér tokener til udklipsholder</string>
<string name="pref_search_behavior_title">Søgeadfærd</string>
<string name="pref_pause_entry_title">Frys tokener ved tryk</string>
<string name="pref_pause_entry_summary">Pausér automatisk opdatering af tokener ved at trykke på dem. Tokener opdateres ikke, så længe de er fokuseret. Kræver \"Fremhæv tokener ved tryk\" eller \"Tryk for at vise\".</string>
<string name="pin_keyboard_description">Angiv adgangskoden for at aktivere PIN-tastaturet. Bemærk, at dette kun virker, såfremt adgangskoden alene består af cifre</string>
+31 -21
View File
@@ -6,7 +6,7 @@
<string name="action_transfer">Übertragen</string>
<string name="action_edit_icon">Symbol bearbeiten</string>
<string name="action_reset_usage_count">Verwendungszähler zurücksetzen</string>
<string name="action_reset_usage_count_dialog">Anzahl der Verwendungen dieses Eintrags auf 0 setzen?</string>
<string name="action_reset_usage_count_dialog">Den Verwendungszähler dieses Eintrags auf 0 setzen?</string>
<string name="action_default_icon">Standardsymbol wiederherstellen</string>
<string name="discard">Verwerfen</string>
<string name="save">Speichern</string>
@@ -26,12 +26,12 @@
<string name="pref_section_appearance_summary">Das Design, die Sprache und andere Einstellungen anpassen, die das Erscheinungsbild der App betreffen.</string>
<string name="pref_section_security_title">Sicherheit</string>
<string name="pref_section_security_summary">Verschlüsselung, biometrisches Entsperren, automatisches Sperren und andere Sicherheitseinstellungen konfigurieren.</string>
<string name="pref_section_import_export_title">Importieren &amp; exportieren</string>
<string name="pref_section_import_export_title">Importieren und exportieren</string>
<string name="pref_section_import_export_summary">Sicherungskopien von Aegis oder anderen Authentifizierungs-Apps importieren und Exportdateien der Aegis-Datenbank erstellen.</string>
<string name="pref_section_audit_log_title">Überwachungsprotokoll</string>
<string name="pref_section_audit_log_summary">Hier findest du eine Liste aller wichtigen Ereignisse, die innerhalb der App registriert wurden.</string>
<string name="pref_section_audit_log_title">Audit-Log</string>
<string name="pref_section_audit_log_summary">Liste aller wichtigen Ereignisse, die innerhalb der App registriert wurden.</string>
<string name="pref_section_backups_title">Sicherungen</string>
<string name="pref_section_backups_summary">Automatisierte Sicherungen an einem Speicherort deiner Wahl oder das Verwenden des Cloud-Sicherungssystems von Android einrichten.</string>
<string name="pref_section_backups_summary">Automatisierte Sicherungen zu einem gewünschten Speicherort einrichten oder das Android-eigenen Cloud-Sicherungssystems aktivieren.</string>
<string name="pref_section_icon_packs">Symbolpakete</string>
<string name="pref_section_icon_packs_summary">Symbolpakete verwalten und importieren.</string>
<string name="pref_select_theme_title">Design</string>
@@ -44,9 +44,9 @@
<string name="pref_code_group_size_title">Zifferngruppierung</string>
<string name="pref_code_group_size_summary">Anzahl der Ziffern für das Gruppieren von Codes festlegen</string>
<string name="pref_account_name_position_title">Kontonamen anzeigen</string>
<string name="pref_shared_issuer_account_name_title">Kontonamen nur anzeigen, wenn notwendig</string>
<string name="pref_shared_issuer_account_name_title">Kontonamen nur bei Bedarf anzeigen</string>
<string name="pref_shared_issuer_account_name_summary">Kontonamen nur anzeigen, wenn sie denselben Herausgeber haben. Andere Kontonamen werden ausgeblendet.</string>
<string name="pref_account_name_position_summary_override">Diese Einstellung wird durch die Kachelansicht überschrieben. Kontonamen werden immer unterhalb des Herausgebers angezeigt.</string>
<string name="pref_account_name_position_summary_override">Diese Einstellung wird durch die Kachelansicht überschrieben. Der Kontoname wird unterhalb des Herausgebers angezeigt.</string>
<string name="pref_import_file_title">Aus Datei importieren</string>
<string name="pref_import_file_summary">Token aus einer Datei importieren</string>
<string name="pref_android_backups_title">Cloud-Sicherungen von Android</string>
@@ -58,15 +58,17 @@
<string name="pref_backups_reminder_summary">Erinnerung zur Sicherung der Datenbank anzeigen, falls die letzten Änderungen nicht gesichert wurden.</string>
<string name="pref_backups_reminder_dialog_title">Erinnerung für Sicherungen deaktivieren</string>
<string name="pref_backups_reminder_dialog_summary">Das Deaktivieren dieser Erinnerung bedeutet, dass Aegis nicht mitteilt, ob Änderungen vorgenommen wurden, die noch nicht gesichert sind. Dadurch besteht die Gefahr, dass der Zugriff auf deine Token verloren geht. Möchtest du die Erinnerung wirklich deaktivieren?</string>
<string name="pref_backups_location_title">Ordner für Sicherungsdateien</string>
<string name="pref_backups_location_title">Sicherungsverzeichnis</string>
<string name="pref_backups_location_summary">Sicherungskopien werden gespeichert in</string>
<string name="pref_backups_trigger_title">Sicherungskopie auslösen</string>
<string name="pref_backups_trigger_title">Sicherung auslösen</string>
<string name="pref_backups_trigger_summary">Manuell eine Sicherung auslösen</string>
<string name="pref_backups_versions_title">Anzahl der zu behaltenden Versionen</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">%1$d Version der Sicherung behalten</item>
<item quantity="other">%1$d Versionen der Sicherung behalten</item>
<item quantity="one">%1$d Version der Sicherungsdatei speichern</item>
<item quantity="other">%1$d Versionen der Sicherungsdatei speichern</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Unendlich viele Versionen der Sicherungsdatei speichern</string>
<string name="pref_import_app_title">Aus App importieren</string>
<string name="pref_import_app_summary">Token aus einer App importieren (benötigt Root-Zugriff)</string>
<string name="pref_export_title">Exportieren</string>
@@ -79,13 +81,13 @@
<item quantity="one">%d inkompatibler Eintrag wurde übersprungen</item>
<item quantity="other">%d inkompatible Einträge wurden übersprungen</item>
</plurals>
<string name="pref_password_reminder_summary">Zeigt %s eine Erinnerung zur Eingabe des Passworts an, damit du es nicht vergisst.</string>
<string name="pref_password_reminder_summary">Zeigt %s eine Erinnerung zur Eingabe des Passworts an, damit es nicht vergessen wird.</string>
<string name="pref_password_reminder_summary_disabled">Deaktiviert</string>
<string name="pref_secure_screen_title">Bildschirmsicherheit</string>
<string name="pref_secure_screen_summary">Bildschirmfotos und andere Aufnahmeversuche innerhalb der App blockieren</string>
<string name="pref_tap_to_reveal_title">Zum Aufdecken antippen</string>
<string name="pref_tap_to_reveal_summary">Token werden standardmäßig ausgeblendet. Tippe auf die Token, um den Code anzuzeigen.</string>
<string name="pref_tap_to_reveal_time_title">Zeitüberschreitung für die Anzeige durch Antippen</string>
<string name="pref_tap_to_reveal_summary">Token werden standardmäßig ausgeblendet. Der Code wird durch Antippen des Tokens sichtbar.</string>
<string name="pref_tap_to_reveal_time_title">Zeitlimit für aufgedeckte Token</string>
<string name="pref_auto_lock_title">Automatisches Sperren</string>
<string name="pref_auto_lock_summary">Wenn %s</string>
<string name="pref_auto_lock_summary_disabled">Deaktiviert</string>
@@ -93,15 +95,21 @@
<string name="pref_auto_lock_type_back_button">Die Zurück-Taste gedrückt wird</string>
<string name="pref_auto_lock_type_minimize">Die App minimiert wird</string>
<string name="pref_auto_lock_type_device_lock">Das Gerät gesperrt wird</string>
<string name="pref_backup_password_category">Sicherung &amp; Exportdatei</string>
<string name="pref_backup_password_title">Unterschiedliches Passwort für Sicherung &amp; Exportdatei</string>
<string name="pref_backup_password_category">Sicherung und Exportdatei</string>
<string name="pref_backup_password_title">Separates Passwort für Sicherung und Exportdatei</string>
<string name="pref_backup_password_summary">Wenn diese Option aktiviert ist, kann das Passwort, das zum Entsperren der App verwendet wird, nicht mehr zum Entschlüsseln von Sicherungen und Exportdateien verwendet werden.</string>
<string name="pref_backup_password_change_title">Passwort für Sicherung &amp; Exportdatei ändern</string>
<string name="pref_backup_password_change_title">Passwort für Sicherung und Exportdatei ändern</string>
<string name="pref_backup_password_change_summary">Gib ein neues Passwort ein, mit dem die Datenbank während der Sicherung und des Exportierens verschlüsselt wird.</string>
<string name="pref_encryption_title">Verschlüsselung</string>
<string name="pref_encryption_summary">Datenbank verschlüsseln und sie mittels eines Passworts oder biometrischen Daten entsperren</string>
<string name="pref_biometrics_title">Biometrisches Entsperren</string>
<string name="pref_biometrics_summary">Biometrische Authentifizierung zum Entsperren der Datenbank erlauben</string>
<string name="pref_search_behavior_summary">Durchsuchen: %s</string>
<string name="pref_search_behavior_prompt">Folgende Felder durchsuchen</string>
<string name="pref_search_behavior_type_name">Name</string>
<string name="pref_search_behavior_type_issuer">Herausgeber</string>
<string name="pref_search_behavior_type_note">Notiz</string>
<string name="pref_search_behavior_type_groups">Gruppen</string>
<string name="pref_set_password_title">Passwort ändern</string>
<string name="pref_set_password_summary">Ein neues Passwort zum Entsperren der Datenbank festlegen</string>
<string name="no_events_title">Keine gemeldeten Ereignisse</string>
@@ -121,9 +129,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Entsperren der Datenbank fehlgeschlagen (Biometrie)</string>
<string name="event_description_vault_unlock_failed_biometrics">Ein Versuch, die Datenbank mittels Biometrie zu entsperren, schlug fehl</string>
<string name="event_unknown">Unbekanntes Ereignis</string>
<string name="audit_log_entry_deleted">(gelöscht)</string>
<string name="today_at_time">Heute um %1$s</string>
<string name="day_of_week_at_time">%1$s um %2$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">Datenbank verschlüsseln</string>
<string name="export_help">Mit dieser Aktion wird die Datenbank aus dem internen Speicher von Aegis exportiert. Wähle das Format aus, in dem der Export erfolgen soll:</string>
<string name="export_warning_unencrypted">Du bist dabei, eine unverschlüsselte Kopie deiner Aegis-Datenbank zu exportieren. <b>Dies wird nicht empfohlen</b>.</string>
@@ -302,6 +310,7 @@
<string name="no_tokens_can_be_imported">Daher können keine Token importiert werden</string>
<string name="unlocking_vault">Entsperren der Datenbank</string>
<string name="rename_group">Gruppe umbenennen</string>
<string name="no_group_selection">Wenn ein Eintrag keiner Gruppe zugewiesen ist, befindet er sich unter »Keine Gruppe«.</string>
<string name="remove_group">Gruppe entfernen</string>
<string name="remove_group_description">Möchtest du diese Gruppe wirklich entfernen? Einträge in dieser Gruppe wechseln automatisch zu »Keine Gruppe«.</string>
<string name="remove_unused_groups">Nicht verwendete Gruppen löschen</string>
@@ -329,8 +338,8 @@
<string name="preference_manage_groups">Gruppen bearbeiten</string>
<string name="preference_manage_groups_summary">Verwalten und Löschen von Gruppen</string>
<string name="preference_reset_usage_count">Verwendungszähler zurücksetzen</string>
<string name="preference_reset_usage_count_summary">Anzahl der Verwendungen für jeden Eintrag in der Datenbank zurücksetzen</string>
<string name="preference_reset_usage_count_dialog">Anzahl der Verwendungen aller Einträge in der Datenbank auf 0 setzen?</string>
<string name="preference_reset_usage_count_summary">Verwendungszähler für jeden Eintrag in der Datenbank zurücksetzen</string>
<string name="preference_reset_usage_count_dialog">Den Verwendungszähler aller Einträge in der Datenbank auf 0 setzen?</string>
<string name="note" comment="Users can add a note to an entry">Notiz</string>
<string name="clear">Löschen</string>
<string name="pref_highlight_entry_title">Token beim Antippen hervorheben</string>
@@ -338,6 +347,7 @@
<string name="pref_minimize_on_copy_title">Beim Kopieren minimieren</string>
<string name="pref_minimize_on_copy_summary">App nach dem Kopieren eines Tokens minimieren</string>
<string name="pref_copy_behavior_title">Token in die Zwischenablage kopieren</string>
<string name="pref_search_behavior_title">Suchverhalten</string>
<string name="pref_pause_entry_title">Token beim Antippen einfrieren</string>
<string name="pref_pause_entry_summary">Automatisches Aktualisieren der Token durch Antippen anhalten. Die Token werden nicht aktualisiert, solange sie hervorgehoben sind. Erfordert »Token beim Antippen hervorheben« oder »Zum Aufdecken antippen«.</string>
<string name="pin_keyboard_description">Gib dein Passwort ein, um die PIN-Tastatur zu aktivieren. Beachte, dass dies nur funktioniert, wenn dein Passwort nur aus Zahlen besteht</string>
@@ -438,7 +448,7 @@
<string name="uri_copied_to_clipboard">URI in die Zwischenablage kopiert</string>
<string name="transfer_entry">Eintrag übertragen</string>
<string name="transfer_entry_description">Scanne diesen QR-Code mit der Authentifizierungs-App, zu der du diesen Eintrag übertragen möchtest</string>
<string name="google_auth_compatible_transfer_description">Scanne diese QR-Codes mit Aegis oder Google Authenticator.\n\nAufgrund der Einschränkungen der Google Authenticator-App sind nur TOTP- &amp; HOTP-Token enthalten, die SHA1 verwenden und 6-stellige Codes erzeugen</string>
<string name="google_auth_compatible_transfer_description">Scanne diese QR-Codes mit Aegis oder Google Authenticator.\n\nAufgrund der Einschränkungen der Google Authenticator-App sind nur TOTP- und HOTP-Token enthalten, die SHA1 verwenden und 6-stellige Codes erzeugen</string>
<string name="password_strength_very_weak">Sehr schwach</string>
<string name="password_strength_weak">Schwach</string>
<string name="password_strength_fair">Mittel</string>
+12 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Εμφάνιση του ονόματος λογαριασμού</string>
<string name="pref_shared_issuer_account_name_title">Εμφάνιση ονόματος λογαριασμού μόνο όταν είναι απαραίτητο</string>
<string name="pref_shared_issuer_account_name_summary">Εμφάνιση μόνο ονομάτων λογαριασμών κάθε φορά που μοιράζονται τον ίδιο εκδότη. Άλλα ονόματα λογαριασμών θα αποκρύπτονται.</string>
<string name="pref_account_name_position_summary_override">Αυτή η ρύθμιση αντικαθίσταται από τη λειτουργία προβολής πλακιδίων. Το όνομα λογαριασμού θα εμφανίζεται πάντα κάτω από τον εκδότη.</string>
<string name="pref_account_name_position_summary_override">Αυτή η ρύθμιση αντικαθίσταται από τη λειτουργία προβολής πλακιδίων. Το όνομα λογαριασμού θα εμφανίζεται κάτω από τον εκδότη.</string>
<string name="pref_import_file_title">Εισαγωγή από αρχείο</string>
<string name="pref_import_file_summary">Εισαγωγή αναγνωριστικών από αρχείο</string>
<string name="pref_android_backups_title">Αντίγραφα ασφαλείας cloud Android</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">\'Εναυσμα αντιγράφου ασφαλείας</string>
<string name="pref_backups_trigger_summary">Χειροκίνητη ενεργοποίηση δημιουργίας αντιγράφου ασφαλείας</string>
<string name="pref_backups_versions_title">Αριθμός εκδόσεων που θα κρατηθούν</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Διατηρήστε την %1$d έκδοση του αντιγράφου ασφαλείας</item>
<item quantity="other">Διατηρήστε τις %1$d εκδόσεις του αντιγράφου ασφαλείας</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Διατηρήστε έναν άπειρο αριθμό εκδόσεων του αντιγράφου ασφαλείας</string>
<string name="pref_import_app_title">Εισαγωγή από εφαρμογή</string>
<string name="pref_import_app_summary">Εισαγωγή αναγνωριστικών από εφαρμογή (απαιτείται πρόσβαση root)</string>
<string name="pref_export_title">Εξαγωγή</string>
@@ -102,6 +104,12 @@
<string name="pref_encryption_summary">Κρυπτογράφηση της κρύπτης και ξεκλείδωμα με κωδικό ή βιομετρία</string>
<string name="pref_biometrics_title">Βιομετρικό ξεκλείδωμα</string>
<string name="pref_biometrics_summary">Αποδοχή βιομετρικής πιστοποίησης για να ξεκλειδώσετε την κρύπτη</string>
<string name="pref_search_behavior_summary">Αναζήτηση μέσω: %s</string>
<string name="pref_search_behavior_prompt">Αναζήτηση σε οποιοδήποτε από τα ακόλουθα πεδία</string>
<string name="pref_search_behavior_type_name">Όνομα</string>
<string name="pref_search_behavior_type_issuer">Εκδότης</string>
<string name="pref_search_behavior_type_note">Σημείωση</string>
<string name="pref_search_behavior_type_groups">Ομάδες</string>
<string name="pref_set_password_title">Αλλαγή κωδικού</string>
<string name="pref_set_password_summary">Ορισμός νέου κωδικού που θα χρειαστεί για να ξεκλειδώσετε την κρύπτης σας</string>
<string name="no_events_title">Δεν έχουν αναφερθεί συμβάντα</string>
@@ -121,9 +129,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Το ξεκλείδωμα της κρύπτης απέτυχε (βιομετρικά)</string>
<string name="event_description_vault_unlock_failed_biometrics">Αποτυχία προσπάθειας ξεκλειδώματος της κρύπτης με βιομετρικά στοιχεία</string>
<string name="event_unknown">Άγνωστος τύπος συμβάντος</string>
<string name="audit_log_entry_deleted">(διαγράφηκε)</string>
<string name="today_at_time">Σήμερα στις %1$s</string>
<string name="day_of_week_at_time">%1$s στις %2$s</string>
<string name="date_format">ηη/ΜΜ/εεεε</string>
<string name="export_encrypted">Κρυπτογράφηση κρύπτης</string>
<string name="export_help">Αυτή η ενέργεια θα εξάγει την κρύπτη έξω από τον εσωτερικό χώρο αποθήκευσης του Aegis. Επιλέξτε τη μορφή στην οποία θέλετε να είναι η εξαγωγή σας:</string>
<string name="export_warning_unencrypted">Πρόκειται να εξαγάγετε ένα μη κρυπτογραφημένο αντίγραφο της Aegis κρύπτης σας. <b> Αυτό δεν συνιστάται </b>.</string>
@@ -302,6 +310,7 @@
<string name="no_tokens_can_be_imported">Ως αποτέλεσμα, δεν μπορούν να εισαχθούν αναγνωστικά</string>
<string name="unlocking_vault">Ξεκλείδωμα κρύπτης</string>
<string name="rename_group">Μετονομασία Ομάδας</string>
<string name="no_group_selection">Εάν μια καταχώρηση δεν αποτελεί μέρος οποιασδήποτε ομάδας, μπορεί να βρεθεί στο \"Χωρίς ομάδα\".</string>
<string name="remove_group">Κατάργηση ομάδας</string>
<string name="remove_group_description">Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτήν την ομάδα; Οι καταχωρίσεις σε αυτήν θα μεταβούν αυτόματα στο \"Χωρίς ομάδα\".</string>
<string name="remove_unused_groups">Διαγραφή αχρησιμοποίητων ομάδων</string>
@@ -338,6 +347,7 @@
<string name="pref_minimize_on_copy_title">Ελαχιστοποίηση κατά την αντιγραφή</string>
<string name="pref_minimize_on_copy_summary">Ελαχιστοποίηση της εφαρμογής μετά την αντιγραφή ενός αναγνωριστικού</string>
<string name="pref_copy_behavior_title">Αντιγραφή αναγνωριστικών στο πρόχειρο</string>
<string name="pref_search_behavior_title">Συμπεριφορά αναζήτησης</string>
<string name="pref_pause_entry_title">Πάγωμα αναγνωριστικών όταν πατηθούν</string>
<string name="pref_pause_entry_summary">Παύση της αυτόματης ανανέωσης των αναγνωριστικών πατώντας τα. Τα αναγνωριστικά δεν θα ενημερώνονται όσο είναι συγκεντρωμένα. Απαιτεί \"Επισήμανση αναγνωριστικών όταν πατηθούν\" ή \"Πατήστε για αποκάλυψη\".</string>
<string name="pin_keyboard_description">Εισαγάγετε τον κωδικό πρόσβασής σας για να ενεργοποιήσετε το πληκτρολόγιο PIN. Λάβετε υπόψη ότι αυτό λειτουργεί μόνο εάν ο κωδικός πρόσβασής σας αποτελείται μόνο από αριθμούς</string>
+12 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Mostrar el nombre de la cuenta</string>
<string name="pref_shared_issuer_account_name_title">Solo mostrar nombres de cuenta necesarios</string>
<string name="pref_shared_issuer_account_name_summary">Mostrar nombres de cuenta solo cuando compartan el mismo emisor. Se ocultarán otros nombres de cuenta.</string>
<string name="pref_account_name_position_summary_override">Este ajuste no tiene efecto cuando aparecen en recuadros; el nombre de la cuenta siempre se mostrará debajo del emisor.</string>
<string name="pref_account_name_position_summary_override">Este ajuste no tiene efecto cuando aparecen en recuadros; el nombre de la cuenta se mostrará debajo del emisor.</string>
<string name="pref_import_file_title">Importar desde un archivo</string>
<string name="pref_import_file_summary">Importa tus claves desde un archivo</string>
<string name="pref_android_backups_title">Copias de seguridad en la nube de Android</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">Lanzar una copia de seguridad</string>
<string name="pref_backups_trigger_summary">Lanzar una copia de seguridad manualmente</string>
<string name="pref_backups_versions_title">Número de versiones a conservar</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Conservar %1$d versión de la copia de seguridad</item>
<item quantity="other">Conservar %1$d versiones de la copia de seguridad</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">No borrar ninguna copia de seguridad antigua</string>
<string name="pref_import_app_title">Importar desde una aplicación</string>
<string name="pref_import_app_summary">Importa tus claves desde una aplicación (mediante superusuario o «root»)</string>
<string name="pref_export_title">Exportar</string>
@@ -102,6 +104,12 @@
<string name="pref_encryption_summary">Cifra la bóveda y la desbloquea mediante una contraseña o biometría</string>
<string name="pref_biometrics_title">Desbloqueo biométrico</string>
<string name="pref_biometrics_summary">Permite la autenticación biométrica para desbloquear la bóveda</string>
<string name="pref_search_behavior_summary">Campos a buscar: %s</string>
<string name="pref_search_behavior_prompt">Incluir los datos de estos campos en tus búsquedas</string>
<string name="pref_search_behavior_type_name">Nombre</string>
<string name="pref_search_behavior_type_issuer">Emisor</string>
<string name="pref_search_behavior_type_note">Notas</string>
<string name="pref_search_behavior_type_groups">Grupos</string>
<string name="pref_set_password_title">Cambiar contraseña</string>
<string name="pref_set_password_summary">Crea una nueva contraseña que necesitarás para desbloquear tu bóveda</string>
<string name="no_events_title">No parece haber ningún cambio</string>
@@ -121,9 +129,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Hubo un fallo al desbloquear la bóveda (biometría)</string>
<string name="event_description_vault_unlock_failed_biometrics">Hubo un intento fallido al utilizar el desbloqueo biométrico</string>
<string name="event_unknown">Tipo de evento desconocido</string>
<string name="audit_log_entry_deleted">(borrado)</string>
<string name="today_at_time">Hoy a las %1$s</string>
<string name="day_of_week_at_time">%1$s a las %2$s</string>
<string name="date_format">día/mes/año</string>
<string name="export_encrypted">Cifrar la bóveda</string>
<string name="export_help">Esta acción exportará la bóveda fuera del almacenamiento interno de Aegis. Seleccione el formato al que desea exportar:</string>
<string name="export_warning_unencrypted">Estás a punto de exportar una copia sin cifrar de tu bóveda de Aegis. <b>No se recomienda en absoluto</b>.</string>
@@ -302,6 +310,7 @@
<string name="no_tokens_can_be_imported">Como consecuencia no se pudo importar ninguna de las claves</string>
<string name="unlocking_vault">Desbloqueando la bóveda</string>
<string name="rename_group">Renombrar grupo</string>
<string name="no_group_selection">El resto de elementos que no hayas asignado apareceran como «Sin agrupar».</string>
<string name="remove_group">Eliminar grupo</string>
<string name="remove_group_description">¿Seguro que quieres borrar este grupo? Sus elementos se moverán automáticamente a «Sin grupo».</string>
<string name="remove_unused_groups">Eliminar grupos no utilizados</string>
@@ -338,6 +347,7 @@
<string name="pref_minimize_on_copy_title">Minimizar al copiar</string>
<string name="pref_minimize_on_copy_summary">Minimiza la aplicación tras copiar claves</string>
<string name="pref_copy_behavior_title">Copiar claves en el portapapeles</string>
<string name="pref_search_behavior_title">Comportamiento de búsqueda</string>
<string name="pref_pause_entry_title">Congelar claves al tocarlas</string>
<string name="pref_pause_entry_summary">Pausa la recarga automática de las claves al tocarlas, por lo que no irán cambiando según expiran. Es necesario que también actives «Resaltar códigos al pulsar» o «Pulsar para mostrar».</string>
<string name="pin_keyboard_description">Escribe tu contraseña para activar el teclado PIN. Ten en cuenta que esto solo funciona si tu contraseña son todo números</string>
@@ -28,11 +28,15 @@
<string name="pref_section_security_summary">Zifratzea, desblokeatzeko elementu biometrikoak erabiltzea, automatikoki blokeatzea eta beste segurtasun ezarpen batzuk kudeatu.</string>
<string name="pref_section_import_export_title">Inportatu eta esportatu</string>
<string name="pref_section_import_export_summary">Aegis edo beste aplikazio batzuen segurtasun-kopiak inportatu. Zure Aegis biltegiaren eskuzko esportazioak sortu.</string>
<string name="pref_section_audit_log_title">Erregistroa</string>
<string name="pref_section_audit_log_summary">Appean gertatutako gertaeren zerrenda agertuko da.</string>
<string name="pref_section_backups_title">Segurtasun-kopiak</string>
<string name="pref_section_backups_summary">Konfiguratu segurtasun kopia automatikoak zuk nahi duzun karpetan gorde edo aktibatu Androiden segurtasun kopien sistema.</string>
<string name="pref_section_icon_packs">Ikono multzoak</string>
<string name="pref_section_icon_packs_summary">Kudeatu eta inportatu ikono multzoak</string>
<string name="pref_select_theme_title">Itxura</string>
<string name="pref_dynamic_colors_title">Kolore dinamikoak</string>
<string name="pref_dynamic_colors_summary">Zure Androidaren itxuraren araberako koloreak aplikatu</string>
<string name="pref_view_mode_title">Ikuspegia</string>
<string name="pref_lang_title">Hizkuntza</string>
<string name="pref_show_icons_title">Erakutsi ikonoak</string>
@@ -59,10 +63,12 @@
<string name="pref_backups_trigger_title">Segurtasun-kopien abiarazlea</string>
<string name="pref_backups_trigger_summary">Abiarazi segurtasun-kopia eskuz</string>
<string name="pref_backups_versions_title">Gorde beharreko bertsio kopurua</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Mantendu segurtasun-kopiaren %1$d bertsio</item>
<item quantity="other">Mantendu segurtasun-kopien %1$d bertsio</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Segurtasun kopien infititu bertsio gorde</string>
<string name="pref_import_app_title">Inportatu aplikaziotik</string>
<string name="pref_import_app_summary">Inportatu tokenak aplikazio batetik (root sarbidea behar du)</string>
<string name="pref_export_title">Esportatu</string>
@@ -100,6 +106,26 @@
<string name="pref_biometrics_summary">Baimendu autentifikazio biometrikoa biltegia desblokeatzeko</string>
<string name="pref_set_password_title">Aldatu pasahitza</string>
<string name="pref_set_password_summary">Ezarri biltegia desblokeatzeko erabiliko duzun pasahitz berria</string>
<string name="no_events_title">Ez dago gertaerarik</string>
<string name="no_events_description">Ez da garrantzizko gertaerarik gertatu appean</string>
<string name="event_title_vault_unlocked">Biltegia desblokeatuta</string>
<string name="event_description_vault_unlocked">Biltegia ondo desblokeatu da</string>
<string name="event_title_backup_created">Segurtasun kopia sortuta</string>
<string name="event_description_backup_created">Biltegiaren segurtasun kopia ondo sortu da</string>
<string name="event_title_android_backup_created">Androidek sortutako segurtasun kopia</string>
<string name="event_description_android_backup_created">Biltegiaren segurtasun kopia Androidek ondo sortu du</string>
<string name="event_title_vault_exported">Biltegia esportatuta</string>
<string name="event_description_vault_exported">Biltegiaren kopia bat esportatu da</string>
<string name="event_title_entry_shared">Sarrera partekatuta</string>
<string name="event_description_entry_shared">Sarrera bat partekatu da</string>
<string name="event_title_vault_unlock_failed_password">Biltegia desblokeatzeak huts egin du (pasahitza)</string>
<string name="event_description_vault_unlock_failed_password">Biltegia pasahitz bat erabiliz desblokeatzeak huts egin du</string>
<string name="event_title_vault_unlock_failed_biometrics">Biltegia desblokeatzeak huts egin du (biometria)</string>
<string name="event_description_vault_unlock_failed_biometrics">Biltegia biometria erabilz desblokeatzeak huts egin du</string>
<string name="event_unknown">Gertaera ezezaguna</string>
<string name="audit_log_entry_deleted">(ezabatuta)</string>
<string name="today_at_time">Gaur %1$s</string>
<string name="day_of_week_at_time">%1$s %2$s</string>
<string name="export_encrypted">Zifratu biltegia</string>
<string name="export_help">Akzio honek zure biltegia Aegisen barne-biltegiratzetik kanpo esportatuko du. Aukeratu zein formatutan esportatu nahi duzun:</string>
<string name="export_warning_unencrypted">Zure Aegis biltegiaren zifratu gabeko kopia esportatzera zoaz. <b>Ez dizugu hau egitea gomendatzen</b>.</string>
@@ -277,6 +303,8 @@
<string name="unrelated_google_auth_batches_error">Esportazioak zerikusirik ez duen sorta baten informazioa du. Saiatu sorta bakoitza bere aldetik inportatzen.</string>
<string name="no_tokens_can_be_imported">Ez izan da tokenik inportatu</string>
<string name="unlocking_vault">Biltegia desblokeatzen</string>
<string name="rename_group">Berrizendatu taldea</string>
<string name="no_group_selection">Sarrera ez bada talde baten parte \"Talde gabekoak\" atalean egongo da.</string>
<string name="remove_group">Ezabatu taldea</string>
<string name="remove_group_description">Ziur zaude talde hau ezabatu nahi duzula? Talde honetako sarrerak automatikoki aldatuko dira \'Talderik ez\' aukerara.</string>
<string name="remove_unused_groups">Ezabatu erabili gabeko taldeak</string>
@@ -294,7 +322,10 @@
<string name="sort_alphabetically_name">Kontua (A-tik Z-ra)</string>
<string name="sort_alphabetically_name_reverse">Kontua (Z-tik A-ra)</string>
<string name="sort_usage_count">Erabilera kopurua</string>
<string name="sort_last_used">Azken erabilera</string>
<string name="sort_custom">Pertsonalizatua</string>
<string name="last_used">Azken erabilera</string>
<string name="last_used_never">sekula ez</string>
<string name="new_group">Talde berria…</string>
<string name="group">Taldea</string>
<string name="group_name_hint">Taldearen izena</string>
@@ -413,6 +444,7 @@
<string name="password_strength_fair">Ertaina</string>
<string name="password_strength_good">Ona</string>
<string name="password_strength_strong">Sendoa</string>
<string name="password_strength_unknown">Pasahitza luzeegia da sendotasuna analisia egiteko</string>
<string name="pref_pin_keyboard_title">Erabili PIN teklatua blokeo pantailan</string>
<string name="pref_pin_keyboard_summary">Gaitu hau, blokeatzeko pantailan PIN teklatua gaitu nahi baduzu. Honek zenbaki-pasahitzetarako bakarrik balio du</string>
<string name="title_activity_preferences">Ezarpenak</string>
@@ -423,6 +455,7 @@
<string name="title_activity_scan_qr">Eskaneatu QR kodea</string>
<string name="title_activity_import_entries">Inportatu sarrerak</string>
<string name="title_activity_assign_icons">Esleitu ikonoak</string>
<string name="title_activity_licenses">Hirugarrenen lizentziak</string>
<string name="dialog_wipe_entries_title">Garbitu sarrerak</string>
<string name="dialog_wipe_entries_message">Zure biltegiak sarrerak ditu dagoeneko. Sarrera horiek ezabatu nahi dituzu fitxategi hau inportatu aurretik?\n\n<b>Hori egitean, biltegiko sarreretarako sarbidea galduko da betirako.</b></string>
<string name="dialog_wipe_entries_checkbox">Garbitu biltegiaren sarrerak</string>
@@ -442,6 +475,7 @@
<string name="importer_help_authy"><b>/data/data/com.authy.authy/shared_prefs/com.authy.storage.tokens.authenticator.xml</b> fitxategia aukeratu.</string>
<string name="importer_help_andotp">andOTPren esportazio/segurtasun-kopia fitxategia aukeratu.</string>
<string name="importer_help_bitwarden">Kargatu Bitwardenen esportazio/segurtasun-kopia fitxategi bat. Ezin dituzu zifratutako fitxategiak kargatu.</string>
<string name="importer_help_battle_net_authenticator">Battle.net Authenticatoren <b>/data/data/com.blizzard.messenger/shared_prefs/com.blizzard.messenger.authenticator_preferences.xml</b> fitxategia aukeratu.</string>
<string name="importer_help_duo">Aukeratu <b>/data/data/com.duosecurity.duomobile/files/duokit/accounts.json</b> fitxategia, DUOren karpeten barruan dagoena.</string>
<string name="importer_help_freeotp">FreeTOPren (1.x bersioa) barne karpetan dagoen <b>/data/data/org.fedorahosted.freeotp/shared_prefs/tokens.xml</b> fitxategia aukeratu.</string>
<string name="importer_help_freeotp_plus">FreeOTP+en esportazio fitxategia aukeratu.</string>
+12 -9
View File
@@ -10,7 +10,7 @@
<string name="action_default_icon">Palauta oletuskuvake</string>
<string name="discard">Hylkää</string>
<string name="save">Tallenna</string>
<string name="issuer">Palveluntarjoaja</string>
<string name="issuer">Myöntäjä</string>
<string name="yandex_pin">PIN (4 - 16 numeroa)</string>
<string name="motp_pin">PIN (4 numeroa)</string>
<string name="suggested">Ehdotettu</string>
@@ -45,8 +45,8 @@
<string name="pref_code_group_size_summary">Valitse koodien ryhmittelyyn käytettävien numeroiden määrä</string>
<string name="pref_account_name_position_title">Näytä tilin nimi</string>
<string name="pref_shared_issuer_account_name_title">Näytä tilin nimi vain tarvittaessa</string>
<string name="pref_shared_issuer_account_name_summary">Näytä tilien nimet vain silloin, kun niillä on sama palveluntarjoaja. Muiden tilien nimet piilotetaan.</string>
<string name="pref_account_name_position_summary_override">Tämä asetus ohitetaan laatat-näkymätilassa. Tilin nimi näkyy aina palveluntarjoajan alapuolella.</string>
<string name="pref_shared_issuer_account_name_summary">Näytä tilien nimet vain silloin, kun niillä on sama myöntäjä. Muiden tilien nimet piilotetaan.</string>
<string name="pref_account_name_position_summary_override">Tämä asetus ohitetaan laatat-näkymätilassa. Tilin nimi näytetään myöntäjän alapuolella.</string>
<string name="pref_import_file_title">Tuo tiedostosta</string>
<string name="pref_import_file_summary">Tuo todennuskoodit tiedostosta</string>
<string name="pref_android_backups_title">Androidin pilvivarmuuskopiot</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">Varmuuskopion käynnistys</string>
<string name="pref_backups_trigger_summary">Käynnistä varmuuskopio manuaalisesti</string>
<string name="pref_backups_versions_title">Säilytettävien versioiden määrä</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Säilytä %1$d versio varmuuskopiosta</item>
<item quantity="other">Säilytä %1$d versiota varmuuskopiosta</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Säilytä rajaton määrä versioita varmuuskopiosta</string>
<string name="pref_import_app_title">Tuo sovelluksesta</string>
<string name="pref_import_app_summary">Tuo todennuskoodit sovelluksesta (vaatii root-oikeuden)</string>
<string name="pref_export_title">Vie</string>
@@ -121,9 +123,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Holvin lukituksen avaus epäonnistui (biometria)</string>
<string name="event_description_vault_unlock_failed_biometrics">Holvin lukituksen avaus biometrialla epäonnistui</string>
<string name="event_unknown">Tuntematon tapahtumatyyppi</string>
<string name="audit_log_entry_deleted">(poistettu)</string>
<string name="today_at_time">Tänään klo %1$s</string>
<string name="day_of_week_at_time">%1$s klo %2$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">Salaa holvi</string>
<string name="export_help">Tämä toiminto vie holvin ulos Aegisin sisäisestä tallennustilasta. Valitse viennin tiedostomuoto:</string>
<string name="export_warning_unencrypted">Olet viemässä salaamattoman kopion Aegis-holvistasi. <b>Tätä ei suositella</b>.</string>
@@ -302,6 +304,7 @@
<string name="no_tokens_can_be_imported">Tämän seurauksena yhtäkään todennuskoodia ei voitu tuoda</string>
<string name="unlocking_vault">Holvia avataan</string>
<string name="rename_group">Nimeä ryhmä uudelleen</string>
<string name="no_group_selection">Jos kohde ei kuulu mihinkään ryhmään, se löytyy osion ”Ei ryhmää” alta.</string>
<string name="remove_group">Poista ryhmä</string>
<string name="remove_group_description">Poistetaanko tämä ryhmä? Ryhmässä olevat kohteet merkitään automaattisesti ryhmättömiksi.</string>
<string name="remove_unused_groups">Poista käyttämättömät ryhmät</string>
@@ -314,8 +317,8 @@
<string name="name">Nimi</string>
<string name="no_group">Ei ryhmää</string>
<string name="sort" comment="Title of the Sort button in the top action bar of the main view">Järjestä</string>
<string name="sort_alphabetically">Palveluntarjoaja (A - Ö)</string>
<string name="sort_alphabetically_reverse">Palveluntarjoaja (Ö - A)</string>
<string name="sort_alphabetically">Myöntäjä (A - Ö)</string>
<string name="sort_alphabetically_reverse">Myöntäjä (Ö - A)</string>
<string name="sort_alphabetically_name">Tilin nimi (A-Ö)</string>
<string name="sort_alphabetically_name_reverse">Tilin nimi (Ö-A)</string>
<string name="sort_usage_count">Käyttömäärä</string>
@@ -354,7 +357,7 @@
<string name="compact_mode_title">Tiivis</string>
<string name="small_mode_title">Pieni</string>
<string name="tiles_mode_title">Laatat</string>
<string name="unknown_issuer">Tuntematon palveluntarjoaja</string>
<string name="unknown_issuer">Tuntematon myöntäjä</string>
<string name="unknown_account_name">Tuntematon tilinimi</string>
<plurals name="import_error_dialog">
<item quantity="one">Aegis ei voinut tuoda %d todennuskoodia. Nämä todennuskoodi ohitetaan. Paina \'tiedot\' nähdäksesi lisätietoa virheestä.</item>
@@ -501,8 +504,8 @@
<string name="pref_copy_behavior_single_tap">Yksi napautus</string>
<string name="pref_copy_behavior_double_tap">Kaksoisnapautus</string>
<string name="pref_account_name_position_hidden">Piilotettu</string>
<string name="pref_account_name_position_end">Palveluntarjoajan vierellä</string>
<string name="pref_account_name_position_below">Palveluntarjoajan alla</string>
<string name="pref_account_name_position_end">Myöntäjän vierellä</string>
<string name="pref_account_name_position_below">Myöntäjän alla</string>
<plurals name="time_elapsed_seconds">
<item quantity="one">%d sekunti sitten</item>
<item quantity="other">%d sekuntia sitten</item>
+12 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Afficher le nom de compte</string>
<string name="pref_shared_issuer_account_name_title">Afficher le nom de compte seulement si nécessaire</string>
<string name="pref_shared_issuer_account_name_summary">Afficher les noms de compte seulement lorsqu\'ils partagent le même émetteur. Les autres noms de compte seront masqués.</string>
<string name="pref_account_name_position_summary_override">Ce paramètre est remplacé par le mode d\'affichage des tuiles. Le nom de compte sera toujours affiché sous l\'émetteur.</string>
<string name="pref_account_name_position_summary_override">Ce paramètre est remplacé par le mode d\'affichage par tuiles. Le nom de compte sera affiché sous l\'émetteur.</string>
<string name="pref_import_file_title">Importer depuis un fichier</string>
<string name="pref_import_file_summary">Importer des jetons depuis un fichier</string>
<string name="pref_android_backups_title">Sauvegardes cloud d\'Android</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">Déclencher la sauvegarde</string>
<string name="pref_backups_trigger_summary">Déclencher manuellement une sauvegarde</string>
<string name="pref_backups_versions_title">Nombre de versions à conserver</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Conserver %1$d version de la sauvegarde</item>
<item quantity="other">Conserver %1$d versions de la sauvegarde</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Conserver un nombre infini de versions de la sauvegarde</string>
<string name="pref_import_app_title">Importer depuis une application</string>
<string name="pref_import_app_summary">Importer des jetons depuis une application (nécessite un accès root)</string>
<string name="pref_export_title">Exporter</string>
@@ -102,6 +104,12 @@
<string name="pref_encryption_summary">Chiffrer le coffre-fort et le déverrouiller avec un mot de passe ou la biométrie</string>
<string name="pref_biometrics_title">Déverrouillage biométrique</string>
<string name="pref_biometrics_summary">Autoriser l\'authentification biométrique pour déverrouiller le coffre-fort</string>
<string name="pref_search_behavior_summary">Recherchez par : %s</string>
<string name="pref_search_behavior_prompt">Rechercher dans l\'un des champs suivants</string>
<string name="pref_search_behavior_type_name">Nom</string>
<string name="pref_search_behavior_type_issuer">Émetteur</string>
<string name="pref_search_behavior_type_note">Note</string>
<string name="pref_search_behavior_type_groups">Groupes</string>
<string name="pref_set_password_title">Changer le mot de passe</string>
<string name="pref_set_password_summary">Définir un nouveau mot de passe dont vous aurez besoin pour déverrouiller votre coffre-fort</string>
<string name="no_events_title">Aucun événement signalé</string>
@@ -121,9 +129,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Le déverrouillage du coffre-fort a échoué (données biométriques)</string>
<string name="event_description_vault_unlock_failed_biometrics">Une tentative de déverrouillage du coffre-fort avec des données biométriques a échoué</string>
<string name="event_unknown">Type d\'événement inconnu</string>
<string name="audit_log_entry_deleted">(supprimé)</string>
<string name="today_at_time">Ajourd\'hui à %1$s</string>
<string name="day_of_week_at_time">%1$s à %2$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">Chiffrer le coffre-fort</string>
<string name="export_help">Cette action exportera le coffre-fort à partir du stockage interne d\'Aegis. Sélectionnez le format vers lequel vous souhaitez faire votre export :</string>
<string name="export_warning_unencrypted">Vous êtes sur le point d\'exporter une copie non chiffrée de votre coffre-fort Aegis. <b>Ce n\'est pas recommandé</b>.</string>
@@ -302,6 +310,7 @@
<string name="no_tokens_can_be_imported">Aucun jeton ne peut être importé en conséquence</string>
<string name="unlocking_vault">Déverrouillage du coffre-fort</string>
<string name="rename_group">Renommer le groupe</string>
<string name="no_group_selection">Si une entrée ne fait partie d\'aucun groupe, elle peut être trouvée sous \"Aucun groupe\".</string>
<string name="remove_group">Supprimer groupe</string>
<string name="remove_group_description">Êtes-vous sûr de vouloir supprimer ce groupe ? Les entrées dans ce groupe seront basculées automatiquement dans \"Aucun groupe\".</string>
<string name="remove_unused_groups">Supprimer les groupes inutilisés</string>
@@ -338,6 +347,7 @@
<string name="pref_minimize_on_copy_title">Minimiser lors de la copie</string>
<string name="pref_minimize_on_copy_summary">Minimiser l\'application après avoir copié un jeton</string>
<string name="pref_copy_behavior_title">Copier les jetons dans le presse-papier</string>
<string name="pref_search_behavior_title">Comportement de recherche</string>
<string name="pref_pause_entry_title">Geler les jetons lorsqu\'ils sont appuyés</string>
<string name="pref_pause_entry_summary">Mettre en pause l\'actualisation automatique des jetons en appuyant dessus. Les jetons ne seront plus mis à jour tant qu\'ils seront ciblés. Nécessite « Surligner les jetons lorsqu\'ils sont appuyés » ou « Appuyer pour révéler ».</string>
<string name="pin_keyboard_description">Saisissez votre mot de passe pour activer le clavier PIN. Notez que cela ne fonctionne que si votre mot de passe est composé uniquement de chiffres</string>
+5 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Accountnamme toane</string>
<string name="pref_shared_issuer_account_name_title">Accountnamme allinnich wannear nedich toane</string>
<string name="pref_shared_issuer_account_name_summary">Accountnammen allinnich toane wanneart se deselde útjouwer diele. Oare accountnammen wurde ferstoppe.</string>
<string name="pref_account_name_position_summary_override">Dizze ynstelling wurdt oerskreaun troch de tegelwerjeftemodus. Accountnamme wurdt altyd toand ûnder de útjouwer.</string>
<string name="pref_account_name_position_summary_override">Dizze ynstelling wurdt oerskreaun troch de werjeftemodus Tegels. Accountnamme wurdt ûnder de útjouwer toand.</string>
<string name="pref_import_file_title">Ut bestân ymportearje</string>
<string name="pref_import_file_summary">Tokens fan in bestân út ymportearje</string>
<string name="pref_android_backups_title">Android cloud-reservekopyen</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">No in reservekopy meitsje</string>
<string name="pref_backups_trigger_summary">Hânmjittich in reservekopy meitsje</string>
<string name="pref_backups_versions_title">Oantal ferzjes om te bewarjen</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Bewarje %1$d ferzje fan de reservekopy</item>
<item quantity="other">Bewarje %1$d ferzjes fan de reservekopy</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Uneinich oantal ferzjes fan de reservekopy bewarje</string>
<string name="pref_import_app_title">Fan in app út ymportearje</string>
<string name="pref_import_app_summary">Tokens fan in app út ymportearje (fereasket root-tagong)</string>
<string name="pref_export_title">Eksportearje</string>
@@ -121,9 +123,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Klûs ûntskoatteljen mislearre (biometrysk)</string>
<string name="event_description_vault_unlock_failed_biometrics">In besykjen om de klûs mei in wachtwurd te ûntskoatteljen mei biometryske gegevens is mislearre</string>
<string name="event_unknown">Unbekend barrenstype</string>
<string name="audit_log_entry_deleted">(fuortsmiten)</string>
<string name="today_at_time">Hjoed om %1$s</string>
<string name="day_of_week_at_time">%1$s om %2$s</string>
<string name="date_format">dd/mm/jjjj</string>
<string name="export_encrypted">Fersiferje de klûs</string>
<string name="export_help">Dizze aksje sil de klûs eksportearje út it ynterne ûnthâld fan Aegis. Selektearje it formaat wêryntsto de eksport wolst:</string>
<string name="export_warning_unencrypted">Do stiest op it punt in ûnfersifere kopy fan de Aegis-klûs te eksportearjen. <b>Dit wurdt net oanrekommandearre</b>.</string>
@@ -302,6 +304,7 @@
<string name="no_tokens_can_be_imported">Hjirtroch kinne gjin tokens ymportearre wurde</string>
<string name="unlocking_vault">Klûs wurdt ûntskoattele</string>
<string name="rename_group">Groep omneame</string>
<string name="no_group_selection">As in item net yn in groep sit, kin dit fûn wurde ûnder Gjin groep.</string>
<string name="remove_group">Groep fuortsmite</string>
<string name="remove_group_description">Bisto wis datsto dizze groep fuortsmite wolst? Alle items binnen dizze groep wurde automatysk ferpleatst nei Gjin groep.</string>
<string name="remove_unused_groups">Net brûkte groepen fuortsmite</string>
+28 -1
View File
@@ -28,6 +28,8 @@
<string name="pref_section_security_summary">Configura o cifrado, o desbloqueo por biometría, o bloqueo automático e outros axustes de seguridade.</string>
<string name="pref_section_import_export_title">Importar e exportar</string>
<string name="pref_section_import_export_summary">Importa copias de seguridade de Aegis ou de outras aplicacións de autenticación. Exporta manualmente o teu almacén de Aegis.</string>
<string name="pref_section_audit_log_title">Rexistro de auditoría</string>
<string name="pref_section_audit_log_summary">Atopa unha lista de tódolos eventos importantes que ocorreron na app.</string>
<string name="pref_section_backups_title">Copias de seguridade</string>
<string name="pref_section_backups_summary">Configura copias de seguridade automáticas na localización que escollas ou activa a participación no sistema de copias de seguridade na nube de Android.</string>
<string name="pref_section_icon_packs">Paquetes de iconas</string>
@@ -44,7 +46,6 @@
<string name="pref_account_name_position_title">Mostrar o nome da conta</string>
<string name="pref_shared_issuer_account_name_title">Mostrar o nome da conta só cando sexa necesario</string>
<string name="pref_shared_issuer_account_name_summary">Mostrar nomes de conta só cando teñan o mesmo emisor. Os demáis nomes de conta ocultaranse.</string>
<string name="pref_account_name_position_summary_override">Este axuste está anulado polo modo de visualización de mosaico. O nome da conta mostrarase sempre debaixo do emisor.</string>
<string name="pref_import_file_title">Importar desde un ficheiro</string>
<string name="pref_import_file_summary">Importar tokens desde un ficheiro</string>
<string name="pref_android_backups_title">Copias de seguridade na nube de Android</string>
@@ -61,10 +62,12 @@
<string name="pref_backups_trigger_title">Executar copia de seguridade</string>
<string name="pref_backups_trigger_summary">Lanza manualmente unha copia de seguridade</string>
<string name="pref_backups_versions_title">Número de versións a manter</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Manter %1$d versión da copia de seguridade</item>
<item quantity="other">Manter %1$d versións da copia de seguridade</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Manter un número ilimitado de versións da copia de seguridade</string>
<string name="pref_import_app_title">Importar desde unha aplicación</string>
<string name="pref_import_app_summary">Importar tokens desde unha aplicación (require acceso root)</string>
<string name="pref_export_title">Exportar</string>
@@ -102,6 +105,25 @@
<string name="pref_biometrics_summary">Permite a autenticación mediante biometría para desbloquear o almacén</string>
<string name="pref_set_password_title">Cambiar contrasinal</string>
<string name="pref_set_password_summary">Establece un novo contrasinal co que desbloquear o teu almacén</string>
<string name="no_events_title">Non hai ningún evento rexistrado</string>
<string name="no_events_description">Non se rexistrou ningún evento importante na app</string>
<string name="event_title_vault_unlocked">Almacén desbloqueado</string>
<string name="event_description_vault_unlocked">O almacén desbloqueouse correctamente</string>
<string name="event_title_backup_created">Copia de seguridade creada</string>
<string name="event_description_backup_created">Creouse correctamente unha copia de seguridade do almacén</string>
<string name="event_title_android_backup_created">Creada copia de seguridade de Android</string>
<string name="event_description_android_backup_created">Android creou correctamente unha copia de seguridade do almacén</string>
<string name="event_title_vault_exported">Almacén exportado</string>
<string name="event_description_vault_exported">Exportouse unha copia do almacén</string>
<string name="event_title_entry_shared">Entrada compartida</string>
<string name="event_description_entry_shared">Compartiuse unha entrada</string>
<string name="event_title_vault_unlock_failed_password">Fallo de desbloqueo do almacén (contrasinal)</string>
<string name="event_description_vault_unlock_failed_password">Houbo un intento errado de desbloquear o almacén mediante contrasinal</string>
<string name="event_title_vault_unlock_failed_biometrics">Fallo de desbloqueo do almacén (biometría)</string>
<string name="event_description_vault_unlock_failed_biometrics">Houbo un intento errado de desbloquear o almacén mediante datos biométricos</string>
<string name="event_unknown">Tipo de evento descoñecido</string>
<string name="today_at_time">Hoxe ás %1$s</string>
<string name="day_of_week_at_time">%1$s ás %2$s</string>
<string name="export_encrypted">Cifrar o almacén</string>
<string name="export_help">Esta acción exportará o almacén fóra do almacenamento interno de Aegis. Escolle o formato no que o queiras exportar:</string>
<string name="export_warning_unencrypted">Estás a piques de exportar unha copia non cifrada do teu almacén de Aegis. <b>Isto non está recomendado</b>.</string>
@@ -279,6 +301,8 @@
<string name="unrelated_google_auth_batches_error">A exportación contén información sobre un lote non relacionado. Intenta importar 1 lote de cada vez.</string>
<string name="no_tokens_can_be_imported">Polo tanto, non se pode importar ningún token</string>
<string name="unlocking_vault">Desbloqueando o almacén</string>
<string name="rename_group">Renomear o grupo</string>
<string name="no_group_selection">Os elementos que non sexan parte de ningún grupo poderanse atopar dentro de \"Sen grupo\".</string>
<string name="remove_group">Quitar grupo</string>
<string name="remove_group_description">Tes a certeza de que queres quitar este grupo? As entradas deste grupo pasarán automaticamente a \"Sen grupo\".</string>
<string name="remove_unused_groups">Borrar grupos sen usar</string>
@@ -421,6 +445,7 @@
<string name="password_strength_fair">Aceptable</string>
<string name="password_strength_good">Boa</string>
<string name="password_strength_strong">Forte</string>
<string name="password_strength_unknown">O contrasinal é demasiado longo para a análise de robustez</string>
<string name="pref_pin_keyboard_title">Usar teclado PIN na pantalla de bloqueo</string>
<string name="pref_pin_keyboard_summary">Activa isto se queres habilitar o teclado do PIN na pantalla de bloqueo. Isto só funciona para os contrasinais numéricos</string>
<string name="title_activity_preferences">Axustes</string>
@@ -431,6 +456,7 @@
<string name="title_activity_scan_qr">Escanear un código QR</string>
<string name="title_activity_import_entries">Importar entradas</string>
<string name="title_activity_assign_icons">Asignar iconas</string>
<string name="title_activity_licenses">Licenzas de terceiros</string>
<string name="dialog_wipe_entries_title">Limpar entradas</string>
<string name="dialog_wipe_entries_message">O teu almacén xa contén entradas. Queres eliminalas antes de importar o ficheiro?\n\n<b>Se o fas, perderás o acceso ás entradas existentes no almacén para sempre.</b></string>
<string name="dialog_wipe_entries_checkbox">Limpar o contido do almacén</string>
@@ -450,6 +476,7 @@
<string name="importer_help_authy">Proporciona unha copia de <b>/data/data/com.authy.authy/shared_prefs/com.authy.storage.tokens.authenticator.xml</b>, localizado no directorio do almacenamento interno de Authy.</string>
<string name="importer_help_andotp">Proporciona un ficheiro de copia de seguridade ou de exportación de andOTP.</string>
<string name="importer_help_bitwarden">Proporciona un ficheiro de copia de seguridade ou de exportación de Bitwarden. Non se admiten os ficheiros cifrados.</string>
<string name="importer_help_battle_net_authenticator">Proporciona unha copia de <b>/data/data/com.blizzard.messenger/shared_prefs/com.blizzard.messenger.authenticator_preferences.xml</b>, localizado no directorio do almacenamento interno de Battle.net Authenticator.</string>
<string name="importer_help_duo">Proporciona unha copia de <b>/data/data/com.duosecurity.duomobile/files/duokit/accounts.json</b>, localizado no directorio do almacenamento interno de DUO.</string>
<string name="importer_help_freeotp">Proporciona unha copia de <b>/data/data/org.fedorahosted.freeotp/shared_prefs/tokens.xml</b>, localizado no directorio do almacenamento interno de FreeOTP (1.x).</string>
<string name="importer_help_freeotp_plus">Proporciona un ficheiro de exportación de FreeOTP+.</string>
+5 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">A fióknév megjelenítése</string>
<string name="pref_shared_issuer_account_name_title">A fióknév megjelenítése csak akkor, ha szükséges</string>
<string name="pref_shared_issuer_account_name_summary">A fióknevek megjelenítése csak akkor, ha megegyezik a kibocsátójuk. A többi fióknév rejtve lesz.</string>
<string name="pref_account_name_position_summary_override">Ezt a beállítást felülbírálja a csempenézetes mód. A fióknév mindig látható lesz a kibocsátó alatt.</string>
<string name="pref_account_name_position_summary_override">Ezt a beállítást felülbírálja a csempenézetes mód. A fióknév látható lesz a kibocsátó alatt.</string>
<string name="pref_import_file_title">Importálás fájlból</string>
<string name="pref_import_file_summary">Tokenek importálása fájlból</string>
<string name="pref_android_backups_title">Android felhős mentések</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">Biztonsági mentés készítése</string>
<string name="pref_backups_trigger_summary">Biztonsági mentés kézi indítása</string>
<string name="pref_backups_versions_title">Megtartandó verziók száma</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">%1$d verzió megtartása a mentésből</item>
<item quantity="other">%1$d verzió megtartása a mentésből</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Végtelen számú verzió megtartása a biztonsági mentésből</string>
<string name="pref_import_app_title">Importálás alkalmazásból</string>
<string name="pref_import_app_summary">Tokenek importálása alkalmazásból (root hozzáférés szükséges)</string>
<string name="pref_export_title">Exportálás</string>
@@ -121,9 +123,9 @@
<string name="event_title_vault_unlock_failed_biometrics">A széf feloldása nem sikerült (biometrikus adatok)</string>
<string name="event_description_vault_unlock_failed_biometrics">A széf biometikus adatokkal való feloldása nem sikerült</string>
<string name="event_unknown">Ismeretlen eseménytípus</string>
<string name="audit_log_entry_deleted">(törölve)</string>
<string name="today_at_time">Ma %1$s-kor</string>
<string name="day_of_week_at_time">%1$s %2$s-kor</string>
<string name="date_format">yyyy. MM. dd.</string>
<string name="export_encrypted">A széf titkosítása</string>
<string name="export_help">Ez a művelet exportálja a széfet az Aegis belső tárolójából. Válassza ki az exportálás formátumát:</string>
<string name="export_warning_unencrypted">Arra készül, hogy egy titkosítatlan Aegis széfet exportáljon. <b>Ez nem ajánlott</b>.</string>
@@ -302,6 +304,7 @@
<string name="no_tokens_can_be_imported">Ennek eredményeképp egyetlen token sem importálható</string>
<string name="unlocking_vault">A széf feloldása</string>
<string name="rename_group">Csoport átnevezése</string>
<string name="no_group_selection">Ha egy bejegyzés egy csoportnak sem tagja, akkor a „Nincs csoport” alatt található.</string>
<string name="remove_group">Csoport eltávolítása</string>
<string name="remove_group_description">Biztos, hogy eltávolítja ezt a csoportot? A csoport bejegyzései automatikusan „Csoport nélküli” elemek lesznek.</string>
<string name="remove_unused_groups">Nem használt csoportok törlése</string>
@@ -28,11 +28,15 @@
<string name="pref_section_security_summary">Menyesuaikan enkripsi, buka kunci dengan biometrik, penguncian otomatis, dan pengaturan keamanan lainnya.</string>
<string name="pref_section_import_export_title">Impor &amp; Ekspor</string>
<string name="pref_section_import_export_summary">Impor cadangan dari Aegis atau aplikasi autentikasi lainnya. Buat ekspor manual dari brankas Aegis.</string>
<string name="pref_section_audit_log_title">Log audit</string>
<string name="pref_section_audit_log_summary">Temukan daftar semua peristiwa penting yang dilaporkan yang terjadi di dalam aplikasi.</string>
<string name="pref_section_backups_title">Cadangan</string>
<string name="pref_section_backups_summary">Atur pencadangan otomatis ke lokasi yang Anda pilih atau aktifkan partisipasi di sistem pencadangan awan Android.</string>
<string name="pref_section_icon_packs">Paket Ikon</string>
<string name="pref_section_icon_packs_summary">Kelola dan impor paket ikon</string>
<string name="pref_select_theme_title">Tema</string>
<string name="pref_dynamic_colors_title">Warna dinamis</string>
<string name="pref_dynamic_colors_summary">Terapkan lapisan berdasarkan warna tema Android Anda</string>
<string name="pref_view_mode_title">Mode tampilan</string>
<string name="pref_lang_title">Bahasa</string>
<string name="pref_show_icons_title">Tampilkan ikon</string>
@@ -59,9 +63,11 @@
<string name="pref_backups_trigger_title">Perintah pencadangan</string>
<string name="pref_backups_trigger_summary">Perintah pencadangan secara manual</string>
<string name="pref_backups_versions_title">Nomor versi untuk disimpan</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="other">Simpan %1$d versi cadangan</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Simpan cadangan dalam jumlah tak terbatas</string>
<string name="pref_import_app_title">Impor dari aplikasi</string>
<string name="pref_import_app_summary">Impor token dari aplikasi (membutuhkan akses root)</string>
<string name="pref_export_title">Ekspor</string>
@@ -98,6 +104,26 @@
<string name="pref_biometrics_summary">Izinkan otentikasi biometrik untuk membuka brankas</string>
<string name="pref_set_password_title">Ganti kata sandi</string>
<string name="pref_set_password_summary">Atur kata sandi baru untuk digunkan membuka brankas Anda</string>
<string name="no_events_title">Tidak ada kejadian yang dilaporkan</string>
<string name="no_events_description">Tidak ada kejadian penting yang dilaporkan dalam aplikasi ini</string>
<string name="event_title_vault_unlocked">Brankas terbuka</string>
<string name="event_description_vault_unlocked">Brankas telah berhasil dibuka</string>
<string name="event_title_backup_created">Cadangan dibuat</string>
<string name="event_description_backup_created">Cadangan brankas telah berhasil dibuat</string>
<string name="event_title_android_backup_created">Cadangan dibuat oleh Android</string>
<string name="event_description_android_backup_created">Cadangan brankas telah berhasil dibuat oleh Android</string>
<string name="event_title_vault_exported">Brankas diekspor</string>
<string name="event_description_vault_exported">Salinan brankas telah diekspor</string>
<string name="event_title_entry_shared">Entri dibagikan</string>
<string name="event_description_entry_shared">Sebuah entri telah dibagikan</string>
<string name="event_title_vault_unlock_failed_password">Gagal membuka kunci brankas (kata sandi)</string>
<string name="event_description_vault_unlock_failed_password">Upaya membuka kunci brankas dengan kata sandi gagal</string>
<string name="event_title_vault_unlock_failed_biometrics">Gagal membuka kunci brankas (biometrik)</string>
<string name="event_description_vault_unlock_failed_biometrics">Upaya membuka kunci brankas dengan biometrik gagal</string>
<string name="event_unknown">Jenis peristiwa tidak diketahui</string>
<string name="audit_log_entry_deleted">(terhapus)</string>
<string name="today_at_time">Hari ini pada %1$s</string>
<string name="day_of_week_at_time">Hari %1$s pada %2$s</string>
<string name="export_encrypted">Enkripsi brankas</string>
<string name="export_help">Tindakan ini akan mengekspor brankas dari penyimpanan internal Aegis. Pilih format yang Anda inginkan untuk ekspor:</string>
<string name="export_warning_unencrypted">Anda akan mengekspor salinan tidak terenkripsi dari brankas Aegis Anda. <b>Ini tidak disarankan</b>.</string>
@@ -269,6 +295,8 @@
<string name="unrelated_google_auth_batches_error">Ekspor berisi informasi untuk batch yang tidak terkait. Coba impor 1 batch dalam satu waktu.</string>
<string name="no_tokens_can_be_imported">Tidak ada token yang dapat diimpor sebagai hasilnya</string>
<string name="unlocking_vault">Buka brankas</string>
<string name="rename_group">Ganti Nama Grup</string>
<string name="no_group_selection">Jika sebuah entri bukan merupakan bagian dari grup mana pun, entri tersebut dapat ditemukan di bawah “Tidak ada grup”.</string>
<string name="remove_group">Hapus kelompok</string>
<string name="remove_group_description">Apakah Anda yakin ingin menghapus kelompok ini? Catatan dalam kelompok ini akan secara otomatis beralih ke \'Tidak ada kelompok\'.</string>
<string name="remove_unused_groups">Menghapus grup yang tidak digunakan</string>
@@ -286,7 +314,10 @@
<string name="sort_alphabetically_name">Akun (A ke Z)</string>
<string name="sort_alphabetically_name_reverse">Akun (Z ke A)</string>
<string name="sort_usage_count">Jumlah penggunaan</string>
<string name="sort_last_used">Terakhir digunakan</string>
<string name="sort_custom">Kustom</string>
<string name="last_used">Terakhir digunakan</string>
<string name="last_used_never">tidak pernah</string>
<string name="new_group">Kelompok baru…</string>
<string name="group">Kelompok</string>
<string name="group_name_hint">Nama kelompok</string>
@@ -405,6 +436,7 @@
<string name="password_strength_fair">Baik</string>
<string name="password_strength_good">Baik</string>
<string name="password_strength_strong">Kuat</string>
<string name="password_strength_unknown">Kata sandi terlalu panjang untuk analisis kekuatan</string>
<string name="pref_pin_keyboard_title">Gunakan keyboard PIN di layar kunci</string>
<string name="pref_pin_keyboard_summary">Aktifkan ini jika Anda ingin mengaktifkan keyboard PIN di layar kunci. Ini hanya berfungsi untuk kata sandi numerik</string>
<string name="title_activity_preferences">Pengaturan</string>
@@ -415,6 +447,7 @@
<string name="title_activity_scan_qr">Pindai kode QR</string>
<string name="title_activity_import_entries">Impor entri</string>
<string name="title_activity_assign_icons">Tetapkan ikon</string>
<string name="title_activity_licenses">Lisensi pihak ketiga</string>
<string name="dialog_wipe_entries_title">Hapus catatan</string>
<string name="dialog_wipe_entries_message">Brankas Anda sudah memiliki catatan. Apakah Anda ingin menghapus catatan ini tanpa mengimpor berkas ini?\n\n<b>Jika ini dilakukan, Anda akan kehilangan akses secara permanen ke catatan yang ada di brankas.</b></string>
<string name="dialog_wipe_entries_checkbox">Hapus konten brankas</string>
@@ -434,6 +467,7 @@
<b>/data/data/com.authy.authy/shared_prefs/com.authy.storage.tokens.authenticator.xml</b>, yang terletak di direktori penyimpanan internal Authy.</string>
<string name="importer_help_andotp">Siapkan berkas ekspor/cadangan andOTP.</string>
<string name="importer_help_bitwarden">Masukkan berkas cadangan/ekspor Bitwarden. Berkas terenkripsi tidak didukung.</string>
<string name="importer_help_battle_net_authenticator">Sediakan salinan <b>/data/data/com.blizzard.messenger/shared_prefs/com.blizzard.messenger.authenticator_preferences.xml</b>, yang terletak di direktori penyimpanan internal Battle.net Authenticator.</string>
<string name="importer_help_duo">Siapkan salinan
<b>/data/data/com.duosecurity.duomobile/files/duokit/accounts.json</b>, yang terletak di direktori penyimpanan internal DUO.</string>
<string name="importer_help_freeotp">Berikan salinan dari <b>/data/data/org.fedorahosted.freeotp/shared_prefs/tokens.xml</b> yang terletak di direktori penyimpanan internal FreeOTP (1.x).</string>
@@ -44,7 +44,6 @@
<string name="pref_account_name_position_title">Mostra il nome dell\'account</string>
<string name="pref_shared_issuer_account_name_title">Mostra il nome dell\'account solo se necessario</string>
<string name="pref_shared_issuer_account_name_summary">Mostra i nomi degli account quando condividono lo stesso servizio. I nomi degli altri account verranno nascosti.</string>
<string name="pref_account_name_position_summary_override">Questa impostazione è sovrascritta dalla visualizzazione a schede. Il nome dell\'account verrà sempre mostrato sotto al servizio.</string>
<string name="pref_import_file_title">Importa da un file</string>
<string name="pref_import_file_summary">Importa i token da un file</string>
<string name="pref_android_backups_title">Backup cloud di Android</string>
@@ -42,7 +42,6 @@
<string name="pref_account_name_position_title">アカウント名を表示</string>
<string name="pref_shared_issuer_account_name_title">必要に応じてアカウント名のみ表示</string>
<string name="pref_shared_issuer_account_name_summary">同じ発行者を共有するたびにアカウント名のみを表示します。他のアカウント名は非表示になります。</string>
<string name="pref_account_name_position_summary_override">この設定はタイル表示モードで上書きされています。アカウント名は常に発行者の下に表示されます。</string>
<string name="pref_import_file_title">ファイルからインポート</string>
<string name="pref_import_file_summary">ファイルからトークンをインポート</string>
<string name="pref_android_backups_title">Androidクラウドバックアップ</string>
@@ -38,7 +38,6 @@
<string name="pref_account_name_position_title">ಖಾತೆಯ ಹೆಸರನ್ನು ತೋರಿಸಿ</string>
<string name="pref_shared_issuer_account_name_title">ಅಗತ್ಯವಿದ್ದಾಗ ಮಾತ್ರ ಖಾತೆಯ ಹೆಸರನ್ನು ತೋರಿಸಿ</string>
<string name="pref_shared_issuer_account_name_summary">ಒಂದೇ ವಿತರಕರನ್ನು ಹಂಚಿಕೊಂಡಾಗ ಮಾತ್ರ ಖಾತೆಯ ಹೆಸರುಗಳನ್ನು ತೋರಿಸಿ. ಇತರ ಖಾತೆಯ ಹೆಸರುಗಳನ್ನು ಮರೆಮಾಡಲಾಗುತ್ತದೆ.</string>
<string name="pref_account_name_position_summary_override">ಈ ಸೆಟ್ಟಿಂಗ್ ಟೈಲ್ಸ್ ವ್ಯೂ ಮೋಡ್‌ನಲ್ಲಿ ಅನ್ವಯಿಸುವುದಿಲ. ಖಾತೆಯ ಹೆಸರನ್ನು ಯಾವಾಗಲೂ ವಿತರಕರ ಕೆಳಗೆ ತೋರಿಸಲಾಗುತ್ತದೆ.</string>
<string name="pref_import_file_title">ಫೈಲಿಂದ ಆಮದಿಸು</string>
<string name="pref_import_file_summary">ಫೈಲ್‌ನಿಂದ ಟೋಕನ್ಗಳ್ಳನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ</string>
<string name="pref_android_backups_title">ಆಂಡ್ರಾಯ್ಡ್ ಕ್ಲೌಡ್ ಬ್ಯಾಕ್‌ಅಪ್‌ಗಳು</string>
+12 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Rādīt konta nosaukumu</string>
<string name="pref_shared_issuer_account_name_title">Radīt konta nosaukumu tikai tad, kad nepieciešams</string>
<string name="pref_shared_issuer_account_name_summary">Rādīt kontu nosaukumu kad vien tiem ir viens un tas pats izdevējs. Citu kontu nosaukums būs paslēpts.</string>
<string name="pref_account_name_position_summary_override">Šis iestatījums netiek ņemts vērā mozaīkas skatā. Konta nosaukums vienmēr tiks parādīts zem izdevēja.</string>
<string name="pref_account_name_position_summary_override">Šis iestatījums netiek ņemts vērā mozaīkas skatā. Konta nosaukums tiks parādīts zem izdevēja.</string>
<string name="pref_import_file_title">Ievietot no datnes</string>
<string name="pref_import_file_summary">Ievietot kodus no datnes</string>
<string name="pref_android_backups_title">Android mākoņa rezerves kopijas</string>
@@ -63,11 +63,13 @@
<string name="pref_backups_trigger_title">Veikt dublēšanu</string>
<string name="pref_backups_trigger_summary">Pašrocīgi veikt dublēšanu</string>
<string name="pref_backups_versions_title">Paturamo rezerves kopiju skaits</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="zero">Paturēt %1$d rezerves kopijas</item>
<item quantity="one">Paturēt %1$d rezerves kopiju</item>
<item quantity="other">Paturēt %1$d rezerves kopijas</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Paturēt neierobežotu skaitu rezerves kopiju</string>
<string name="pref_import_app_title">Ievietot no lietotnes</string>
<string name="pref_import_app_summary">Ievietot kodus no lietotnes (nepieciešama saknes piekļuve)</string>
<string name="pref_export_title">Izgūt</string>
@@ -104,6 +106,12 @@
<string name="pref_encryption_summary">Šifrēt glabātavu un atslēgt to ar paroli vai biometriju</string>
<string name="pref_biometrics_title">Atslēgšana ar biometriju</string>
<string name="pref_biometrics_summary">Ļaut atslēgt glabātavu ar biometriju</string>
<string name="pref_search_behavior_summary">Meklē: %s</string>
<string name="pref_search_behavior_prompt">Meklēt jebkurā no zemāk esošajiem laukiem</string>
<string name="pref_search_behavior_type_name">Nosaukums</string>
<string name="pref_search_behavior_type_issuer">Izsniedzējs</string>
<string name="pref_search_behavior_type_note">Piezīme</string>
<string name="pref_search_behavior_type_groups">Kopas</string>
<string name="pref_set_password_title">Mainīt paroli</string>
<string name="pref_set_password_summary">Uzstādīt jaunu paroli, kas būs nepieciešama, lai atslēgtu glabātavu</string>
<string name="no_events_title">Nav notikumu</string>
@@ -123,9 +131,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Glabātavas atslēgšana neizdevās (biometrija)</string>
<string name="event_description_vault_unlock_failed_biometrics">Mēģinājums atslēgt glabātavu ar biometriju neizdevās</string>
<string name="event_unknown">Nezināms notikuma veids</string>
<string name="audit_log_entry_deleted">(izdzēsts)</string>
<string name="today_at_time">Šodien %1$s</string>
<string name="day_of_week_at_time">%1$s %2$s</string>
<string name="date_format">dd.MM.yyyy.</string>
<string name="export_encrypted">Šifrēt glabātavu</string>
<string name="export_help">Šī darbība izgūs glabātavas saturu no Aegis iekšējās krātuves. Jāatlasa veidols, kurā izgūt datus:</string>
<string name="export_warning_unencrypted">Tiks izgūts nešifrēts Aegis glabātavas atveidojums. <b>Tas nav ieteicams</b>.</string>
@@ -310,6 +318,7 @@
<string name="no_tokens_can_be_imported">Iznākumā nevar ievietot nevienu kodu</string>
<string name="unlocking_vault">Atslēgšana ar biometriju</string>
<string name="rename_group">Pārdēvēt kopu</string>
<string name="no_group_selection">Ja ieraksts nav daļa no kādas kopas, to var atrast zem \"Nav kopas\".</string>
<string name="remove_group">Noņemt kopu</string>
<string name="remove_group_description">Vai tiešām noņemt šo kopu? Tās ieraksti tiks pārmainīti uz \"Nav kopas\".</string>
<string name="remove_unused_groups">Izdzēst neizmantotās kopas</string>
@@ -346,6 +355,7 @@
<string name="pref_minimize_on_copy_title">Samazināt pēc ievietošanas starpliktuvē</string>
<string name="pref_minimize_on_copy_summary">Samazināt lietotni pēc koda ievietošanas starpliktuvē</string>
<string name="pref_copy_behavior_title">Ievietot tekstvienības starpliktuvē</string>
<string name="pref_search_behavior_title">Meklēšanas uzvedība</string>
<string name="pref_pause_entry_title">Iesaldēt kodus pēc piesišanas tiem</string>
<string name="pref_pause_entry_summary">Apturēt kodu atsvaidzināšanu, kad piesit. Kods netiks atjaunots, kamēr vien tas ir izcelts. Ir nepieciešams ieslēgt iestatījumu \"Izcelt kodus, kad piesit\" vai \"Piesist, lai atklātu\".</string>
<string name="pin_keyboard_description">Jāievada parole, lai iespējotu PIN tastatūru. Jāņem vērā, ka tā darbojas tikai tad, ja parole sastāv tikai no cipariem</string>
+12 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Accountnaam tonen</string>
<string name="pref_shared_issuer_account_name_title">Accountnaam alleen indien nodig tonen</string>
<string name="pref_shared_issuer_account_name_summary">Accountnamen alleen tonen wanneer ze dezelfde uitgever hebben. Andere accountnamen worden verborgen.</string>
<string name="pref_account_name_position_summary_override">Deze instelling wordt overschreven door de tegelweergavemodus. Accountnaam wordt altijd getoond onder de uitgever.</string>
<string name="pref_account_name_position_summary_override">Instelling wordt overschreven door de weergavemodus Tegels. Accountnaam wordt getoond onder de uitgever.</string>
<string name="pref_import_file_title">Importeren vanuit een bestand</string>
<string name="pref_import_file_summary">Importeer tokens vanuit een bestand</string>
<string name="pref_android_backups_title">Android-cloudback-ups</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">Maak nu een back-up</string>
<string name="pref_backups_trigger_summary">Handmatig een back-up aanzetten</string>
<string name="pref_backups_versions_title">Aantal versies om te behouden</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Behoud %1$d versie van de back-up</item>
<item quantity="other">Behoud %1$d versies van de back-up</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Oneindig aantal versies van de back-up bewaren</string>
<string name="pref_import_app_title">Importeren vanuit een app</string>
<string name="pref_import_app_summary">Importeer tokens vanuit een app (vereist root-access)</string>
<string name="pref_export_title">Exporteren</string>
@@ -102,6 +104,12 @@
<string name="pref_encryption_summary">Versleutel de kluis en ontgrendel deze met een wachtwoord of biometrie</string>
<string name="pref_biometrics_title">Ontgrendelen met biometrie</string>
<string name="pref_biometrics_summary">Sta biometrische authenticatie toe om de kluis te ontgrendelen</string>
<string name="pref_search_behavior_summary">Zoek door: %s</string>
<string name="pref_search_behavior_prompt">Zoek in een van de volgende velden</string>
<string name="pref_search_behavior_type_name">Naam</string>
<string name="pref_search_behavior_type_issuer">Uitgever</string>
<string name="pref_search_behavior_type_note">Notitie</string>
<string name="pref_search_behavior_type_groups">Groepen</string>
<string name="pref_set_password_title">Wachtwoord wijzigen</string>
<string name="pref_set_password_summary">Stel een nieuw wachtwoord in waarmee je de kluis kunt ontgrendelen</string>
<string name="no_events_title">Geen gerapporteerde gebeurtenissen</string>
@@ -121,9 +129,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Kluis ontgrendelen mislukt (biometrie)</string>
<string name="event_description_vault_unlock_failed_biometrics">Een poging om de kluis te ontgrendelen met biometrie is mislukt</string>
<string name="event_unknown">Onbekende gebeurtenis</string>
<string name="audit_log_entry_deleted">(verwijderd)</string>
<string name="today_at_time">Vandaag om %1$s</string>
<string name="day_of_week_at_time">%1$s om %2$s</string>
<string name="date_format">dd-mm-jjjj</string>
<string name="export_encrypted">Kluis versleutelen</string>
<string name="export_help">Deze actie zal de kluis exporteren uit de interne opslag van Aegis. Selecteer het formaat waarin je de export wilt:</string>
<string name="export_warning_unencrypted">Je staat op het punt een onversleutelde kopie van de Aegis-kluis te exporteren. <b>Dit wordt niet aanbevolen</b>.</string>
@@ -302,6 +310,7 @@
<string name="no_tokens_can_be_imported">Hierdoor kunnen geen tokens worden geïmporteerd</string>
<string name="unlocking_vault">Kluis wordt ontgrendeld</string>
<string name="rename_group">Groep hernoemen</string>
<string name="no_group_selection">Als een item niet in een groep zit, kan dit worden gevonden onder Geen groep.</string>
<string name="remove_group">Groep verwijderen</string>
<string name="remove_group_description">Weet je zeker dat je deze groep wilt verwijderen? Alle items binnen deze groep worden automatisch verplaatst naar Geen groep.</string>
<string name="remove_unused_groups">Ongebruikte groepen verwijderen</string>
@@ -338,6 +347,7 @@
<string name="pref_minimize_on_copy_title">Na kopiëren minimaliseren</string>
<string name="pref_minimize_on_copy_summary">Na kopiëren van een code de app minimaliseren</string>
<string name="pref_copy_behavior_title">Codes naar het klembord kopiëren</string>
<string name="pref_search_behavior_title">Zoekgedrag</string>
<string name="pref_pause_entry_title">Codes bevriezen na aantikken</string>
<string name="pref_pause_entry_summary">Pauzeer automatisch verversen van codes door erop te tikken. Codes zullen niet worden bijgewerkt zolang ze gefocust zijn. Vereist Codes markeren na aantikken of Aantikken om te laten zien.</string>
<string name="pin_keyboard_description">Voer je wachtwoord in om het PIN-toetsenbord in te schakelen. Let op: dit werkt alleen als je wachtwoord uit cijfers bestaat</string>
+1 -2
View File
@@ -46,7 +46,6 @@
<string name="pref_account_name_position_title">Pokaż nazwę konta</string>
<string name="pref_shared_issuer_account_name_title">Pokaż nazwę konta tylko w razie potrzeby</string>
<string name="pref_shared_issuer_account_name_summary">Pokazuj nazwy kont tylko, gdy są z tego samego wydawcy. Inne nazwy kont zostaną ukryte.</string>
<string name="pref_account_name_position_summary_override">To ustawienie jest nadpisane przez tryb wyświetlania pól. Nazwa konta będzie zawsze wyświetlana pod wydawcą.</string>
<string name="pref_import_file_title">Importuj z pliku</string>
<string name="pref_import_file_summary">Importuj tokeny z aplikacji</string>
<string name="pref_android_backups_title">Kopia zapasowa Android w chmurze</string>
@@ -127,7 +126,6 @@
<string name="event_unknown">Nieznany typ zdarzenia</string>
<string name="today_at_time">Dzisiaj o %1$s</string>
<string name="day_of_week_at_time">%1$s o %2$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">Zaszyfruj sejf</string>
<string name="export_help">Ta czynność wyeksportuje sejf z wewnętrznej przestrzeni dyskowej aplikacji Aegis. Wybierz format eksportowanego pliku:</string>
<string name="export_warning_unencrypted">Wyeksportujesz sejf aplikacji Aegis w niezaszyfrowanym formacie. <b>Ta opcja nie jest zalecana</b>.</string>
@@ -318,6 +316,7 @@
<string name="no_tokens_can_be_imported">Nie można zaimportować żadnych tokenów</string>
<string name="unlocking_vault">Odblokowywanie sejfu</string>
<string name="rename_group">Zmień Nazwę Grupy</string>
<string name="no_group_selection">Jeśli wpis nie jest częścią żadnej grupy, można go znaleźć pod \"Brak grupy\".</string>
<string name="remove_group">Usuń grupę</string>
<string name="remove_group_description">Czy na pewno chcesz usunąć tę grupę? Wpisy z tej grupy zostaną automatycznie przeniesione do kategorii \'Brak grupy\'.</string>
<string name="remove_unused_groups">Usuń nieużywane grupy</string>
+18 -8
View File
@@ -10,7 +10,7 @@
<string name="action_default_icon">Restaurar ícone padrão</string>
<string name="discard">Descartar</string>
<string name="save">Salvar</string>
<string name="issuer">Nome do serviço</string>
<string name="issuer">Emissor</string>
<string name="yandex_pin">PIN (416 dígitos)</string>
<string name="motp_pin">PIN (4 dígitos)</string>
<string name="suggested">Sugerido</string>
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Mostrar nome da conta</string>
<string name="pref_shared_issuer_account_name_title">Exibir o nome da conta apenas quando necessário</string>
<string name="pref_shared_issuer_account_name_summary">Mostra os nomes de conta apenas quando eles compartilham o mesmo emissor. Outros nomes de conta serão ocultados.</string>
<string name="pref_account_name_position_summary_override">Esta configuração é substituída pelo modo de visualização em grade. O nome da conta será sempre mostrado abaixo do emissor.</string>
<string name="pref_account_name_position_summary_override">Esta configuração é substituída pelo modo de visualização em grade. O nome da conta será mostrado abaixo do emissor.</string>
<string name="pref_import_file_title">Importar de arquivo</string>
<string name="pref_import_file_summary">Importa tokens de um arquivo</string>
<string name="pref_android_backups_title">Backups na nuvem do Android</string>
@@ -63,10 +63,12 @@
<string name="pref_backups_trigger_title">Ativar backup</string>
<string name="pref_backups_trigger_summary">Ativa manualmente um backup</string>
<string name="pref_backups_versions_title">Número de versões a manter</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Manter %1$d versão do backup</item>
<item quantity="other">Manter %1$d versões do backup</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Manter um número infinito de versões do backup</string>
<string name="pref_import_app_title">Importar de um app</string>
<string name="pref_import_app_summary">Importa tokens de um app (requer acesso root)</string>
<string name="pref_export_title">Exportar</string>
@@ -102,6 +104,12 @@
<string name="pref_encryption_summary">Criptografa o cofre e o desbloqueia com uma senha ou biometria</string>
<string name="pref_biometrics_title">Desbloqueio biométrico</string>
<string name="pref_biometrics_summary">Permite autenticação por biometria para desbloquear o cofre</string>
<string name="pref_search_behavior_summary">Pesquisar por %s</string>
<string name="pref_search_behavior_prompt">Pesquisar em qualquer um dos seguintes campos</string>
<string name="pref_search_behavior_type_name">Nome</string>
<string name="pref_search_behavior_type_issuer">Emissor</string>
<string name="pref_search_behavior_type_note">Nota</string>
<string name="pref_search_behavior_type_groups">Grupos</string>
<string name="pref_set_password_title">Trocar senha</string>
<string name="pref_set_password_summary">Define uma nova senha que será necessária para desbloquear o cofre</string>
<string name="no_events_title">Nenhum evento reportado</string>
@@ -121,9 +129,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Falha ao desbloquear o cofre (biometria)</string>
<string name="event_description_vault_unlock_failed_biometrics">Uma tentativa de desbloquear o cofre com a biometria falhou</string>
<string name="event_unknown">Tipo de evento desconhecido</string>
<string name="audit_log_entry_deleted">(excluído)</string>
<string name="today_at_time">Hoje às %1$s</string>
<string name="day_of_week_at_time">%1$s em %2$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">Criptografar o cofre</string>
<string name="export_help">Esta ação irá exportar o cofre para fora do armazenamento interno do Aegis. Selecione o formato em que você gostaria que sua exportação esteja:</string>
<string name="export_warning_unencrypted">Você está prestes a exportar uma cópia não criptografada de seu cofre Aegis. <b>Isso não é recomendado</b>.</string>
@@ -302,6 +310,7 @@
<string name="no_tokens_can_be_imported">Como resultado, nenhum token pode ser importado</string>
<string name="unlocking_vault">Desbloqueando o cofre</string>
<string name="rename_group">Renomear Grupo</string>
<string name="no_group_selection">Se um item não faz parte de qualquer grupo, ele pode ser encontrada em \"Sem grupo\".</string>
<string name="remove_group">Remover grupo</string>
<string name="remove_group_description">Você tem certeza que deseja remover esse grupo? Entradas nesse grupo serão automaticamente para \'Sem grupo\'.</string>
<string name="remove_unused_groups">Excluir grupos não utilizados</string>
@@ -314,10 +323,10 @@
<string name="name">Conta</string>
<string name="no_group">Sem grupo</string>
<string name="sort" comment="Title of the Sort button in the top action bar of the main view">Ordenar</string>
<string name="sort_alphabetically">Nome (A to Z)</string>
<string name="sort_alphabetically_reverse">Nome (Z to A)</string>
<string name="sort_alphabetically_name">Conta (A to Z)</string>
<string name="sort_alphabetically_name_reverse">Conta (Z to A)</string>
<string name="sort_alphabetically">Emissor (A a Z)</string>
<string name="sort_alphabetically_reverse">Emissor (Z a A)</string>
<string name="sort_alphabetically_name">Conta (A a Z)</string>
<string name="sort_alphabetically_name_reverse">Conta (Z a A)</string>
<string name="sort_usage_count">Contagem de uso</string>
<string name="sort_last_used">Último uso</string>
<string name="sort_custom">Personalizado</string>
@@ -338,6 +347,7 @@
<string name="pref_minimize_on_copy_title">Minimizar ao copiar</string>
<string name="pref_minimize_on_copy_summary">Minimizar o aplicativo após copiar um token</string>
<string name="pref_copy_behavior_title">Copiar tokens para a área de transferência</string>
<string name="pref_search_behavior_title">Comportamento de pesquisa</string>
<string name="pref_pause_entry_title">Congelar tokens quando tocados</string>
<string name="pref_pause_entry_summary">Pausa a atualização automática dos tokens ao tocá-los. Tokens não serão atualizados desde que o foco esteja neles. Requer \"Destacar tokens quando tocados\" ou \"Tocar para exibir\".</string>
<string name="pin_keyboard_description">Digite sua senha para ativar o teclado PIN. Observe que isso só funciona se a sua senha for constituída apenas por números</string>
@@ -354,7 +364,7 @@
<string name="compact_mode_title">Compacto</string>
<string name="small_mode_title">Pequeno</string>
<string name="tiles_mode_title">Grade</string>
<string name="unknown_issuer">Nome do serviço desconhecido</string>
<string name="unknown_issuer">Emissor desconhecido</string>
<string name="unknown_account_name">Nome da conta desconhecido</string>
<plurals name="import_error_dialog">
<item quantity="one">Aegis não pôde importar %d token. Esse token será ignorado. Pressione \'detalhes\' para ver mais informações sobre o erro.</item>
+195 -57
View File
@@ -28,11 +28,15 @@
<string name="pref_section_security_summary">Configurar criptografia, desbloqueio biométrico, bloqueio automático e outras definições de segurança.</string>
<string name="pref_section_import_export_title">Importar e exportar</string>
<string name="pref_section_import_export_summary">Importar backups Aegis ou de outras aplicações de autenticação. Crie exportações manuais do seu cofre Aegis.</string>
<string name="pref_section_audit_log_title">Registo de auditoria</string>
<string name="pref_section_audit_log_summary">Encontre uma lista de todos os eventos importantes relatados que ocorreram na aplicação.</string>
<string name="pref_section_backups_title">Backups</string>
<string name="pref_section_backups_summary">Configure backups automáticos para uma localização à escolha ou ative a possibilidade de backup na nuvem Android.</string>
<string name="pref_section_icon_packs">Pacotes de ícones</string>
<string name="pref_section_icon_packs_summary">Gerir e importar pacotes de ícones</string>
<string name="pref_select_theme_title">Tema</string>
<string name="pref_dynamic_colors_title">Cores dinâmicas</string>
<string name="pref_dynamic_colors_summary">Aplicar uma sobreposição baseada nas cores do seu tema Android</string>
<string name="pref_view_mode_title">Modo de exibição</string>
<string name="pref_lang_title">Idioma</string>
<string name="pref_show_icons_title">Mostrar ícones</string>
@@ -42,7 +46,6 @@
<string name="pref_account_name_position_title">Mostrar nome da conta</string>
<string name="pref_shared_issuer_account_name_title">Exibir o nome da conta apenas quando necessário</string>
<string name="pref_shared_issuer_account_name_summary">Mostrar apenas os nomes das contas sempre que estas partilhem o mesmo titular. Os outros nomes de contas serão ocultados.</string>
<string name="pref_account_name_position_summary_override">Esta definição é anulada pelo modo de visualização em mosaico. O nome da conta será sempre apresentado por baixo do emissor.</string>
<string name="pref_import_file_title">Importar de um ficheiro</string>
<string name="pref_import_file_summary">Importar \'tokens\' de um ficheiro</string>
<string name="pref_android_backups_title">Backups na nuvem Android</string>
@@ -100,6 +103,25 @@
<string name="pref_biometrics_summary">Permitir autenticação biométrica para desbloquear o cofre</string>
<string name="pref_set_password_title">Alterar palavra-passe</string>
<string name="pref_set_password_summary">Defina a palavra-passe que será utilizada para desbloquear o cofre</string>
<string name="no_events_title">Sem eventos relatados</string>
<string name="no_events_description">Nenhum evento importante foi relatado na aplicação</string>
<string name="event_title_vault_unlocked">Cofre desbloqueado</string>
<string name="event_description_vault_unlocked">O cofre foi desbloqueado com sucesso</string>
<string name="event_title_backup_created">Backup criado</string>
<string name="event_description_backup_created">Um backup do cofre foi criado com sucesso</string>
<string name="event_title_android_backup_created">Backup criado pelo Android</string>
<string name="event_description_android_backup_created">Um backup do cofre foi criado com sucesso pelo Android</string>
<string name="event_title_vault_exported">Cofre exportado</string>
<string name="event_description_vault_exported">Uma cópia do cofre foi exportada</string>
<string name="event_title_entry_shared">Entrada partilhada</string>
<string name="event_description_entry_shared">Uma entrada foi partilhada</string>
<string name="event_title_vault_unlock_failed_password">O desbloqueio do cofre falhou (palavra-passe)</string>
<string name="event_description_vault_unlock_failed_password">Falha ao tentar desbloquear o cofre com a palavra-passe</string>
<string name="event_title_vault_unlock_failed_biometrics">O desbloqueio do cofre falhou (biometria)</string>
<string name="event_description_vault_unlock_failed_biometrics">Falha ao tentar desbloquear o cofre com biometria</string>
<string name="event_unknown">Tipo de evento desconhecido</string>
<string name="today_at_time">Hoje às %1$s</string>
<string name="day_of_week_at_time">%1$s às %2$s</string>
<string name="export_encrypted">Cifrar cofre</string>
<string name="export_help">Esta ação irá exportar o cofre para fora do armazenamento interno do Aegis. Selecione o formato para a exportação:</string>
<string name="export_warning_unencrypted">Está prestes a exportar uma cópia não cifrada do seu cofre Aegis. <b>Isto não é recomendado</b>.</string>
@@ -111,15 +133,19 @@
<string name="export_format_hint">Formato de exportação</string>
<string name="export_all_groups">Exportar todos os grupos</string>
<string name="export_choose_groups">Selecionar os grupos a exportar</string>
<plurals name="export_groups_selected_count">
<item quantity="one">%d grupo selecionado</item>
<item quantity="other">%d grupos selecionados</item>
</plurals>
<string name="export_no_groups_selected">Nenhum grupo selecionado para exportar</string>
<string name="export_html_title" comment="The title of an HTML export document">Exportação do Aegis Authenticator</string>
<string name="choose_authentication_method">Segurança</string>
<string name="authentication_method_explanation">Aegis é um aplicativo 2FA focado na segurança. Tokens são armazenados em um cofre, que pode opcionalmente ser criptografado com uma senha de sua escolha. Se um invasor obtiver o seu arquivo criptografado do cofre, eles não serão capazes de acessar o conteúdo sem saber a senha.\n\nNós pré-selecionamos a opção que achamos que seria melhor para o seu dispositivo.</string>
<string name="authentication_method_explanation">Aegis é uma aplicação 2FA focada em segurança. Tokens são armazenados num cofre, que pode opcionalmente ser criptografado com uma palavra-passe da sua escolha. Se um invasor obtiver o ficheiro criptografado do cofre, ele não conseguirá aceder ao conteúdo sem saber a palavra-passe.\n\nA opção que achamos que seria melhor para o seu dispositivo foi pré-selecionada.</string>
<string name="authentication_method_none">Nenhum</string>
<string name="authentication_method_none_description">Nenhuma senha é necessária para desbloquear o cofre e não será criptografada. <b>Esta opção não é recomendada</b>.</string>
<string name="authentication_method_none_description">Não será necessária uma palavra-passe para desbloquear o cofre e este não será encriptado. <b>Esta opção não é recomendada</b>.</string>
<string name="authentication_method_password">Senha</string>
<string name="authentication_method_password_description">É necessária uma senha para desbloquear o cofre.</string>
<string name="authentication_method_password_explanation">Aviso: Se você esquecer sua senha, você perderá permanentemente o acesso aos seus tokens. Não há como recuperá-los sem a senha.</string>
<string name="authentication_method_password_description">É necessária uma palavra-passe para desbloquear o cofre.</string>
<string name="authentication_method_password_explanation">Aviso: Se se esquecer da sua palavra-passe, perderá permanentemente o acesso aos seus tokens. Não há como recuperá-los sem a mesma.</string>
<string name="authentication_method_biometrics">Biometria</string>
<string name="authentication_method_biometrics_description">Além de uma senha, a biometria registrada neste dispositivo, como uma impressão digital ou seu rosto, pode ser usada para desbloquear o cofre.</string>
<string name="authentication">Desbloquear o cofre</string>
@@ -140,7 +166,7 @@
<string name="password_reminder_freq_monthly">Mensal</string>
<string name="password_reminder_freq_quarterly">Trimestral</string>
<string name="enter_password_2fas_message">Parece que esta cópia de segurança 2FAS está encriptada. Introduza abaixo a palavra-passe.</string>
<string name="enter_password_authy_message">Parece que seus tokens Authy são criptografados. Por favor, feche o Aegis, abra o Authy e desbloqueie os tokens com sua senha. Em vez disso, Aegis também pode tentar descriptografar seus tokens Authy para você, se você inserir sua senha abaixo.</string>
<string name="enter_password_authy_message">Parece que os seus tokens do Authy estão encriptados. Por favor, feche o Aegis, abra o Authy e desbloqueie os tokens com a sua palavra-passe. Em vez disso, o Aegis também pode tentar desencriptar os seus tokens do Authy por si, se inserir a sua palavra-passe abaixo.</string>
<string name="enter_password_aegis_title">Por favor, introduza a palavra-passe de importação</string>
<string name="period_hint">Período (segundos)</string>
<string name="algorithm_hint">Função hash</string>
@@ -155,9 +181,9 @@
<string name="digits">Dígitos</string>
<string name="secret">Secreto</string>
<string name="scan">Escanear código QR</string>
<string name="scan_image">Escanear imagem</string>
<string name="scan_image">Digitalizar imagem</string>
<string name="enter_manually">Inserir manualmente</string>
<string name="set_up_biometric">Configurar desbloqueio biométrico</string>
<string name="set_up_biometric">Configurar o desbloqueio biométrico</string>
<string name="copy">Copiar</string>
<string name="edit">Editar</string>
<string name="select_all">Selecionar tudo</string>
@@ -165,93 +191,121 @@
<string name="favorite" comment="Verb">Favorito</string>
<string name="unfavorite" comment="Verb">Remover dos favoritos</string>
<string name="error_all_caps">ERRO</string>
<string name="password">Senha</string>
<string name="password">Palavra-passe</string>
<string name="confirm_password">Confirme a Senha</string>
<string name="show_password">Mostrar senha</string>
<string name="new_entry">Nova entrada</string>
<string name="add_new_entry">Adicionar nova entrada</string>
<string name="unlock_vault_error">Falha ao desbloquear cofre</string>
<string name="unlock_vault_error_description">Senha incorreta. Certifique-se de que não digitou incorretamente sua senha.</string>
<string name="password_equality_error">As senhas devem ser idênticas e não vazias</string>
<string name="unlock_vault_error">Não foi possível desbloquear o cofre</string>
<string name="unlock_vault_error_description">Palavra-passe incorreta. Certifique-se de que não a digitou incorretamente.</string>
<string name="password_equality_error">As palavras-passe devem ser idênticas e não vazias</string>
<string name="snackbar_authentication_method">Por favor, selecione um método de autenticação</string>
<string name="encrypting_vault">Criptografando o cofre</string>
<string name="exporting_vault">Exportando o cofre</string>
<string name="encrypting_vault">A encriptar o cofre</string>
<string name="exporting_vault">A exportar o cofre</string>
<string name="reading_file">A ler o ficheiro</string>
<string name="requesting_root_access">Pedir acesso root</string>
<string name="analyzing_qr">A analisar o código QR</string>
<string name="analyzing_qr_multiple">A analisar o código QR %d/%d (%s)</string>
<plurals name="added_new_entries">
<item quantity="one">Adicionada %d nova entrada ao cofre</item>
<item quantity="other">Adicionadas %d novas entradas ao cofre</item>
</plurals>
<string name="importing_icon_pack">A importar o pacote de ícones</string>
<string name="delete_entry">Excluir entrada</string>
<string name="delete_entry">Eliminar entrada</string>
<string name="delete_entry_description">Tem a certeza de que quer excluir esta entrada?</string>
<string name="delete_entries">Excluir entradas</string>
<string name="delete_entry_explanation">Esta ação não desativa a 2FA para:\n<b>%s</b>\n\nPara evitar a perda de acesso, certifique-se de que desativou a 2FA ou de que tem uma forma alternativa de gerar códigos para este serviço.</string>
<string name="delete_entries">Eliminar entradas</string>
<plurals name="delete_entries_description">
<item quantity="one">Você tem certeza que deseja deletar %d entrada?</item>
<item quantity="other">Você tem certeza que deseja deletar %d entradas?</item>
</plurals>
<string name="discard_changes">Descartar alterações?</string>
<string name="discard_changes_description">Suas alterações não foram salvas</string>
<string name="saving_profile_error">Erro ao salvar perfil</string>
<string name="discard_changes_description">As suas alterações não foram guardadas</string>
<string name="saving_profile_error">Erro ao guardar o perfil</string>
<string name="saving_assign_icons_error">Erro ao atribuir ícones</string>
<string name="welcome">Bem-vindo</string>
<string name="app_description">Aegis é um aplicativo 2FA gratuito, seguro e opensource</string>
<string name="app_description">Aegis é uma aplicação 2FA gratuita, segura e open source</string>
<string name="setup_completed">Configuração concluída</string>
<string name="setup_completed_description">Aegis foi configurado e está pronto para uso.</string>
<string name="vault_not_found">Cofre não encontrado, iniciando configuração…</string>
<string name="vault_not_found">Cofre não encontrado, a iniciar configuração…</string>
<string name="copied">Copiado</string>
<string name="errors_copied">Erros copiados para a área de transferência</string>
<string name="version_copied">Versão copiada para área de transferência</string>
<string name="version_copied">Versão copiada para a área de transferência</string>
<string name="error_occurred">Ocorreu um erro</string>
<string name="decryption_error">Ocorreu um erro ao tentar desbloquear o cofre</string>
<string name="decryption_corrupt_error">Ocorreu um erro ao tentar desbloquear o cofre. O seu arquivo de cofre pode estar corrompido.</string>
<string name="saving_error">Ocorreu um erro ao tentar salvar o cofre</string>
<string name="vault_init_error">Ocorreu um erro ao tentar inicializar o cofre</string>
<string name="decryption_corrupt_error">Ocorreu um erro ao tentar desbloquear o cofre. O ficheiro do cofre pode estar corrompido.</string>
<string name="saving_error">Ocorreu um erro ao tentar guardar o cofre</string>
<string name="vault_init_error">Ocorreu um erro ao tentar iniciar o cofre</string>
<string name="vault_load_error">Ocorreu um erro ao tentar carregar o cofre do armazenamento</string>
<string name="biometric_decrypt_error">Ocorreu um erro ao tentar descriptografar o cofre com autenticação biométrica. Isso geralmente só acontece se as configurações de segurança do seu dispositivo foram alteradas. Por favor, desbloqueie o cofre com sua senha e reconfigure a autenticação biométrica nas configurações do Aegis.</string>
<string name="biometric_init_error">Ocorreu um erro ao tentar preparar a autenticação biométrica. Isso geralmente só acontece se as configurações de segurança do seu dispositivo foram alteradas. Por favor, desbloqueie o cofre com sua senha e reconfigure a autenticação biométrica nas configurações do Aegis.</string>
<string name="disable_encryption">Desativar criptografia</string>
<string name="enable_encryption_error">Ocorreu um erro ao ativar a criptografia</string>
<string name="disable_encryption_error">Ocorreu um erro ao desativar a criptografia</string>
<string name="backup_successful">O backup foi agendado com sucesso</string>
<string name="backup_error">Ocorreu um erro ao tentar criar um backup</string>
<string name="biometric_decrypt_error">Ocorreu um erro ao tentar desencriptar o cofre com autenticação biométrica. Isto só acontece normalmente se as definições de segurança do seu dispositivo foram alteradas. Por favor, desbloqueie o cofre com a sua palavra-passe e redefina a autenticação biométrica nas configurações do Aegis.</string>
<string name="biometric_init_error">Ocorreu um erro ao tentar preparar a autenticação biométrica. Isto só acontece normalmente se as definições de segurança do seu dispositivo foram alteradas. Por favor, desbloqueie o cofre com a sua palavra-passe e redefina a autenticação biométrica nas configurações do Aegis.</string>
<string name="disable_encryption">Desativar encriptação</string>
<string name="disable_encryption_description">Tem a certeza de que deseja desativar a encriptação? Isto fará com que o cofre seja armazenado em texto simples. <b>Os backups automáticos também serão desativados</b>.</string>
<string name="enable_encryption_error">Ocorreu um erro ao ativar a encriptação</string>
<string name="disable_encryption_error">Ocorreu um erro ao desativar a encriptação</string>
<string name="backup_successful">O backup foi agendado com sucesso</string>
<string name="backup_error">Ocorreu um erro ao tentar criar um backup</string>
<string name="backup_status_success">Backup mais recente realizado com sucesso: %s</string>
<string name="backup_status_failed">A realização de um backup recente falhou: %s</string>
<string name="backup_status_none">Ainda não houve nenhum backup realizado</string>
<string name="backup_warning_password">Os backups são encriptados utilizando uma palavra-passe separada configurada nas definições de segurança</string>
<string name="documentsui_error">O módulo DocumentsUI parece estar em falta no seu dispositivo. Trata-se de um componente do sistema necessário para a seleção e criação de documentos. Se utilizou uma ferramenta para &quot;limpar&quot; o seu dispositivo, pode tê-lo eliminado acidentalmente e terá de o reinstalar.</string>
<string name="icon_pack_import_error">Ocorreu um erro durante o processo de importação do pacote de ícones</string>
<string name="icon_pack_import_exists_error">O pacote de ícones que tenta importar já existe. Pretende substituí-lo?</string>
<string name="icon_pack_delete_error">Ocorreu um erro durante o processo de exclusão de um pacote de ícones</string>
<plurals name="icon_pack_info">
<item quantity="one">%d ícone</item>
<item quantity="other">%d ícones</item>
</plurals>
<string name="icon_custom">Personalizar</string>
<string name="permission_denied">Permissão negada</string>
<string name="andotp_new_format">Novo formato (v0.6.3 ou mais recente) </string>
<string name="andotp_old_format">Formato antigo (v0.6.2 ou antigo) </string>
<string name="choose_andotp_importer">Qual o formato do arquivo de backup andOTP?</string>
<string name="choose_totpauth_importer">Este backup TOTP Authenticator é criptografado com uma senha?</string>
<string name="choose_application">Selecione o aplicativo do qual você gostaria de importar</string>
<string name="choose_application">Selecione a aplicação da qual gostaria de importar</string>
<string name="choose_theme">Selecione o tema</string>
<string name="choose_account_name_position">Selecione a posição do nome da conta desejada</string>
<string name="choose_view_mode">Selecione o modo de visualização</string>
<string name="choose_copy_behavior">Selecione o estilo de cópia que deseja efetuar </string>
<string name="parsing_file_error">Ocorreu um erro ao tentar analisar o arquivo</string>
<string name="file_not_found">Erro: Arquivo não encontrado</string>
<string name="reading_file_error">Ocorreu um erro ao tentar ler o arquivo</string>
<string name="app_lookup_error">Erro: O aplicativo não está instalado</string>
<string name="parsing_file_error">Ocorreu um erro ao tentar analisar o ficheiro</string>
<string name="file_not_found">Erro: Ficheiro não encontrado</string>
<string name="reading_file_error">Ocorreu um erro ao tentar ler o ficheiro</string>
<string name="app_lookup_error">Erro: A aplicação não está instalada</string>
<string name="app_version_error">A versão de %s que está instalada não é suportada. As versões recentes começaram a encriptar alguns dos ficheiros no armazenamento interno, tornando o Aegis incapaz de aceder às informações necessárias para a importação. É provável que a tentativa de importação resulte num erro. Gostaria de continuar na mesma?</string>
<string name="root_error">Erro: Não é possível obter acesso root</string>
<plurals name="imported_entries_count">
<item quantity="one">%d entrada importada</item>
<item quantity="other">%d entradas importadas</item>
</plurals>
<plurals name="entries_shown">
<item quantity="one">A mostrar %d entrada</item>
<item quantity="other">A mostrar %d entradas</item>
</plurals>
<string name="intro_import_error_title">Ocorreu um erro ao importar o cofre</string>
<string name="import_error_title">Um ou mais erros ocorreram durante a importação</string>
<string name="exporting_vault_error">Ocorreu um erro ao tentar exportar o cofre</string>
<string name="exported_vault">O cofre foi exportado</string>
<string name="encryption_set_password_error">Ocorreu um erro ao tentar definir a senha.</string>
<string name="encryption_enable_biometrics_error">Ocorreu um erro ao tentar ativar o desbloqueio biométrico. Alguns dispositivos têm implementações deficientes da autenticação biométrica e é provável que o seu seja um deles. Considere alternar para uma configuração somente senha.</string>
<string name="no_cameras_available">Nenhuma câmera disponível</string>
<string name="encryption_set_password_error">Ocorreu um erro ao tentar definir a palavra-passe.</string>
<string name="encryption_enable_biometrics_error">Ocorreu um erro ao tentar ativar o desbloqueio biométrico. Alguns dispositivos têm más implementações da autenticação biométrica e é provável que o seu seja um deles. Considere mudar para uma configuração com apenas palavra-passe.</string>
<string name="no_cameras_available">Nenhuma câmara disponível</string>
<string name="read_qr_error">Ocorreu um erro ao tentar ler o código QR</string>
<string name="read_qr_error_phonefactor">Aegis é incompatível com o algoritmo 2FA das propriedades da Microsoft. Por favor, selecione \"Configurar aplicação sem notificações\" quando configurar 2FA no Office 365. </string>
<string name="partial_google_auth_import">Foi detetada uma exportação incompleta do Google Authenticator </string>
<string name="missing_qr_code_descriptor">• QR code %d</string>
<string name="partial_google_auth_import_warning">Faltam alguns códigos QR na sua importação. Os seguintes códigos não foram encontrados:\n\n<b>%s</b>\n\nPode continuar a importar esta exportação parcial, mas recomendamos que tente novamente com todos os códigos QR para não correr o risco de perder o acesso a quaisquer tokens.</string>
<string name="missing_qr_code_descriptor">• Código QR %d</string>
<string name="import_partial_export_anyway">Importar %d tokens mesmo assim </string>
<string name="unlocking_vault">Desbloqueando o cofre</string>
<string name="import_google_auth_failure">Falha ao importar a exportação do Google Authenticator</string>
<string name="unrelated_google_auth_batches_error">A exportação contém informações para um lote não relacionado. Experimente importar um lote de cada vez.</string>
<string name="no_tokens_can_be_imported">Nenhum token pode ser importado como resultado</string>
<string name="unlocking_vault">A desbloquear o cofre</string>
<string name="rename_group">Mudar o nome do grupo</string>
<string name="remove_group">Remover grupo</string>
<string name="remove_group_description">Tem certeza que deseja remover este grupo? As entradas neste grupo automaticamente alternarão para \'Sem grupo\'.</string>
<string name="remove_group_description">Tem a certeza de que pretende remover este grupo? As entradas neste grupo mudarão automaticamente para \'Sem grupo\'.</string>
<string name="remove_unused_groups">Apagar grupos não utilizados</string>
<string name="remove_unused_groups_description">Tem a certeza de que pretende eliminar todos os grupos que não estão atribuídos a uma entrada?</string>
<string name="remove_icon_pack">Remover pacote de ícones</string>
<string name="remove_icon_pack_description">Tem a certeza de que pretende remover este pacote de ícones? As entradas que utilizam ícones deste pacote não serão afetadas.</string>
<string name="details">Detalhes</string>
<string name="show_error_details">Mostrar detalhes do erro</string>
<string name="lock">Bloquear</string>
@@ -262,19 +316,28 @@
<string name="sort_alphabetically_reverse">Emissor (Z a A)</string>
<string name="sort_alphabetically_name">Conta (A a Z)</string>
<string name="sort_alphabetically_name_reverse">Conta (Z a A)</string>
<string name="sort_usage_count">Número de utilizações</string>
<string name="sort_last_used">Última utilização</string>
<string name="sort_custom">Personalizado</string>
<string name="last_used">Última utilização</string>
<string name="last_used_never">nunca</string>
<string name="new_group">Novo grupo…</string>
<string name="group">Grupo</string>
<string name="group_name_hint">Nome do grupo</string>
<string name="preference_manage_groups">Editar grupos</string>
<string name="preference_manage_groups_summary">Gerenciar e excluir seus grupos aqui</string>
<string name="preference_manage_groups_summary">Gira e elimine os seus grupos aqui</string>
<string name="preference_reset_usage_count">Repor a contagem de utilização</string>
<string name="preference_reset_usage_count_summary">Repor a contagem de utilização de cada entrada no seu cofre</string>
<string name="preference_reset_usage_count_dialog">Tem a certeza de que pretende definir a contagem de utilização de cada entrada no seu cofre como 0?</string>
<string name="note" comment="Users can add a note to an entry">Nota</string>
<string name="clear">Limpar</string>
<string name="pref_highlight_entry_title">Destacar tokens quando tocados</string>
<string name="pref_highlight_entry_title">Realçar tokens quando tocados</string>
<string name="pref_highlight_entry_summary">Faça com que os tokens sejam mais fáceis de distinguir um do outro destacando-os temporariamente ao tocá-los</string>
<string name="pref_minimize_on_copy_title">Minimizar ao copiar</string>
<string name="pref_minimize_on_copy_summary">Após copiar um token, minimizar a aplicação </string>
<string name="pref_copy_behavior_title">Copiar tokens para a área de transferência</string>
<string name="pref_pause_entry_title">Congelar tokens quando tocados</string>
<string name="pref_pause_entry_summary">Pausar a atualização automática dos tokens ao tocar neles. Os tokens não serão atualizados desde que estejam em foco. Requer \"Realçar tokens quando tocados\" ou \"Toque para mostrar\".</string>
<string name="pin_keyboard_description">Digite sua senha para ativar o teclado PIN. Observe que isso só funciona se a sua senha for constituída apenas por números</string>
<string name="pin_keyboard_error">Erro ao habilitar o teclado PIN</string>
<string name="pin_keyboard_error_description">Não é possível configurar o teclado PIN. A sua senha deve ser composta apenas por números.</string>
@@ -288,24 +351,33 @@
<string name="normal_viewmode_title">Normal</string>
<string name="compact_mode_title">Compacto</string>
<string name="small_mode_title">Pequena</string>
<string name="tiles_mode_title">Blocos</string>
<string name="unknown_issuer">Emissor desconhecido</string>
<string name="unknown_account_name">Nome de conta desconhecido</string>
<plurals name="import_error_dialog">
<item quantity="one">O Aegis não conseguiu importar %d token. Este token será ignorado. Prima \"detalhes\" para obter mais informações sobre o erro.</item>
<item quantity="other">O Aegis não conseguiu importar %d tokens. Estes tokens serão ignorados. Prima \"detalhes\" para obter mais informações sobre os erros.</item>
</plurals>
<string name="unable_to_process_deeplink">Não é possível processar a ligação profunda</string>
<string name="unable_to_read_qrcode_file">Não foi possível ler e processar o código QR do ficheiro: %s.</string>
<string name="unable_to_process_shared_text">Não é possível processar o texto partilhado como OTP</string>
<string name="unable_to_read_qrcode_files">Não é possível ler e processar alguns dos códigos QR. Apenas serão importadas %d/%d entradas.</string>
<string name="unable_to_generate_qrcode">Não foi possível gerar o código QR</string>
<string name="select_picture">Selecionar imagem</string>
<string name="select_icon">Selecionar ícone</string>
<string name="tile_open_vault" comment="label for a quick settings tile that opens the app when tapped">Abrir cofre</string>
<string name="tile_open_scanner" comment="label for a quick settings tile that opens the QR code scanner when tapped">Abrir scanner</string>
<string name="tile_open_scanner" comment="label for a quick settings tile that opens the QR code scanner when tapped">Abrir digitalizador</string>
<string name="toggle_checkboxes">Alternar caixas de seleção</string>
<string name="search">Pesquisar</string>
<string name="channel_name_lock_status">Status de bloqueio</string>
<string name="channel_description_lock_status">Aegis pode criar uma notificação persistente para notificá-lo quando o cofre estiver bloqueado</string>
<string name="vault_unlocked_state">O Cofre está desbloqueado. Toque aqui para bloquear.</string>
<string name="channel_name_lock_status">Estado de bloqueio</string>
<string name="channel_description_lock_status">O Aegis pode criar uma notificação persistente para informá-lo quando o cofre estiver bloqueado</string>
<string name="vault_unlocked_state">O cofre está desbloqueado. Toque aqui para bloquear.</string>
<string name="version">Versão</string>
<string name="changelog">Registo de alterações</string>
<string name="whats_new">O que há de novo</string>
<string name="github_description">Código fonte, problemas e informações</string>
<string name="license">Licença</string>
<string name="license_description">Aegis Authenticator está licenciado sob GPLv3</string>
<string name="license_description">O Autenticador Aegis está licenciado sob GPLv3</string>
<string name="third_party_licenses">Licenças de terceiros</string>
<string name="third_party_licenses_description">Licenças das bibliotecas de terceiros utilizadas pelo Aegis</string>
<string name="country_netherlands">Holanda</string>
@@ -314,69 +386,109 @@
<string name="about_support">Suporte</string>
<string name="support_rate">Avaliar</string>
<string name="support_rate_description">Apoie-nos deixando uma avaliação na Google Play Store</string>
<string name="webview_error">Este dispositivo não suporta a vista web, necessária para ver o registo de alterações e a licença. Falta-lhe um componente do sistema.</string>
<string name="email">Email</string>
<string name="time_sync_warning_title">Sincronização de tempo automática</string>
<string name="time_sync_warning_message">O Aegis depende da hora do sistema para estar sincronizado para gerar códigos corretos. Um desvio de apenas alguns segundos pode resultar em códigos incorretos. Parece que seu dispositivo não está configurado para sincronizar automaticamente o tempo. Gostaria de fazer isso agora?</string>
<string name="time_sync_warning_disable">Pare de me avisar. Eu sei o que estou fazendo.</string>
<string name="google_qr_export_unrelated">Código QR não relacionado. Tente reiniciar o scanner.</string>
<string name="time_sync_warning_message">O Aegis depende da hora do sistema para estar sincronizado para gerar códigos corretos. Um desvio de apenas alguns segundos pode resultar em códigos incorretos. Parece que o seu dispositivo não está configurado para sincronizar automaticamente o tempo. Gostaria de o fazer agora?</string>
<string name="time_sync_warning_disable">Para de me avisar. Eu sei o que estou a fazer.</string>
<string name="google_qr_export_unrelated">Código QR não relacionado. Experimente reiniciar o digitalizador.</string>
<plurals name="google_qr_export_scanned">
<item quantity="one">%d/%d QR code escaneado</item>
<item quantity="other">%d/%d QR codes escaneados</item>
</plurals>
<string name="google_qr_export_unexpected">#%d códigos QR eram esperados, mas #%d foram escaneados em vez disso</string>
<string name="backup_error_bar_message"><b>O backup do cofre falhou recentemente</b></string>
<string name="backup_error_bar_message"><b>O backup do cofre falhou recentemente</b></string>
<string name="backup_error_dialog_details" comment="The first parameter is the type of backup (e.g. built-in or Android backup). The second parameter is an elapsed time in the style of 'x seconds/minutes/days ago'."> Uma tentativa recente de backup do cofre utilizando o %s falhou porque ocorreu um erro. A tentativa de cópia de segurança foi efetuada %s. Verifique as definições de backup para se certificar de que os mesmos podem ser concluídos com êxito.
</string>
<string name="backup_permission_error_dialog_details" comment="The first parameter is the type of backup (e.g. built-in or Android backup). The second parameter is an elapsed time in the style of 'x seconds/minutes/days ago'."> Uma tentativa recente de backup do cofre utilizando o %s falhou porque o Aegis não tinha permissão para escrever no destino do backup. A tentativa de backup foi feita %s. Este erro pode ocorrer se tiver movido/renomeado o destino da cópia de segurança ou se tiver restaurado recentemente o Aegis a partir de um backup. Reconfigure o destino do backup.
</string>
<string name="backup_system_builtin">backups automáticos do Aegis</string>
<string name="backup_system_android">sistema de backup na nuvem do Android</string>
<string name="backup_reminder_bar_message_with_latest" comment="The parameter is an elapsed time in the style of 'x seconds/minutes/days ago'">O último backup está desatualizado (%s)</string>
<string name="backup_reminder_bar_message">As mudanças não foram gravadas</string>
<string name="backup_reminder_bar_dialog_title">As mudanças não foram gravadas</string>
<string name="backup_reminder_bar_dialog_summary"> As alterações recentes ao cofre ainda não foram objeto de backup. É importante efetuar backups regulares para evitar a perda de acesso às suas contas. Considere a possibilidade de configurar backups automáticos nas definições.
</string>
<string name="backup_reminder_bar_dialog_accept">Configurar backups</string>
<string name="backup_plaintext_export_warning"><b>O cofre foi exportado recentemente em texto simples</b></string>
<string name="pref_show_plaintext_warning_hint">Não mostrar este aviso novamente</string>
<string name="backup_plaintext_warning_explanation">Este aviso é mostrado porque exportou recentemente uma cópia não encriptada do cofre. Para manter a segurança dos seus tokens, recomendamos que elimine este ficheiro quando já não for necessário.</string>
<string name="switch_camera">Trocar câmara</string>
<string name="empty_list">Não há códigos a serem mostrados. Comece a adicionar entradas tocando no sinal de mais no canto inferior direito</string>
<string name="empty_list_title">Nenhuma entrada encontrada</string>
<string name="empty_group_list">Não há grupos a serem mostrados. Adicione grupos na tela de edição de uma entrada</string>
<string name="empty_group_list_title">Nenhum grupo encontrado</string>
<string name="no_icon_packs">Ainda não foram importados quaisquer pacotes de ícones. Toque no sinal de mais para importar um. Dica: experimente <a href="https://aegis-icons.github.io">aegis-icons</a>.</string>
<string name="no_icon_packs_title">Sem pacotes de ícones</string>
<string name="pick_icon">Selecionar ícone</string>
<string name="uncategorized">Sem categoria</string>
<string name="done">Concluído</string>
<plurals name="qr_count">
<item quantity="one">%d / %d QR code</item>
<item quantity="other">Códigos QR %d / %d</item>
</plurals>
<string name="next">Próximo</string>
<string name="previous">Anterior</string>
<string name="copy_uri">Copiar URI</string>
<string name="unable_to_copy_uri_to_clipboard">Não é possível copiar o URI para a área de transferência</string>
<string name="uri_copied_to_clipboard">URI copiado para a área de transferência</string>
<string name="transfer_entry">Transferir entrada</string>
<string name="transfer_entry_description">Escaneie este código QR com o aplicativo de autenticação para o qual você gostaria de transferir esta entrada</string>
<string name="transfer_entry_description">Digitalize este código QR com a aplicação de autenticação para a qual gostaria de transferir esta entrada</string>
<string name="google_auth_compatible_transfer_description">Digitalize estes códigos QR com o Aegis ou o Google Authenticator.\n\nDevido às limitações do Google Authenticator, apenas estão incluídos os tokens TOTP e HOTP que utilizam SHA1 e produzem códigos de 6 dígitos</string>
<string name="password_strength_very_weak">Muito Fraca</string>
<string name="password_strength_weak">Fraca</string>
<string name="password_strength_fair">Média</string>
<string name="password_strength_good">Boa</string>
<string name="password_strength_strong">Forte</string>
<string name="pref_pin_keyboard_title">Usar o teclado PIN na tela de bloqueio</string>
<string name="password_strength_unknown">Palavra-passe demasiado longa para a análise de resistência</string>
<string name="pref_pin_keyboard_title">Usar o teclado numérico no ecrã de bloqueio</string>
<string name="pref_pin_keyboard_summary">Ative esta opção se quiser habilitar o teclado PIN na tela de bloqueio. Isso só funciona para senhas numéricas</string>
<string name="title_activity_preferences">Configurações</string>
<string name="title_activity_manage_groups">Gerenciar grupos</string>
<string name="title_activity_manage_groups">Gerir grupos</string>
<string name="title_activity_transfer">Transferir entradas</string>
<string name="title_activity_about">Sobre</string>
<string name="title_activity_edit_entry">Editar entrada</string>
<string name="title_activity_scan_qr">Escanear um código QR</string>
<string name="title_activity_import_entries">Importar entradas</string>
<string name="title_activity_assign_icons">Atribuir ícones</string>
<string name="title_activity_licenses">Licenças de terceiros</string>
<string name="dialog_wipe_entries_title">Limpar entradas</string>
<string name="dialog_wipe_entries_message">O seu cofre já contém entradas. Você quer remover essas entradas antes de importar este arquivo?\n\n<b>Ao fazer isso, você perderá permanentemente o acesso às entradas existentes no cofre.</b></string>
<string name="dialog_wipe_entries_checkbox">Limpar conteúdo do cofre</string>
<string name="panic_trigger_ignore_toast">Aegis recebeu um gatilho de pânico, mas essa configuração está desativada, portanto será ignorado</string>
<string name="pref_panic_trigger_title">Excluir cofre após gatilho de pânico</string>
<string name="pref_panic_trigger_summary">Excluir cofre quando um gatilho de pânico é recebido do Ripple</string>
<string name="import_vault">Importar cofre do Aegis</string>
<string name="import_vault_hint">Pretende importar de uma aplicação 2FA diferente? Conclua a configuração primeiro e depois vá para as definições.</string>
<plurals name="import_duplicate_toast">
<item quantity="one">Desmarcado %d potencial duplo. Reveja a lista de entradas.</item>
<item quantity="other">Desmarcados %d potencial duplos. Reveja a lista de entradas.</item>
</plurals>
<string name="importer_help_2fas">Fornecer um arquivo de backup de 2FAS Authenticator.</string>
<string name="importer_help_aegis">Fornecer um arquivo de exportação/backup do Aegis.</string>
<string name="importer_help_authenticator_plus">Fornecer um arquivo de exportação do Autenticador Plus obtido através de <b>Configurações -&gt; Backup &amp; Restaurar -&gt; Exportar como Texto e HTML</b>.</string>
<string name="importer_help_authenticator_pro">Forneça um ficheiro de exportação do Authenticator Pro obtido através de <b>Settings -&gt; Back up -&gt; Back up to encrypted file (recommended)</b>.</string>
<string name="importer_help_authy">Fornecer uma cópia de <b>/data/data/com.authy.authy/shared_prefs/com.authy.storage.tokens.authenticator.xml</b>, localizado no diretório de armazenamento interno do Authy.</string>
<string name="importer_help_andotp">Fornecer um arquivo de exportação/backup do andOTP.</string>
<string name="importer_help_bitwarden">Forneça um ficheiro de exportação/backup Bitwarden. Os ficheiros encriptados não são suportados.</string>
<string name="importer_help_battle_net_authenticator">Forneça uma cópia de <b>/data/data/com.blizzard.messenger/shared_prefs/com.blizzard.messenger.authenticator_preferences.xml</b>, localizado no diretório de armazenamento interno do Autenticador Battle.net.</string>
<string name="importer_help_duo">Forneça uma cópia de <b>/data/data/com.duosecurity.duomobile/files/duokit/accounts.json</b>, localizada no diretório de armazenamento interno do DUO.</string>
<string name="importer_help_freeotp">Forneça uma cópia de <b>/data/data/org.fedorahosted.freeotp/shared_prefs/tokens.xml</b>, localizado no diretório de armazenamento interno do FreeOTP (1.x).</string>
<string name="importer_help_freeotp_plus">Fornecer um arquivo de exportação FreeOTP+.</string>
<string name="importer_help_google_authenticator"><b>Apenas são suportados ficheiros de bases de dados do Google Authenticator v5.10 e anteriores</b>.\n\nForneça uma cópia de <b>/data/data/com.google.android.apps.authenticator2/databases/databases</b>, localizada no diretório de armazenamento interno do Google Authenticator.</string>
<string name="importer_help_microsoft_authenticator">Fornecer uma cópia de <b>/data/data/com.azure.authenticator/databases/PhoneFactor</b>, localizado no diretório de armazenamento interno do Microsoft Authenticator.</string>
<string name="importer_help_plain_text">Fornecer um arquivo de texto simples com um URI do Google Authenticator em cada linha.</string>
<string name="importer_help_steam"><b>Steam v3.0 e versões mais recentes não são suportadas</b>. Forneça uma cópia de <b>/data/data/com.valvesoftware.android.steam.community/files/Steamguard-*.json</b>, localizada no diretório de armazenamento interno do Steam.</string>
<string name="importer_help_totp_authenticator">Fornecer um arquivo de exportação de Autenticador TOTP.</string>
<string name="importer_help_winauth">Fornecer um arquivo de exportação do WinAuth.</string>
<string name="import_assign_icons_dialog_title">Atribuir ícones</string>
<string name="import_assign_icons_dialog_text">Pretende atribuir ícones às entradas importadas?</string>
<string name="importer_encrypted_exception_google_authenticator">A entrada encriptada foi ignorada: %s</string>
<string name="importer_help_direct">Importar entradas diretamente de %s. Isto requer que a aplicação seja instalada neste dispositivo e que acesso root seja concedido ao Aegis.</string>
<string name="groups">grupos</string>
<string name="groups">Grupos</string>
<string name="pref_focus_search">Focar pesquisa no início da aplicação</string>
<string name="pref_focus_search_summary">Focar a pesquisa imediatamente após abrir a aplicação.</string>
<string name="pref_grouping_halves">Metades</string>
<string name="pref_grouping_none">Sem grupo</string>
<string name="pref_grouping_size_two">Grupos de 2</string>
<string name="pref_grouping_size_three">Grupos de 3</string>
@@ -385,4 +497,30 @@
<string name="pref_copy_behavior_single_tap">Apenas um toque</string>
<string name="pref_copy_behavior_double_tap">Duplo toque</string>
<string name="pref_account_name_position_hidden">Ocultar / Ocultos</string>
<string name="pref_account_name_position_end">Ao lado do emissor</string>
<string name="pref_account_name_position_below">Abaixo do emissor</string>
<plurals name="time_elapsed_seconds">
<item quantity="one">há %d segundo</item>
<item quantity="other">há %d segundos</item>
</plurals>
<plurals name="time_elapsed_minutes">
<item quantity="one">há %d minuto</item>
<item quantity="other">há %d minutos</item>
</plurals>
<plurals name="time_elapsed_hours">
<item quantity="one">há %d hora</item>
<item quantity="other">há %d horas</item>
</plurals>
<plurals name="time_elapsed_days">
<item quantity="one">há %d dia</item>
<item quantity="other">há %d dias</item>
</plurals>
<plurals name="time_elapsed_years">
<item quantity="one">Há %d ano</item>
<item quantity="other">Há %d anos</item>
</plurals>
<plurals name="dropdown_checkboxes_default_count">
<item quantity="one">%d item selecionado</item>
<item quantity="other">%d itens selecionados</item>
</plurals>
</resources>
+11 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Arată numele contului</string>
<string name="pref_shared_issuer_account_name_title">Arată numele contului doar atunci când este necesar</string>
<string name="pref_shared_issuer_account_name_summary">Arată numai numele de cont ce au același emitent. Alte nume de cont vor fi ascunse.</string>
<string name="pref_account_name_position_summary_override">Această setare este suprascrisă de modul vizualizare tiles. Numele contului va fi afișat întotdeauna sub emitent.</string>
<string name="pref_account_name_position_summary_override">Această setare este suprascrisă de modul vizualizare dale. Numele contului va fi afișat mai jos de emitent.</string>
<string name="pref_import_file_title">Importă din fișier</string>
<string name="pref_import_file_summary">Importă token-uri dintr-un fișier</string>
<string name="pref_android_backups_title">Backup-uri Android în cloud</string>
@@ -63,11 +63,13 @@
<string name="pref_backups_trigger_title">Declanșare copie de rezervă</string>
<string name="pref_backups_trigger_summary">Declanșează manual o copie de rezervă</string>
<string name="pref_backups_versions_title">Numărul de versiuni de păstrat</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Păstraţi %1$d versiune a copiei de rezervă</item>
<item quantity="few">Păstraţi %1$d versiune a copiei de rezervă</item>
<item quantity="other">Păstraţi %1$d de versiuni ale copiei de rezervă</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Păstrează un număr infinit de versiuni ale copiei de rezervă</string>
<string name="pref_import_app_title">Importă din aplicație</string>
<string name="pref_import_app_summary">Importă tokeni dintr-o aplicație (necesită acces root)</string>
<string name="pref_export_title">Exportă</string>
@@ -123,9 +125,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Deblocarea seifului a eșuat (biometrie)</string>
<string name="event_description_vault_unlock_failed_biometrics">Încercarea de a debloca seiful cu datele biometrice a eșuat</string>
<string name="event_unknown">Tipul evenimentului este necunoscut</string>
<string name="audit_log_entry_deleted">(șters)</string>
<string name="today_at_time">Astăzi, la %1$s</string>
<string name="day_of_week_at_time">%1$s la %2$s</string>
<string name="date_format">zz/ll/aaaa</string>
<string name="export_encrypted">Criptează seiful</string>
<string name="export_help">Această acțiune va exporta seiful din spațiul de stocare al aplicaţiei. Selectează formatul în care dorești exportul:</string>
<string name="export_warning_unencrypted">Ești pe cale să exportezi o copie necriptată a seifului Aegis. <b>Acest lucru nu este recomandat</b>.</string>
@@ -310,6 +312,7 @@
<string name="no_tokens_can_be_imported">Nu se pot importa token-uri drept rezultat</string>
<string name="unlocking_vault">Deblocarea seifului</string>
<string name="rename_group">Redenumește grupul</string>
<string name="no_group_selection">În cazul în care o intrare nu face parte din niciun grup, aceasta poate fi găsită în categoria „Niciun grup”.</string>
<string name="remove_group">Elimină grupul</string>
<string name="remove_group_description">Ești sigur că dorești să ștergi acest grup? Intrările din acest grup vor comuta automat la \'Niciun grup\'.</string>
<string name="remove_unused_groups">Ștergeți grupurile neutilizate</string>
@@ -364,6 +367,11 @@
<string name="tiles_mode_title">Tiles</string>
<string name="unknown_issuer">Emitent necunoscut</string>
<string name="unknown_account_name">Nume de cont necunoscut</string>
<plurals name="import_error_dialog">
<item quantity="one">Aegis nu a putut importa tokenul %d. Acest token va fi omis. Apasă pe \"detalii\" pentru a vedea mai multe informații despre erori.</item>
<item quantity="few">Aegis nu a putut importa tokenurile %d. Aceste tokenuri vor fi omise. Apasă pe \'detalii\' pentru a vedea mai multe informații despre erori.</item>
<item quantity="other">Aegis nu a putut importa tokenurile %d. Aceste tokenuri vor fi omise. Apasă pe \'detalii\' pentru a vedea mai multe informații despre erori.</item>
</plurals>
<string name="unable_to_process_deeplink">Nu se poate procesa link-ul</string>
<string name="unable_to_read_qrcode_file">Nu se poate citi și procesa codul QR din fișierul: %s.</string>
<string name="unable_to_process_shared_text">Imposibil de procesat textul partajat ca un cod OTP</string>
@@ -481,6 +489,7 @@
<string name="importer_help_authy">Furnizează o copie a <b>/data/data/com.authy.authy/shared_prefs/com.authy.storage.tokens.authenticator.xml</b>, localizată în directorul de stocare internă al Authy.</string>
<string name="importer_help_andotp">Furnizați un fişier de export/copie de rezervă andOTP.</string>
<string name="importer_help_bitwarden">Furnizează un fișier de backup din aplicația Bitwarden. Fișierele criptate nu sunt suportate.</string>
<string name="importer_help_battle_net_authenticator">Furnizează o copie a <b>/data/data/com.blizzard.messenger/shared_prefs/com.blizzard.messenger.authenticator_preferences.xml</b>, localizată în folderul din memoria internă al Battle.net Authenticator.</string>
<string name="importer_help_duo">Furnizează o copie a <b>/data/data/com.duosecurity.duomobile/files/duokit/accounts.json</b>, localizată în dosarul din memoria internă al DUO.</string>
<string name="importer_help_freeotp">Furnizează o copie a <b>/data/data/org.fedorahosted.freeotp/shared_prefs/tokens.xml</b>, localizată în dosarul din stocarea internă a FreeOTP (1.x).</string>
<string name="importer_help_freeotp_plus">Furnizează un fișier de export FreeOTP+.</string>
+12 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">Показывать имя учётной записи</string>
<string name="pref_shared_issuer_account_name_title">Показывать имя учётной записи только при необходимости</string>
<string name="pref_shared_issuer_account_name_summary">Показывать названия учётных записей только в случае, если у них один эмитент. Названия других учётных записей не будут отображаться.</string>
<string name="pref_account_name_position_summary_override">Эта настройка переопределяется плиточным режимом просмотра. Название учётной записи всегда будет отображаться под эмитентом.</string>
<string name="pref_account_name_position_summary_override">Эта настройка переопределяется плиточным режимом просмотра. Название учётной записи будет отображаться под эмитентом.</string>
<string name="pref_import_file_title">Импорт из файла</string>
<string name="pref_import_file_summary">Импорт ключей из файла</string>
<string name="pref_android_backups_title">Облачное резервирование Android</string>
@@ -63,12 +63,14 @@
<string name="pref_backups_trigger_title">Создать резервную копию</string>
<string name="pref_backups_trigger_summary">Создание резервной копии вручную</string>
<string name="pref_backups_versions_title">Количество хранимых версий</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Хранить %1$d версию резервной копии</item>
<item quantity="few">Хранить %1$d версии резервной копии</item>
<item quantity="many">Хранить %1$d версий резервной копии</item>
<item quantity="other">Хранить %1$d версий резервной копии</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Не ограничивать количество версий резервных копий</string>
<string name="pref_import_app_title">Импорт из приложения</string>
<string name="pref_import_app_summary">Импорт ключей из другого приложения (требуются права суперпользователя)</string>
<string name="pref_export_title">Экспорт в файл</string>
@@ -106,6 +108,12 @@
<string name="pref_encryption_summary">Шифровать хранилище и разблокировать его с помощью пароля или биометрии</string>
<string name="pref_biometrics_title">Биометрическая разблокировка</string>
<string name="pref_biometrics_summary">Разрешить биометрическую аутентификацию для разблокировки хранилища</string>
<string name="pref_search_behavior_summary">Поиск в: %s</string>
<string name="pref_search_behavior_prompt">Поиск в любом из следующих полей</string>
<string name="pref_search_behavior_type_name">Имя</string>
<string name="pref_search_behavior_type_issuer">Эмитент</string>
<string name="pref_search_behavior_type_note">Заметка</string>
<string name="pref_search_behavior_type_groups">Группы</string>
<string name="pref_set_password_title">Изменить пароль</string>
<string name="pref_set_password_summary">Установить новый пароль, который вам понадобится, чтобы разблокировать хранилище</string>
<string name="no_events_title">Нет записей о событиях</string>
@@ -125,9 +133,9 @@
<string name="event_title_vault_unlock_failed_biometrics">Хранилище не разблокировано (биометрия)</string>
<string name="event_description_vault_unlock_failed_biometrics">Попытка разблокировать хранилище с помощью биометрии завершилась неудачно</string>
<string name="event_unknown">Неизвестный тип события</string>
<string name="audit_log_entry_deleted">(удалено)</string>
<string name="today_at_time">Сегодня в %1$s</string>
<string name="day_of_week_at_time">%1$s в %2$s</string>
<string name="date_format">dd.MM.yyyy</string>
<string name="export_encrypted">Шифровать хранилище</string>
<string name="export_help">Экспорт внутреннего хранилища Aegis. Выберите формат:</string>
<string name="export_warning_unencrypted">Вы собираетесь экспортировать незашифрованную копию хранилища Aegis. <b>Не рекомендуется</b>.</string>
@@ -318,6 +326,7 @@
<string name="no_tokens_can_be_imported">В результате ни один ключ не может быть импортирован</string>
<string name="unlocking_vault">Разблокировка хранилища</string>
<string name="rename_group">Переименовать группу</string>
<string name="no_group_selection">Если запись не входит ни в одну группу, её можно найти в разделе «Нет группы».</string>
<string name="remove_group">Удалить группу</string>
<string name="remove_group_description">Удалить группу? Записи из этой группы будут автоматически перемещены в «Нет группы».</string>
<string name="remove_unused_groups">Удалить неиспользуемые группы</string>
@@ -354,6 +363,7 @@
<string name="pref_minimize_on_copy_title">Сворачивать при копировании</string>
<string name="pref_minimize_on_copy_summary">Сворачивать приложение после копирования ключа</string>
<string name="pref_copy_behavior_title">Копировать ключи в буфер обмена</string>
<string name="pref_search_behavior_title">Поведение поиска</string>
<string name="pref_pause_entry_title">Замораживать ключи при нажатии</string>
<string name="pref_pause_entry_summary">Приостановить автоматическое обновление ключей принажатии на них. Ключи не будут обновляться до тех пор, пока отображаются. Для обновления потребуется «Выделять ключи при нажатии» или «Отображение по нажатию».</string>
<string name="pin_keyboard_description">Введите свой пароль, чтобы включить PIN-клавиатуру. Обратите внимание, что это работает, только если ваш пароль состоит из цифр.</string>
+55 -7
View File
@@ -40,14 +40,13 @@
<string name="pref_view_mode_title">Režim zobrazenia</string>
<string name="pref_lang_title">Jazyk</string>
<string name="pref_show_icons_title">Zobraziť ikony</string>
<string name="pref_show_icons_summary">Zobrazte ikony vedľa každého záznamu</string>
<string name="pref_show_icons_summary">Zobraz ikony vedľa každého záznamu</string>
<string name="pref_code_group_size_title">Zoskupenie číselných znakov</string>
<string name="pref_code_group_size_summary">Vyberte číslo po koľkých čísliciach sa majú zoskupovať kódy</string>
<string name="pref_account_name_position_title">Zobraziť názov účtu</string>
<string name="pref_shared_issuer_account_name_title">Zobrazovať názov účtu iba pokiaľ to je potrebné</string>
<string name="pref_shared_issuer_account_name_summary">Zobraziť názvy účtov len v prípade, že majú rovnakého vydavateľa. Ostatné názvy účtov budú skryté.</string>
<string name="pref_account_name_position_summary_override">Toto nastavenie je prepísané režimom zobrazenia Dlaždice. Názov účtu bude vždy viditeľný pod vydavateľom.</string>
<string name="pref_import_file_title">Importovanie zo súboru</string>
<string name="pref_import_file_title">Importovať zo súboru</string>
<string name="pref_import_file_summary">Importovať tokeny zo súboru</string>
<string name="pref_android_backups_title">Zálohy na Android cloude</string>
<string name="pref_android_backups_summary">Povoliť zálohovaciemu systému Android Cloud zahrnúť Aegis\' trezor v ich zálohách. Táto možnosť je podporovaná iba pre šifrované trezory.</string>
@@ -63,13 +62,15 @@
<string name="pref_backups_trigger_title">Spustiť zálohu</string>
<string name="pref_backups_trigger_summary">Ručné spustenie zálohy</string>
<string name="pref_backups_versions_title">Počet verzií na uchovanie</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Ponechať %1$d verziu zálohy</item>
<item quantity="few">Ponechať %1$d verzie zálohy</item>
<item quantity="many">Ponechať %1$d verzií zálohy</item>
<item quantity="other">Ponechať %1$d verzií zálohy</item>
</plurals>
<string name="pref_import_app_title">Importovanie z aplikácie</string>
<string name="pref_backups_versions_infinite_summary">Ponechať nekonečné množstvo verzií zálohy</string>
<string name="pref_import_app_title">Importovať z aplikácie</string>
<string name="pref_import_app_summary">Importovať tokeny z aplikácie (vyžaduje sa prístup root)</string>
<string name="pref_export_title">Exportovať</string>
<string name="pref_export_summary">Exportovať trezor</string>
@@ -104,7 +105,7 @@
<string name="pref_set_password_summary">Zadajte nové heslo, ktoré budete potrebovať na odomknutie trezoru</string>
<string name="no_events_title">Žiadne nahlásené udalosti</string>
<string name="no_events_description">V aplikácii neboli nahlásené žiadne dôležité udalosti</string>
<string name="event_title_vault_unlocked">Trezor je odomknutý</string>
<string name="event_title_vault_unlocked">Trezor odomknutý</string>
<string name="event_description_vault_unlocked">Trezor bol úspešne odomknutý</string>
<string name="event_title_backup_created">Záloha vytvorená</string>
<string name="event_description_backup_created">Záloha trezoru bola úspešne vytvorená</string>
@@ -121,10 +122,9 @@
<string name="event_unknown">Neznámy typ udalosti</string>
<string name="today_at_time">Dnes o %1$s</string>
<string name="day_of_week_at_time">%1$s o %2$s</string>
<string name="date_format">dd. mm. yyyy</string>
<string name="export_encrypted">Šifrovať trezor</string>
<string name="export_help">Touto akciou sa exportuje trezor z interného úložiska Aegis. Vyberte formát, v ktorom chcete mať export:</string>
<string name="export_warning_unencrypted">Chystáte sa exportovať nezašifrovanú kópiu svojho trezoru Aegis. <b> Toto sa neodporúča </b>.</string>
<string name="export_warning_unencrypted">Chystáte sa exportovať nezašifrovanú kópiu svojho trezoru Aegis. <b>Toto sa neodporúča</b>.</string>
<string name="export_warning_password">Exporty sú šifrované pomocou samostatného hesla nakonfigurovaného v nastaveniach zabezpečenia.</string>
<string name="understand_risk_accept">Rozumiem rizikám</string>
<string name="export_format_aegis">Aegis (.JSON)</string>
@@ -182,6 +182,7 @@
<string name="copy">Kopírovať</string>
<string name="edit">Upraviť</string>
<string name="select_all">Vybrať všetko</string>
<string name="assign_icons">Priradiť ikonky</string>
<string name="favorite" comment="Verb">Obľúbené</string>
<string name="unfavorite" comment="Verb">Odobrať z obľúbených</string>
<string name="error_all_caps">CHYBA</string>
@@ -203,6 +204,12 @@
<string name="delete_entry">Odstrániť položku</string>
<string name="delete_entry_description">Naozaj chcete túto položku odstrániť?</string>
<string name="delete_entries">Vymazať položky</string>
<plurals name="delete_entries_description">
<item quantity="one">Naozaj chcete odstrániť %d položku?</item>
<item quantity="few">Naozaj chcete odstrániť %d položky?</item>
<item quantity="many">Naozaj chcete odstrániť %d položiek?</item>
<item quantity="other">Naozaj chcete odstrániť %d položiek?</item>
</plurals>
<string name="discard_changes">Zrušiť zmeny?</string>
<string name="discard_changes_description">Vaše zmeny neboli uložené</string>
<string name="saving_profile_error">Pri ukladaní profilu sa vyskytla chyba</string>
@@ -339,12 +346,20 @@
</string>
<string name="backup_reminder_bar_dialog_title">Zmeny nie sú zálohované</string>
<string name="backup_plaintext_export_warning"><b>Trezor bol nedávno exportovaný ako obyčajný text</b></string>
<string name="pref_show_plaintext_warning_hint">Toto upozornenie viac nezobrazovať</string>
<string name="switch_camera">Prepnúť fotoaparát</string>
<string name="empty_list_title">Neboli nájdené žiadne záznamy</string>
<string name="empty_group_list_title">Neboli nájdené žiadne skupiny</string>
<string name="no_icon_packs">Zatiaľ neboli importované žiadne balíčky ikon. Klepnite na znamienko plus aby ste ho importovali. Tip: vyskúšajte <a href="https://aegis-icons.github.io">aegis-icons</a>.</string>
<string name="no_icon_packs_title">Žiadne balíčky ikon</string>
<string name="uncategorized">Nezaradené</string>
<string name="done">Hotovo</string>
<plurals name="qr_count">
<item quantity="one">%d / %d QR kódu</item>
<item quantity="few">%d / %d QR kódov</item>
<item quantity="many">%d / %d QR kódov</item>
<item quantity="other">%d / %d QR kódov</item>
</plurals>
<string name="next">Ďalšie</string>
<string name="previous">Predchádzajúce</string>
<string name="copy_uri">Skopírovať URI</string>
@@ -364,6 +379,9 @@
<string name="title_activity_about">O programe</string>
<string name="title_activity_edit_entry">Upraviť záznam</string>
<string name="title_activity_scan_qr">Skenovať QR kód</string>
<string name="title_activity_assign_icons">Priradiť ikonky</string>
<string name="import_vault">Importovať Aegis trezor</string>
<string name="importer_help_aegis">Poskytnite súbor exportu/zálohy Aegisu.</string>
<string name="importer_help_bitwarden">Nahrajte súbor s Bitwarden exportom/zálohou. Šifrované súbory nie sú podporované.</string>
<string name="groups">Skupiny</string>
<string name="pref_focus_search">Zamerať vyhľadávanie pri spustení aplikácie</string>
@@ -377,4 +395,34 @@
<string name="pref_copy_behavior_single_tap">Jedno klepnutie</string>
<string name="pref_copy_behavior_double_tap">Dvojité poklepanie</string>
<string name="pref_account_name_position_hidden">Skryté</string>
<plurals name="time_elapsed_seconds">
<item quantity="one">Pred %d sekundou</item>
<item quantity="few">Pred %d sekundami</item>
<item quantity="many">Pred %d sekundami</item>
<item quantity="other">Pred %d sekundami</item>
</plurals>
<plurals name="time_elapsed_minutes">
<item quantity="one">Pred %d minútou</item>
<item quantity="few">Pred %d minútami</item>
<item quantity="many">Pred %d minútami</item>
<item quantity="other">Pred %d minútami</item>
</plurals>
<plurals name="time_elapsed_hours">
<item quantity="one">Pred %d hodinou</item>
<item quantity="few">Pred %d hodinami</item>
<item quantity="many">Pred %d hodinami</item>
<item quantity="other">Pred %d hodinami</item>
</plurals>
<plurals name="time_elapsed_days">
<item quantity="one">Pred %d dňom</item>
<item quantity="few">Pred %d dňami</item>
<item quantity="many">Pred %d dňami</item>
<item quantity="other">Pred %d dňami</item>
</plurals>
<plurals name="time_elapsed_years">
<item quantity="one">Pred %d rokom</item>
<item quantity="few">Pred %d rokmi</item>
<item quantity="many">Pred %d rokmi</item>
<item quantity="other">Pred %d rokmi</item>
</plurals>
</resources>
+28 -1
View File
@@ -28,6 +28,8 @@
<string name="pref_section_security_summary">Konfigurera kryptering, biometrisk upplåsning, automatisk låsning och andra säkerhetsinställningar.</string>
<string name="pref_section_import_export_title">Import &amp; export</string>
<string name="pref_section_import_export_summary">Importera säkerhetskopior från Aegis eller andra autentiseringsappar. Skapa manuella exporter av ditt Aegis-valv.</string>
<string name="pref_section_audit_log_title">Granskningslogg</string>
<string name="pref_section_audit_log_summary">Hitta en lista över alla rapporterade viktiga händelser som hände i appen.</string>
<string name="pref_section_backups_title">Säkerhetskopior</string>
<string name="pref_section_backups_summary">Ställ in automatiska säkerhetskopior till en plats som du väljer eller aktivera deltagande i Androids molnsäkerhetskopieringssystem.</string>
<string name="pref_section_icon_packs">Ikonpaket</string>
@@ -44,7 +46,7 @@
<string name="pref_account_name_position_title">Visa kontonamn</string>
<string name="pref_shared_issuer_account_name_title">Visa kontonamn endast vid behov</string>
<string name="pref_shared_issuer_account_name_summary">Visa kontonamn endast när de har samma utfärdare. Andra kontonamn kommer att döljas.</string>
<string name="pref_account_name_position_summary_override">Denna inställning åsidosätts av visningsläget paneler. Kontonamn kommer alltid att visas nedanför utfärdaren.</string>
<string name="pref_account_name_position_summary_override">Denna inställning åsidosätts av visningsläget paneler. Kontonamn kommer att visas nedanför utfärdaren.</string>
<string name="pref_import_file_title">Importera från fil</string>
<string name="pref_import_file_summary">Importera polletter från en fil</string>
<string name="pref_android_backups_title">Android-molnsäkerhetskopior</string>
@@ -61,10 +63,12 @@
<string name="pref_backups_trigger_title">Skapa säkerhetskopia</string>
<string name="pref_backups_trigger_summary">Skapa en säkerhetskopia manuellt</string>
<string name="pref_backups_versions_title">Antal versioner att behålla</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Behåll %1$d version av säkerhetskopian</item>
<item quantity="other">Behåll %1$d versioner av säkerhetskopian</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Behåll ett oändligt antal versioner av säkerhetskopian</string>
<string name="pref_import_app_title">Importera från app</string>
<string name="pref_import_app_summary">Importera polletter från en app (kräver rotåtkomst)</string>
<string name="pref_export_title">Exportera</string>
@@ -100,8 +104,30 @@
<string name="pref_encryption_summary">Kryptera valvet och lås upp det med ett lösenord eller biometri</string>
<string name="pref_biometrics_title">Biometrisk upplåsning</string>
<string name="pref_biometrics_summary">Tillåt biometrisk autentisering för att låsa upp valvet</string>
<string name="pref_search_behavior_type_name">Namn</string>
<string name="pref_search_behavior_type_groups">Grupper</string>
<string name="pref_set_password_title">Ändra lösenord</string>
<string name="pref_set_password_summary">Ange ett nytt lösenord som kommer att krävas för att låsa upp ditt valv</string>
<string name="no_events_title">Inga rapporterade händelser</string>
<string name="no_events_description">Inga viktiga händelser har rapporterats i appen</string>
<string name="event_title_vault_unlocked">Valv upplåst</string>
<string name="event_description_vault_unlocked">Valvet har låsts upp</string>
<string name="event_title_backup_created">Säkerhetskopia skapad</string>
<string name="event_description_backup_created">En säkerhetskopia av valvet har skapats</string>
<string name="event_title_android_backup_created">Säkerhetskopia skapad av Android</string>
<string name="event_description_android_backup_created">En säkerhetskopia av valvet har skapats av Android</string>
<string name="event_title_vault_exported">Valv exporterat</string>
<string name="event_description_vault_exported">En kopia av valvet har exporterats</string>
<string name="event_title_entry_shared">Post delades</string>
<string name="event_description_entry_shared">En post delades</string>
<string name="event_title_vault_unlock_failed_password">Valvupplåsning misslyckades (lösenord)</string>
<string name="event_description_vault_unlock_failed_password">Ett försök att låsa upp valvet med ett lösenord misslyckades</string>
<string name="event_title_vault_unlock_failed_biometrics">Valvupplåsning misslyckades (biometri)</string>
<string name="event_description_vault_unlock_failed_biometrics">Ett försök att låsa upp valvet med biometri misslyckades</string>
<string name="event_unknown">Okänd händelsetyp</string>
<string name="audit_log_entry_deleted">(raderad)</string>
<string name="today_at_time">Idag kl. %1$s</string>
<string name="day_of_week_at_time">%1$s kl. %2$s</string>
<string name="export_encrypted">Kryptera valvet</string>
<string name="export_help">Denna åtgärd kommer att exportera valvet från Aegis interna lagring. Välj det format som du vill att din export ska vara i:</string>
<string name="export_warning_unencrypted">Du håller på att exportera en okrypterad kopia av ditt Aegis-valv. <b>Detta rekommenderas inte.</b></string>
@@ -280,6 +306,7 @@
<string name="no_tokens_can_be_imported">Inga polletter kan importeras till följd av detta</string>
<string name="unlocking_vault">Låser upp valvet</string>
<string name="rename_group">Byt namn på grupp</string>
<string name="no_group_selection">Om en post inte ingår i någon grupp, kan den hittas under \"Grupplös\".</string>
<string name="remove_group">Ta bort grupp</string>
<string name="remove_group_description">Är du säker på att du vill ta bort denna grupp? Poster i denna grupp kommer automatiskt att flyttas till \'Grupplös\'.</string>
<string name="remove_unused_groups">Radera oanvända grupper</string>
@@ -44,7 +44,6 @@
<string name="pref_account_name_position_title">Hesap adını göster</string>
<string name="pref_shared_issuer_account_name_title">Hesap adını yalnızca gerektiğinde göster</string>
<string name="pref_shared_issuer_account_name_summary">Hesap adlarını yalnızca aynı sağlayıcıyı paylaştıklarında göster. Diğer hesap adları gizlenecektir.</string>
<string name="pref_account_name_position_summary_override">Bu ayar, döşeme görüntüleme modu tarafından geçersiz kılınır. Hesap adı her zaman kartı veren kuruluşun altında gösterilecektir.</string>
<string name="pref_import_file_title">Dosyadan içeriye aktar</string>
<string name="pref_import_file_summary">Veritabanını dosyadan içeriye aktar</string>
<string name="pref_android_backups_title">Android bulut yedekleme</string>
@@ -33,6 +33,7 @@
<string name="pref_section_icon_packs">Пакети піктограм</string>
<string name="pref_section_icon_packs_summary">Керування та імпорт пакетами піктограм</string>
<string name="pref_select_theme_title">Тема</string>
<string name="pref_dynamic_colors_title">Динамічні кольори</string>
<string name="pref_view_mode_title">Режим перегляду</string>
<string name="pref_lang_title">Мова</string>
<string name="pref_show_icons_title">Показувати піктограми</string>
+59 -48
View File
@@ -46,9 +46,9 @@
<string name="pref_account_name_position_title">Hiện tên tài khoản</string>
<string name="pref_shared_issuer_account_name_title">Hiện tên tài khoản khi cần</string>
<string name="pref_shared_issuer_account_name_summary">Chỉ hiện tên tài khoản khi có cùng dịch vụ. Những tên tài khoản khác sẽ bị ẩn.</string>
<string name="pref_account_name_position_summary_override">Cài đặt này bị ghi đè bởi chế độ xem theo ô. Tên tài khoản sẽ luôn được hiển thị bên dưới dịch vụ.</string>
<string name="pref_import_file_title">Nhập từ file</string>
<string name="pref_import_file_summary">Nhập token từ một file</string>
<string name="pref_account_name_position_summary_override">Cài đặt này bị ghi đè bởi chế độ xem theo ô. Tên tài khoản sẽ hiển thị bên dưới dịch vụ.</string>
<string name="pref_import_file_title">Nhập từ tập tin</string>
<string name="pref_import_file_summary">Nhập mã từ tập tin</string>
<string name="pref_android_backups_title">Sao lưu trên mây Android</string>
<string name="pref_android_backups_summary">Cho phép hệ thống sao lưu trên mây Android lưu trữ kho Aegis. Chỉ hỗ trợ các kho được mã hoá.</string>
<string name="pref_android_backups_hint"><i>Các bản sao lưu thiết bị (D2D) luôn được cho phép, không kể cài đặt trên</i></string>
@@ -63,9 +63,11 @@
<string name="pref_backups_trigger_title">Bật sao lưu</string>
<string name="pref_backups_trigger_summary">Bật sao lưu thủ công</string>
<string name="pref_backups_versions_title">Số lượng phiên bản tối đa</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="other">Giữ %1$d phiên bản của bản sao lưu</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Không giới hạn số bản sao lưu</string>
<string name="pref_import_app_title">Nhập từ ứng dụng</string>
<string name="pref_import_app_summary">Nhập token từ một ứng dụng (yêu cầu truy cập root)</string>
<string name="pref_export_title">Xuất</string>
@@ -81,8 +83,8 @@
<string name="pref_password_reminder_summary_disabled">Tắt</string>
<string name="pref_secure_screen_title">Bảo vệ màn hình</string>
<string name="pref_secure_screen_summary">Chặn chụp ảnh màn hình trong ứng dụng.</string>
<string name="pref_tap_to_reveal_title">Nhấn để hiện ra</string>
<string name="pref_tap_to_reveal_summary">Các token s được ẩn theo mặc định. Nhấn vào các token để hiện ra mã.</string>
<string name="pref_tap_to_reveal_title">Nhấn để hiện</string>
<string name="pref_tap_to_reveal_summary"> s được ẩn, nhấn vào thì mới hiện.</string>
<string name="pref_tap_to_reveal_time_title">Thời gian chờ nhấn</string>
<string name="pref_auto_lock_title">Tự động khóa</string>
<string name="pref_auto_lock_summary">Khi %s</string>
@@ -100,8 +102,14 @@
<string name="pref_encryption_summary">Khóa kho bằng mật khẩu hoặc sinh trắc học</string>
<string name="pref_biometrics_title">Sinh trắc học</string>
<string name="pref_biometrics_summary">Dùng sinh trắc học để mở khóa kho</string>
<string name="pref_search_behavior_summary">Tìm trong: %s</string>
<string name="pref_search_behavior_prompt">Tìm trong các mục</string>
<string name="pref_search_behavior_type_name">Tên</string>
<string name="pref_search_behavior_type_issuer">Dịch vụ</string>
<string name="pref_search_behavior_type_note">Ghi chú</string>
<string name="pref_search_behavior_type_groups">Nhãn</string>
<string name="pref_set_password_title">Đổi mật khẩu</string>
<string name="pref_set_password_summary">Đặt một mật khẩu mở khóa kho mới</string>
<string name="pref_set_password_summary">Đặt mật khẩu mở khóa kho mới</string>
<string name="no_events_title">Chưa có</string>
<string name="no_events_description">Không có sự kiện nào trong ứng dụng</string>
<string name="event_title_vault_unlocked">Đã mở khóa</string>
@@ -119,16 +127,16 @@
<string name="event_title_vault_unlock_failed_biometrics">Chưa thể mở khóa (sinh trắc học)</string>
<string name="event_description_vault_unlock_failed_biometrics">Mở khóa kho bằng sinh trắc học không thành công</string>
<string name="event_unknown">Sự kiện chưa rõ</string>
<string name="audit_log_entry_deleted">(đã xóa)</string>
<string name="today_at_time">%1$s hôm nay</string>
<string name="day_of_week_at_time">%2$s lúc %1$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">Mã hoá kho</string>
<string name="export_help">Hành động này sẽ xuất kho ra ngoài bộ nhớ trong của Aegis. Hãy chọn định dạng bản xuất:</string>
<string name="export_warning_unencrypted">Bạn sắp xuất một bản sao chưa được mã khóa của kho Aegis. <b>Việc này không được khuyến khích</b>.</string>
<string name="export_warning_password">Quá trình xuất được mã hóa bằng mật khẩu riêng được định cấu hình trong cài đặt Bảo mật.</string>
<string name="understand_risk_accept">Tôi hiểu rủi ro này</string>
<string name="understand_risk_accept">Tôi hiểu rủi ro</string>
<string name="export_format_aegis">Aegis (.JSON)</string>
<string name="export_format_google_auth_uri">File văn bản (.TXT)</string>
<string name="export_format_google_auth_uri">Tập tin văn bản thuần (.TXT)</string>
<string name="export_format_html">Trang web (.HTML)</string>
<string name="export_format_hint">Định dạng xuất</string>
<string name="export_all_groups">Xuất tất cả nhãn</string>
@@ -139,36 +147,37 @@
<string name="export_no_groups_selected">Chưa chọn nhãn để xuất</string>
<string name="export_html_title" comment="The title of an HTML export document">Xuất Aegis Authenticator</string>
<string name="choose_authentication_method">Bảo mật</string>
<string name="authentication_method_explanation">Aegis là một ứng dụng Xác minh 2 bước tập trung vào bảo mật. Các token được lưu trữ trong một kho mã h bằng mật khẩu do bạn chọn. Nếu một kẻ tấn công lấy được file kho mã hoá của bạn, họ sẽ không thể truy cập nội dung không biết mật khẩu.\n\nChúng tôi đã đề xuất tùy chọn phù hợp nhất với thiết bị của bạn.</string>
<string name="authentication_method_explanation">Aegis là ứng dụng xác thực hai yếu tố chú trng vào bảo mật. Mã xác thực được lưu trong kho và kho này có thể được mã hóa bằng mật khẩu do bạn nhập. Trường hợp kẻ tấn công lấy được tập tin chứa kho này, y không thể truy cập nội dung trong kho nếu không biết mật khẩu.\n\nChúng tôi đã đề xuất tùy chọn phù hợp nhất với thiết bị của bạn.</string>
<string name="authentication_method_none">Không</string>
<string name="authentication_method_none_description">Không cần mật khẩu để mở khóa kho và nó sẽ không được mã hóa. <b>Tùy chọn này không được khuyến khích</b>.</string>
<string name="authentication_method_none_description">Kho không được mã hóa và không cần mật khẩu để mở.
<b>Tùy chọn này không được khuyến khích</b>.</string>
<string name="authentication_method_password">Mật khẩu</string>
<string name="authentication_method_password_description">Cần mật khẩu để mở khóa kho.</string>
<string name="authentication_method_password_explanation">Cảnh báo: Nếu bạn quên mật khẩu, bạn sẽ vĩnh viễn mất quyền truy cập vào các token. Không có cách nào để khôi phục chúng.</string>
<string name="authentication_method_password_explanation">Cảnh báo: Nếu bạn quên mật khẩu, sẽ không có cách để truy cập các mã xác thực. Khôi phục không cần mật khẩu là chuyện trong mơ.</string>
<string name="authentication_method_biometrics">Sinh trắc học</string>
<string name="authentication_method_biometrics_description">Bên cạnh mật khẩu, thì sinh trắc học đã được đăng ký trên thiết bị, như vân tay hoặc khuôn mặt, có thể được sử dụng để mở khóa kho.</string>
<string name="authentication_method_biometrics_description">Cùng với mật khẩu, sinh trắc học như vân tay hoặc khuôn mặt được đăng ký trên thiết bị có thể được ng để mở khóa kho.</string>
<string name="authentication">Mở khóa kho</string>
<string name="authentication_multiline" comment="The newline in the middle is used for aesthetic purposes">Mở khóa\nkho</string>
<string name="auth_use_biometrics">Hoặc nhấn vào đây để đổi sang <font fgcolor="#FF0D86C1">sinh trắc học</font></string>
<string name="auth_use_biometrics">Nhấn vào đây để đổi sang <font fgcolor="#FF0D86C1">sinh trắc học</font></string>
<string name="set_password">Vui lòng nhập mật khẩu</string>
<string name="set_group">Vui lòng nhập tên nhãn</string>
<string name="set_number">Vui lòng nhập số</string>
<string name="set_password_confirm">Vui lòng lặp lại mật khẩu</string>
<string name="invalid_password">Mật khẩu không chính xác</string>
<string name="set_password_confirm">Xác nhận lại mật khẩu</string>
<string name="invalid_password">Mật khẩu không đúng</string>
<string name="invalidated_biometrics">Đã phát hiện một thay đổi trong cài đặt bảo mật của thiết bị. Vui lòng đi đến \"Aegis &gt; Cài đặt &gt; Bảo mật &gt; Mở khóa sinh trắc học\" để tắt và bật lại mở khóa sinh trắc học.</string>
<string name="password_reminder">Vui lòng nhập mật khẩu. Chúng tôi thỉnh thoảng hỏi điều này để cho bạn không quên mật khẩu.</string>
<string name="password_reminder_dialog_title">Mở khóa sinh trắc học theo mặc định</string>
<string name="password_reminder_dialog_message">Đôi khi, chúng tôi nhắc bạn nhập mật khẩu để đảm bảo bạn không quên mật khẩu và không bị khóa khỏi kho của mình. Sau khi nhập mật khẩu của bạn một lần, Aegis sẽ mặc định quay lại mở khóa sinh trắc học cho đến khi đến lúc nhắc nhở mật khẩu khác.</string>
<string name="password_reminder_dialog_message">Thỉnh thoảng chúng tôi nhắc bạn nhập mật khẩu để đảm bảo bạn không quên mật khẩu và không mất quyền truy cập vào kho của mình. Sau khi nhập mật khẩu của bạn, Aegis sẽ mặc định quay lại mở khóa sinh trắc học cho đến khi đến lần nhắc tiếp theo.</string>
<string name="password_reminder_freq_never">Không bao giờ</string>
<string name="password_reminder_freq_weekly">Hàng tuần</string>
<string name="password_reminder_freq_weekly">Hng tuần</string>
<string name="password_reminder_freq_biweekly">Nửa tháng</string>
<string name="password_reminder_freq_monthly">Hàng tháng</string>
<string name="password_reminder_freq_quarterly">Hàng quý</string>
<string name="password_reminder_freq_quarterly">Mỗi ba tháng</string>
<string name="enter_password_2fas_message">Bản sao lưu 2FAS này được mã hóa. Vui lòng nhập mật khẩu ở dưới.</string>
<string name="enter_password_authy_message">Các token Authy của bạn đã được mã hóa. Vui lòng đóng Aegis, mở Authy và mở khóa các token bằng mật khẩu của bạn. Bên cạnh đó, Aegis cũng có thể thử giải mã các token Authy cho bạn, nếu bạn nhập mật khẩu ở dưới.</string>
<string name="enter_password_aegis_title">Vui lòng nhập mật khẩu nhập</string>
<string name="enter_password_aegis_title">Vui lòng nhập mật khẩu để nhập</string>
<string name="period_hint">Thời hạn (s)</string>
<string name="algorithm_hint">Hash</string>
<string name="algorithm_hint">Hàm băm</string>
<string name="type">Loại</string>
<string name="share">Chia sẻ</string>
<string name="yes"></string>
@@ -183,8 +192,8 @@
<string name="scan_image">Quét ảnh</string>
<string name="enter_manually">Nhập thủ công</string>
<string name="set_up_biometric">Thiết lập mở khóa sinh trắc học</string>
<string name="copy">Sao chép</string>
<string name="edit">Chỉnh sửa</string>
<string name="copy">Chép</string>
<string name="edit">Sửa</string>
<string name="select_all">Chọn tất cả</string>
<string name="assign_icons">Gán biểu tượng</string>
<string name="favorite" comment="Verb">Thích</string>
@@ -196,12 +205,12 @@
<string name="new_entry">Mục mới</string>
<string name="add_new_entry">Thêm mục mới</string>
<string name="unlock_vault_error">Không thể mở khóa kho</string>
<string name="unlock_vault_error_description">Mật khẩu không chính xác. Hãy chắc chắn là bạn không nhập nhầm mật khẩu.</string>
<string name="unlock_vault_error_description">Mật khẩu không chính xác. Hãy chắc chắn là bạn không nhầm.</string>
<string name="password_equality_error">Các mật khẩu nên y hệt nhau và không trống</string>
<string name="snackbar_authentication_method">Vui lòng chọn một phương pháp xác minh</string>
<string name="encrypting_vault">Đang mã hoá kho</string>
<string name="exporting_vault">Đang xuất kho</string>
<string name="reading_file">Đang đọc file</string>
<string name="reading_file">Đang đọc tập tin</string>
<string name="requesting_root_access">Yêu cầu truy cập root</string>
<string name="analyzing_qr">Đang phân tích mã QR</string>
<string name="analyzing_qr_multiple">Đang phân tích mã QR %d/%d (%s)</string>
@@ -211,7 +220,7 @@
<string name="importing_icon_pack">Đang nhập gói biểu tượng</string>
<string name="delete_entry">Xóa mục</string>
<string name="delete_entry_description">Bạn có chắc bạn muốn xóa mục này không?</string>
<string name="delete_entry_explanation">Việc này không tắt Xác minh 2 bước cho:\n<b>%s</b>\n\nĐể tránh mất quyền truy cập, hãy chắc chắn rằng bạn đã tắt Xác Thực 2 Bước hoặc bạn có một cách khác để tạo mã cho dịch vụ này.</string>
<string name="delete_entry_explanation">Hành động này không tắt Xác thực 2 yếu tố cho:\n<b>%s</b>\n\nĐể tránh mất quyền truy cập, hãy chắc chắn rằng bạn đã tắt Xác thực 2 yếu tố hoặc bạn có một cách khác để tạo mã cho dịch vụ này.</string>
<string name="delete_entries">Xóa các mục</string>
<plurals name="delete_entries_description">
<item quantity="other">Bạn có chắc muốn xóa %d mục?</item>
@@ -221,7 +230,7 @@
<string name="saving_profile_error">Lỗi khi lưu hồ sơ</string>
<string name="saving_assign_icons_error">Lỗi khi gán biểu tượng</string>
<string name="welcome">Chào mừng</string>
<string name="app_description">Aegis là một ứng dụng Xác minh 2 bước tự do, bảo mật và nguồn mở</string>
<string name="app_description">Aegis là một ứng dụng xác thực 2 yếu tố tự do, bảo mật và nguồn mở</string>
<string name="setup_completed">Thiết lập hoàn tất</string>
<string name="setup_completed_description">Aegis đã được thiết lập và sẵn sàng hoạt động.</string>
<string name="vault_not_found">Không tìm thấy kho, đang bắt đầu thiết lập…</string>
@@ -230,14 +239,14 @@
<string name="version_copied">Đã sao chép phiên bản vào bộ nhớ tạm</string>
<string name="error_occurred">Đã xảy ra lỗi</string>
<string name="decryption_error">Đã xảy ra lỗi trong khi mở khóa kho</string>
<string name="decryption_corrupt_error">Đã xảy ra lỗi trong khi mở khóa kho. File kho của bạn có thể bị hỏng.</string>
<string name="decryption_corrupt_error">Đã xảy ra lỗi trong khi mở khóa kho. Tập tin kho của bạn có thể bị hỏng.</string>
<string name="saving_error">Đã xảy ra lỗi trong khi lưu kho</string>
<string name="vault_init_error">Đã xảy ra lỗi trong khi khởi tạo kho</string>
<string name="vault_load_error">Đã xảy ra lỗi trong khi nạp kho từ bộ nhớ</string>
<string name="biometric_decrypt_error">Đã xảy ra lỗi trong khi giải mã kho bằng xác minh sinh trắc học. Điều này thường chỉ xảy ra nếu cài đặt bảo mật của thiết bị đã được thay đổi. Vui lòng mở khóa kho bằng mật khẩu và thiết lập lại xác minh sinh trắc học trong cài đặt của Aegis.</string>
<string name="biometric_init_error">Đã xảy ra lỗi trong khi chuẩn bị xác minh sinh trắc học. Điều này thường chỉ xảy ra nếu cài đặt bảo mật của thiết bị đã được thay đổi. Vui lòng mở khóa kho bằng mật khẩu và thiết lập lại xác minh sinh trắc học trong cài đặt của Aegis.</string>
<string name="disable_encryption">Tắt mã hóa</string>
<string name="disable_encryption_description">Bạn có chắc muốn tắt mã hóa không? Việc này sẽ khiến kho được lưu trữ dưới dạng văn bản thuần. <b>Các bản sao lưu tự động cũng sẽ bị tắt</b>.</string>
<string name="disable_encryption_description">Bạn có chắc muốn tắt mã hóa không? Làm vậy sẽ khiến kho được lưu trữ dưới dạng văn bản thuần. <b>Sao lưu tự động cũng sẽ bị tắt</b>.</string>
<string name="enable_encryption_error">Đã xảy ra lỗi trong khi bật mã hóa</string>
<string name="disable_encryption_error">Đã xảy ra lỗi trong khi tắt mã hóa</string>
<string name="backup_successful">Đã lên lịch sao lưu thành công</string>
@@ -255,9 +264,9 @@
</plurals>
<string name="icon_custom">Tùy chỉnh</string>
<string name="permission_denied">Quyền bị từ chối</string>
<string name="andotp_new_format">Định dạng mới (v0.6.3 hoặc mới hơn) </string>
<string name="andotp_old_format">Định dạng cũ (v0.6.2 hoặc cũ hơn) </string>
<string name="choose_andotp_importer">File sao lưu andOTP định dạng ?</string>
<string name="andotp_new_format">Định dạng mới (v0.6.3 trở lên) </string>
<string name="andotp_old_format">Định dạng cũ (v0.6.2 trở xuống) </string>
<string name="choose_andotp_importer">Tập tin sao lưu andOTP sử dụng định dạng nào?</string>
<string name="choose_totpauth_importer">Bản sao lưu TOTP Authenticator này có được mã hóa bằng mật khẩu không?</string>
<string name="choose_application">Chọn ứng dụng mà bạn muốn nhập từ đó</string>
<string name="choose_theme">Chọn chủ đề bạn thích</string>
@@ -265,10 +274,10 @@
<string name="choose_view_mode">Chọn chế độ xem bạn thích</string>
<string name="choose_copy_behavior">Chọn thao tác sao chép mà bạn thích</string>
<string name="parsing_file_error">Đã xảy ra lỗi trong khi xử lý file</string>
<string name="file_not_found">Lỗi: Không tìm thấy file</string>
<string name="reading_file_error">Đã xảy ra lỗi trong khi đọc file</string>
<string name="file_not_found">Lỗi: Không tìm thấy tập tin</string>
<string name="reading_file_error">Đã xảy ra lỗi trong khi đọc tập tin</string>
<string name="app_lookup_error">Lỗi: Ứng dụng không được cài đặt</string>
<string name="app_version_error">Phiên bản %s không được hỗ trợ. Các phiên bản gần đây đã bắt đầu mã hóa một số file trong thư mục lưu trữ nội bộ, khiến Aegis không thể truy cập thông tin cần thiết để nhập. Việc cố gắng nhập có thể dẫn đến lỗi. Bạn vẫn muốn tiếp tục?</string>
<string name="app_version_error">Phiên bản %s không được hỗ trợ. Các phiên bản gần đây đã bắt đầu mã hóa một số tập tin trong thư mục lưu trữ nội bộ, khiến Aegis không thể truy cập thông tin cần thiết để nhập. Việc cố gắng nhập có thể dẫn đến lỗi. Bạn vẫn muốn tiếp tục?</string>
<string name="root_error">Lỗi: Không thể nhận quyền truy cập root</string>
<plurals name="imported_entries_count">
<item quantity="other">Đã nhập %d mục</item>
@@ -294,6 +303,7 @@
<string name="no_tokens_can_be_imported">Do đó, không thể nhập token nào</string>
<string name="unlocking_vault">Đang mở khóa kho</string>
<string name="rename_group">Đổi tên nhóm</string>
<string name="no_group_selection">Nếu một mục không thuộc bất kỳ nhóm nào, nó sẽ ở trong \"Chưa có nhóm\".</string>
<string name="remove_group">Xóa nhãn</string>
<string name="remove_group_description">Bạn có chắc muốn xóa nhãn này? Các mục trong nhãn này sẽ tự động chuyển thành \"Không nhãn\".</string>
<string name="remove_unused_groups">Xóa nhãn không dùng</string>
@@ -330,6 +340,7 @@
<string name="pref_minimize_on_copy_title">Thu nhỏ khi sao chép</string>
<string name="pref_minimize_on_copy_summary">Thu nhỏ ứng dụng sau khi sao chép một token</string>
<string name="pref_copy_behavior_title">Sao chép token vào bộ nhớ tạm</string>
<string name="pref_search_behavior_title">Hành vi tìm kiếm</string>
<string name="pref_pause_entry_title">Đóng băng token khi nhấn vào</string>
<string name="pref_pause_entry_summary">Tạm dừng làm mới tự động các token bằng cách nhấn vào chúng.</string>
<string name="pin_keyboard_description">Nhập mật khẩu để bật bàn phím mã PIN. Lưu ý rằng việc này chỉ được nếu mật khẩu của bạn chỉ chứa các chữ số</string>
@@ -352,7 +363,7 @@
<item quantity="other">Aegis không thể nhập %d token. Các token đó sẽ bị bỏ qua. Hãy nhấn \'Chi tiết\' để xem thêm thông tin về các lỗi.</item>
</plurals>
<string name="unable_to_process_deeplink">Không thể xử lý deep link</string>
<string name="unable_to_read_qrcode_file">Không thể đọc và xử lý mã QR từ file: %s.</string>
<string name="unable_to_read_qrcode_file">Không thể đọc và xử lý mã QR từ tập tin: %s.</string>
<string name="unable_to_process_shared_text">Không thể xử lý văn bản được chia sẻ dưới dạng OTP</string>
<string name="unable_to_read_qrcode_files">Không thể đọc và xử lý vài mã QR. Chỉ %d/%d mục sẽ được nhập.</string>
<string name="unable_to_generate_qrcode">Không thể tạo mã QR</string>
@@ -406,7 +417,7 @@
<string name="backup_reminder_bar_dialog_accept">Thiết lập sao lưu</string>
<string name="backup_plaintext_export_warning"><b>Kho gần đây đã được xuất ở dạng văn bản thuần</b></string>
<string name="pref_show_plaintext_warning_hint">Không hiện cảnh báo này nữa</string>
<string name="backup_plaintext_warning_explanation">Cảnh báo này xuất hiện vì gần đây bạn đã xuất một bản sao chưa được mã hóa của kho. Để duy trì tính bảo mật cho token, chúng tôi khuyên bạn nên xóa file này khi nó không còn cần thiết nữa.</string>
<string name="backup_plaintext_warning_explanation">Cảnh báo này xuất hiện vì gần đây bạn đã xuất một bản sao chưa được mã hóa của kho. Để giữ an toàn mã xác thực của bạn, chúng tôi khuyên bạn nên xóa tập tin này ngay khi bạn không còn cần đến nữa.</string>
<string name="switch_camera">Đổi camera</string>
<string name="empty_list">Chưa có mã nào. Hãy bắt đầu thêm bằng cách nhấn vào ký hiệu dấu cộng ở góc dưới bên phải</string>
<string name="empty_list_title">Chưa có mục nào</string>
@@ -446,7 +457,7 @@
<string name="title_activity_assign_icons">Gán biểu tượng</string>
<string name="title_activity_licenses">Giấy phép bên thứ ba</string>
<string name="dialog_wipe_entries_title">Xóa toàn bộ mục</string>
<string name="dialog_wipe_entries_message">Kho của bạn đã chứa các mục. Bạn có muốn xóa các mục đó trước khi nhập tệp này không?\n\n<b>Nếu làm vậy, bạn sẽ vĩnh viễn mất quyền truy cập vào các mục hiện có trong kho.</b></string>
<string name="dialog_wipe_entries_message">Kho của bạn đã chứa các mục. Bạn có muốn xóa các mục đó trước khi nhập từ tập tin này không?\n\n<b>Nếu làm vậy, bạn sẽ vĩnh viễn mất quyền truy cập vào các mục hiện có trong kho.</b></string>
<string name="dialog_wipe_entries_checkbox">Xóa toàn bộ nội dung kho</string>
<string name="panic_trigger_ignore_toast">Aegis đã nhận kích hoạt khẩn nhưng cài đặt bị tắt, đang bỏ qua</string>
<string name="pref_panic_trigger_title">Xóa kho khẩn cấp</string>
@@ -456,23 +467,23 @@
<plurals name="import_duplicate_toast">
<item quantity="other">Bỏ đánh dấu %d mục khả năng trùng lặp. Vui lòng xem lại danh sách các mục.</item>
</plurals>
<string name="importer_help_2fas">Cung cấp một file sao lưu 2FAS Authenticator.</string>
<string name="importer_help_2fas">Cung cấp một tập tin sao lưu 2FAS Authenticator.</string>
<string name="importer_help_aegis">Cung cấp một file xuất/sao lưu Aegis.</string>
<string name="importer_help_authenticator_plus">Cung cấp một file xuất Authenticator Plus được nhận qua <b>Cài đặt -&gt; Sao lưu &amp; Khôi phục -&gt; Xuất dưới dạng Văn bản và HTML</b>.</string>
<string name="importer_help_authenticator_pro">Cung cấp file xuất Authenticator Pro có được thông qua <b>Cài đặt -&gt; Sao lưu -&gt; Sao lưu file mã hóa (đề xuất)</b>.</string>
<string name="importer_help_authenticator_plus">Cung cấp một tập tin xuất Authenticator Plus được nhận qua <b>Cài đặt -&gt; Sao lưu &amp; Khôi phục -&gt; Xuất dưới dạng Văn bản và HTML</b>.</string>
<string name="importer_help_authenticator_pro">Cung cấp tập tin xuất Authenticator Pro có được thông qua <b>Cài đặt -&gt; Sao lưu -&gt; Sao lưu tập tin mã hóa (đề xuất)</b>.</string>
<string name="importer_help_authy">Cung cấp một bản sao của <b>/data/data/com.authy.authy/shared_prefs/com.authy.storage.tokens.authenticator.xml</b>, nằm trong thư mục bộ nhớ trong của Authy.</string>
<string name="importer_help_andotp">Cung cấp một file xuất/sao lưu andOTP.</string>
<string name="importer_help_bitwarden">Hãy chọn file xuất/sao lưu của Bitwarden. Tệp mã hoá không được hỗ trợ.</string>
<string name="importer_help_andotp">Cung cấp một tập tin xuất/sao lưu andOTP.</string>
<string name="importer_help_bitwarden">Hãy chọn tập tin xuất/sao lưu của Bitwarden. Tập tin mã hoá không được hỗ trợ.</string>
<string name="importer_help_battle_net_authenticator">Cung cấp một bản sao của <b>/data/data/com.blizzard.messenger/shared_prefs/com.blizzard.messenger.authenticator_preferences.xml</b>, nằm trong thư mục bộ nhớ trong của Battle.net Authenticator.</string>
<string name="importer_help_duo">Cung cấp một bản sao của <b>/data/data/com.duosecurity.duomobile/files/duokit/accounts.json</b>, nằm trong thư mục bộ nhớ trong của DUO.</string>
<string name="importer_help_freeotp">Cung cấp một bản sao của <b>/data/data/org.fedorahosted.freeotp/shared_prefs/tokens.xml</b>, nằm ở thư mục của FreeOTP (1.x) trên bộ nhớ trong.</string>
<string name="importer_help_freeotp_plus">Cung cấp một file xuất FreeOTP+.</string>
<string name="importer_help_google_authenticator"><b>Chỉ có file cơ sở dữ liệu từ Google Authenticator v5.10 và cũ hơn mới được hỗ trợ</b>.\n\nHãy lấy bản sao của <b>/data/data/com.google.android.apps.authenticator2/databases/databases</b> ở trong thư mục bộ nhớ trong của Google Authenticator.</string>
<string name="importer_help_freeotp_plus">Cung cấp một tập tin xuất FreeOTP+.</string>
<string name="importer_help_google_authenticator"><b>Chỉ có tập tin cơ sở dữ liệu từ Google Authenticator v5.10 và cũ hơn mới được hỗ trợ</b>.\n\nHãy lấy bản sao của <b>/data/data/com.google.android.apps.authenticator2/databases/databases</b> ở trong thư mục bộ nhớ trong của Google Authenticator.</string>
<string name="importer_help_microsoft_authenticator">Cung cấp một bản sao của <b>/data/data/com.azure.authenticator/databases/PhoneFactor</b>, nằm trong thư mục bộ nhớ trong của Microsoft Authenticator.</string>
<string name="importer_help_plain_text">Cung cấp một file văn bản thuần có một URI Google Authenticator trên mỗi dòng.</string>
<string name="importer_help_plain_text">Cung cấp một tập tin văn bản thuần có một URI Google Authenticator trên mỗi dòng.</string>
<string name="importer_help_steam"><b>Không hỗ trợ Steam v3.0 trở lên</b>. Cung cấp một bản sao <b>/data/data/com.valvesoftware.android.steam.community/files/Steamguard-*.json</b>, nằm trong thư mục lưu trữ nội bộ của Steam.</string>
<string name="importer_help_totp_authenticator">Cung cấp một file xuất TOTP Authenticator.</string>
<string name="importer_help_winauth">Cung cấp một file xuất WinAuth.</string>
<string name="importer_help_totp_authenticator">Cung cấp một tập tin xuất TOTP Authenticator.</string>
<string name="importer_help_winauth">Cung cấp một tập tin xuất WinAuth.</string>
<string name="import_assign_icons_dialog_title">Gán biểu tượng</string>
<string name="import_assign_icons_dialog_text">Bạn có chắc muốn gán biểu tượng vào những mục đã nhập?</string>
<string name="importer_encrypted_exception_google_authenticator">Đã bỏ qua mục mã hoá: %s</string>
+12 -2
View File
@@ -46,7 +46,7 @@
<string name="pref_account_name_position_title">显示账户名称</string>
<string name="pref_shared_issuer_account_name_title">仅在必要时显示账户名</string>
<string name="pref_shared_issuer_account_name_summary">仅在多项具有相同颁发者时显示账户名。隐藏其他账户名。</string>
<string name="pref_account_name_position_summary_override">此设置被瓷贴视图模式覆盖。账户名将始终显示在发行者下方。</string>
<string name="pref_account_name_position_summary_override">此设置被瓷贴视图模式覆盖。账户名将显示在发行者下方。</string>
<string name="pref_import_file_title">从文件导入</string>
<string name="pref_import_file_summary">从文件导入令牌</string>
<string name="pref_android_backups_title">Android 云备份</string>
@@ -63,9 +63,11 @@
<string name="pref_backups_trigger_title">触发备份</string>
<string name="pref_backups_trigger_summary">手动触发备份</string>
<string name="pref_backups_versions_title">要保留的版本数</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="other">保留 %1$d 个版本备份</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">备份版本无限量保留</string>
<string name="pref_import_app_title">从应用导入</string>
<string name="pref_import_app_summary">从其他应用导入令牌(需要 root 权限)</string>
<string name="pref_export_title">导出</string>
@@ -100,6 +102,12 @@
<string name="pref_encryption_summary">加密数据库,并在解锁时要求密码或生物识别验证。</string>
<string name="pref_biometrics_title">生物识别解锁</string>
<string name="pref_biometrics_summary">通过生物识别验证来解锁数据库</string>
<string name="pref_search_behavior_summary">搜索方式:%s</string>
<string name="pref_search_behavior_prompt">搜索下列任意字段</string>
<string name="pref_search_behavior_type_name">名称</string>
<string name="pref_search_behavior_type_issuer">颁发者</string>
<string name="pref_search_behavior_type_note">备注</string>
<string name="pref_search_behavior_type_groups">分组</string>
<string name="pref_set_password_title">更改密码</string>
<string name="pref_set_password_summary">设置解锁数据库所需的新密码</string>
<string name="no_events_title">没有报告的事件</string>
@@ -119,9 +127,9 @@
<string name="event_title_vault_unlock_failed_biometrics">密码库解锁失败 (生物特征)</string>
<string name="event_description_vault_unlock_failed_biometrics">尝试用生物特征解锁保险库失败</string>
<string name="event_unknown">未知事件类型</string>
<string name="audit_log_entry_deleted">(已删除)</string>
<string name="today_at_time">今天 %1$s</string>
<string name="day_of_week_at_time">%2$s 的 %1$s</string>
<string name="date_format">日/月/年</string>
<string name="export_encrypted">加密数据库</string>
<string name="export_help">此操作将从 Aegis 的内部存储中导出数据库。选择您想要的导出格式:</string>
<string name="export_warning_unencrypted">您将导出一个未加密的 Aegis 数据库副本。<b>不建议这么做</b></string>
@@ -294,6 +302,7 @@
<string name="no_tokens_can_be_imported">没有可导入的令牌</string>
<string name="unlocking_vault">解锁数据库</string>
<string name="rename_group">重命名组</string>
<string name="no_group_selection">不在任何组中的条目会出现在“无分组”中。</string>
<string name="remove_group">删除分组</string>
<string name="remove_group_description">您确定要删除这个分组吗?此分组内的条目将自动移动到“无分组”。</string>
<string name="remove_unused_groups">删除未使用的组</string>
@@ -330,6 +339,7 @@
<string name="pref_minimize_on_copy_title">复制时最小化</string>
<string name="pref_minimize_on_copy_summary">复制令牌后最小化应用</string>
<string name="pref_copy_behavior_title">复制令牌到剪贴板</string>
<string name="pref_search_behavior_title">搜索行为</string>
<string name="pref_pause_entry_title">轻按冻结令牌</string>
<string name="pref_pause_entry_summary">通过轻按令牌来暂停它们的自动刷新。 只要被聚焦,令牌就不会更新。 需要启用“轻按突出显示令牌”或“轻按显示”。</string>
<string name="pin_keyboard_description">请输入您的密码以启用 PIN 键盘。请注意,只有当您的密码仅由数字构成时才能使用</string>
+11 -1
View File
@@ -33,6 +33,7 @@
<string name="pref_section_icon_packs">圖示合輯</string>
<string name="pref_section_icon_packs_summary">管理與匯入圖示合輯</string>
<string name="pref_select_theme_title">主題</string>
<string name="pref_dynamic_colors_summary">基於您的 Android 主題配色設定程式配色</string>
<string name="pref_view_mode_title">檢視模式</string>
<string name="pref_lang_title">語言</string>
<string name="pref_show_icons_title">顯示圖示</string>
@@ -42,7 +43,6 @@
<string name="pref_account_name_position_title">顯示帳戶名稱</string>
<string name="pref_shared_issuer_account_name_title">只在必要時顯示帳戶名稱</string>
<string name="pref_shared_issuer_account_name_summary">只顯示擁有共同發行者的帳戶名稱(並隱藏其他帳戶名稱)</string>
<string name="pref_account_name_position_summary_override">本項設定將被「條列式顯示模式」覆蓋,帳戶名稱將總是在發行者之下顯示。</string>
<string name="pref_import_file_title">從檔案匯入</string>
<string name="pref_import_file_summary">從檔案匯入憑證</string>
<string name="pref_android_backups_title">Android 雲端備份</string>
@@ -97,6 +97,13 @@
<string name="pref_biometrics_summary">允許使用生物特徵辨識驗證來解鎖保險箱</string>
<string name="pref_set_password_title">變更密碼</string>
<string name="pref_set_password_summary">為保險箱設定新解鎖密碼</string>
<string name="event_title_vault_unlocked">保險箱已解鎖</string>
<string name="event_description_vault_unlocked">保險箱已成功解鎖</string>
<string name="event_title_backup_created">備份已建立</string>
<string name="event_description_backup_created">保險箱備份已成功建立</string>
<string name="event_title_android_backup_created">備份已由 Android 建立</string>
<string name="event_description_android_backup_created">保險箱備份已由 Android 成功建立</string>
<string name="today_at_time">今天 %1$s</string>
<string name="export_encrypted">加密保險箱</string>
<string name="export_help">此動作將保險箱從 Aegis 的內部儲存空間裡匯出,請選擇欲匯出的格式:</string>
<string name="export_warning_unencrypted">即將匯出未加密的 Aegis 保險箱。<b>不建議</b></string>
@@ -307,6 +314,7 @@
<string name="unknown_issuer">未知的服務商</string>
<string name="unknown_account_name">未知帳戶</string>
<string name="unable_to_read_qrcode_file">無法從 %s 檔案讀取和處理QR碼</string>
<string name="unable_to_process_shared_text">無法將共用文本作為 OTP 進行處理</string>
<string name="unable_to_generate_qrcode">無法產生QR碼</string>
<string name="select_picture">選擇圖片</string>
<string name="select_icon">選擇圖示</string>
@@ -346,6 +354,8 @@
</string>
<string name="backup_system_builtin">Aegis 內建的自動備份</string>
<string name="backup_system_android">Android 雲端備份</string>
<string name="backup_reminder_bar_message_with_latest" comment="The parameter is an elapsed time in the style of 'x seconds/minutes/days ago'"> 最新的備份已過時 (%s)
</string>
<string name="backup_reminder_bar_dialog_summary"> 尚未備份最近針對保險箱的操作。週期性的備份是避免遺失登入方法的最佳良方。請考慮在設定選單內啟用自動備份。
</string>
<string name="backup_reminder_bar_dialog_accept">設置備份</string>
+7
View File
@@ -125,6 +125,13 @@
<item>@string/pref_auto_lock_type_device_lock</item>
</string-array>
<string-array name="pref_search_behavior_types">
<item>@string/pref_search_behavior_type_issuer</item>
<item>@string/pref_search_behavior_type_name</item>
<item>@string/pref_search_behavior_type_note</item>
<item>@string/pref_search_behavior_type_groups</item>
</string-array>
<string-array name="export_formats">
<item>@string/export_format_aegis</item>
<item>@string/export_format_html</item>
+12 -2
View File
@@ -49,7 +49,7 @@
<string name="pref_account_name_position_title">Show the account name</string>
<string name="pref_shared_issuer_account_name_title">Only show account name when necessary</string>
<string name="pref_shared_issuer_account_name_summary">Only show account names whenever they share the same issuer. Other account names will be hidden.</string>
<string name="pref_account_name_position_summary_override">This setting is overridden by the tiles view mode. Account name will always be shown below the issuer.</string>
<string name="pref_account_name_position_summary_override">This setting is overridden by the tiles view mode. Account name will be shown below the issuer.</string>
<string name="pref_import_file_title">Import from file</string>
<string name="pref_import_file_summary">Import tokens from a file</string>
<string name="pref_android_backups_title">Android cloud backups</string>
@@ -66,10 +66,12 @@
<string name="pref_backups_trigger_title">Trigger backup</string>
<string name="pref_backups_trigger_summary">Manually trigger a backup</string>
<string name="pref_backups_versions_title">Number of versions to keep</string>
<string name="pref_backups_versions_infinite">\u221E</string>
<plurals name="pref_backups_versions_summary">
<item quantity="one">Keep %1$d version of the backup</item>
<item quantity="other">Keep %1$d versions of the backup</item>
</plurals>
<string name="pref_backups_versions_infinite_summary">Keep an infinite number of versions of the backup</string>
<string name="pref_import_app_title">Import from app</string>
<string name="pref_import_app_summary">Import tokens from an app (requires root access)</string>
<string name="pref_export_title">Export</string>
@@ -105,6 +107,12 @@
<string name="pref_encryption_summary">Encrypt the vault and unlock it with a password or biometrics</string>
<string name="pref_biometrics_title">Biometric unlock</string>
<string name="pref_biometrics_summary">Allow biometric authentication to unlock the vault</string>
<string name="pref_search_behavior_summary">Search through: %s</string>
<string name="pref_search_behavior_prompt">Search in any of the following fields</string>
<string name="pref_search_behavior_type_name">Name</string>
<string name="pref_search_behavior_type_issuer">Issuer</string>
<string name="pref_search_behavior_type_note">Note</string>
<string name="pref_search_behavior_type_groups">Groups</string>
<string name="pref_set_password_title">Change password</string>
<string name="pref_set_password_summary">Set a new password which you will need to unlock your vault</string>
@@ -125,10 +133,10 @@
<string name="event_title_vault_unlock_failed_biometrics">Vault unlock failed (biometrics)</string>
<string name="event_description_vault_unlock_failed_biometrics">An attempt to unlock the vault with biometrics failed</string>
<string name="event_unknown">Unknown event type</string>
<string name="audit_log_entry_deleted">(deleted)</string>
<string name="today_at_time">Today at %1$s</string>
<string name="day_of_week_at_time">%1$s at %2$s</string>
<string name="date_format">dd/MM/yyyy</string>
<string name="export_encrypted">Encrypt the vault</string>
<string name="export_help">This action will export the vault out of Aegis\' internal storage. Select the format you\'d like your export to be in:</string>
@@ -311,6 +319,7 @@
<string name="no_tokens_can_be_imported">No tokens can be imported as a result</string>
<string name="unlocking_vault">Unlocking the vault</string>
<string name="rename_group">Rename Group</string>
<string name="no_group_selection">If an entry is not part of any group, it can be found under \"No group\".</string>
<string name="remove_group">Remove group</string>
<string name="remove_group_description">Are you sure you want to remove this group? Entries in this group will automatically switch to \'No group\'.</string>
<string name="remove_unused_groups">Delete unused groups</string>
@@ -348,6 +357,7 @@
<string name="pref_minimize_on_copy_title">Minimize on copy</string>
<string name="pref_minimize_on_copy_summary">Minimize the app after copying a token</string>
<string name="pref_copy_behavior_title">Copy tokens to the clipboard</string>
<string name="pref_search_behavior_title">Search behavior</string>
<string name="pref_pause_entry_title">Freeze tokens when tapped</string>
<string name="pref_pause_entry_summary">Pause automatic refresh of tokens by tapping them. Tokens will not update as long as they are focused. Requires \"Highlight tokens when tapped\" or \"Tap to reveal\".</string>
+5
View File
@@ -263,4 +263,9 @@
<item name="cornerFamily">rounded</item>
<item name="cornerSize">8dp</item>
</style>
<style name="ShapeAppearanceOverlay.Aegis.ImageView.Circle" parent="">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">50%</item>
</style>
</resources>
@@ -8,6 +8,11 @@
android:title="@string/pref_focus_search"
android:summary="@string/pref_focus_search_summary"
app:iconSpaceReserved="false"/>
<Preference
android:defaultValue="false"
android:key="pref_search_behavior"
android:title="@string/pref_search_behavior_title"
app:iconSpaceReserved="false"/>
<androidx.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="pref_minimize_on_copy"
@@ -1,7 +1,6 @@
package com.beemdevelopment.aegis.vault.slots;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThrows;
import com.beemdevelopment.aegis.crypto.CryptoUtils;
@@ -96,22 +95,85 @@ public class SlotTest {
}
@Test
public void testPasswordSlotExclusion() {
SlotList slots = new SlotList();
PasswordSlot passSlot = new PasswordSlot();
PasswordSlot passSlot2 = new PasswordSlot();
slots.add(passSlot);
slots.add(passSlot2);
assertArrayEquals(slots.getValues().toArray(), slots.exportable().getValues().toArray());
SlotList backupSlots = new SlotList();
public void testNonExportableSlotsExclusion() {
// If a backup password slot, multiple regular password slots and a biometric slot are present:
// -> The Regular password slots and the biometric slot get stripped
Slot passwordSlot = new PasswordSlot();
Slot passwordSlot2 = new PasswordSlot();
Slot biometricSlot = new BiometricSlot();
PasswordSlot backupSlot = new PasswordSlot();
backupSlot.setIsBackup(true);
SlotList slots = new SlotList();
slots.add(passwordSlot);
slots.add(passwordSlot2);
slots.add(biometricSlot);
slots.add(backupSlot);
backupSlots.add(backupSlot);
SlotList actual = slots.exportable();
SlotList expected = new SlotList();
expected.add(backupSlot);
assertArrayEquals(expected.getValues().toArray(), actual.getValues().toArray());
assertArrayEquals(backupSlots.getValues().toArray(), slots.exportable().getValues().toArray());
assertNotEquals(slots.getValues().toArray(), slots.exportable().getValues().toArray());
// If a backup password slot, a regular password slot and a biometric slot are present:
// -> The Regular password slot and the biometric slot get stripped
slots = new SlotList();
slots.add(passwordSlot);
slots.add(biometricSlot);
slots.add(backupSlot);
actual = slots.exportable();
expected = new SlotList();
expected.add(backupSlot);
assertArrayEquals(expected.getValues().toArray(), actual.getValues().toArray());
// If a backup password slot and a regular password slot are present:
// -> The regular password slot get stripped
slots = new SlotList();
slots.add(passwordSlot);
slots.add(backupSlot);
actual = slots.exportable();
expected = new SlotList();
expected.add(backupSlot);
assertArrayEquals(expected.getValues().toArray(), actual.getValues().toArray());
// If a backup password slot and multiple regular password slot are present:
// -> The regular password slots get stripped
slots = new SlotList();
slots.add(passwordSlot);
slots.add(passwordSlot2);
slots.add(backupSlot);
actual = slots.exportable();
expected = new SlotList();
expected.add(backupSlot);
assertArrayEquals(expected.getValues().toArray(), actual.getValues().toArray());
// If multiple regular password slots and a biometric slot are present:
// -> The biometric slot gets stripped
slots = new SlotList();
slots.add(passwordSlot);
slots.add(passwordSlot2);
slots.add(biometricSlot);
actual = slots.exportable();
expected = new SlotList();
expected.add(passwordSlot);
expected.add(passwordSlot2);
assertArrayEquals(expected.getValues().toArray(), actual.getValues().toArray());
// If a regular password slot and a biometric slot are present
// -> The biometric slot gets stripped
slots = new SlotList();
slots.add(passwordSlot);
slots.add(biometricSlot);
actual = slots.exportable();
expected = new SlotList();
expected.add(passwordSlot);
assertArrayEquals(expected.getValues().toArray(), actual.getValues().toArray());
// If a regular password slot is present
// -> No slots get stripped
slots = new SlotList();
slots.add(passwordSlot);
actual = slots.exportable();
expected = new SlotList();
expected.add(passwordSlot);
assertArrayEquals(expected.getValues().toArray(), actual.getValues().toArray());
}
}
+3 -10
View File
@@ -6,8 +6,8 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.2.0'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.50'
classpath 'com.android.tools.build:gradle:8.5.2'
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.52'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.9.4'
// NOTE: Do not place your application dependencies here; they belong
@@ -16,7 +16,7 @@ buildscript {
}
plugins {
id 'com.mikepenz.aboutlibraries.plugin' version '11.1.0'
id 'com.mikepenz.aboutlibraries.plugin' version '11.2.2'
}
allprojects {
@@ -24,13 +24,6 @@ allprojects {
mavenCentral()
google()
maven { url 'https://jitpack.io' }
maven {
url 'https://jcenter.bintray.com'
content {
includeModule('com.amulyakhare', 'com.amulyakhare.textdrawable')
includeModule('info.guardianproject.trustedintents', 'trustedintents')
}
}
}
}
-1
View File
@@ -17,7 +17,6 @@
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
android.defaults.buildfeatures.buildconfig=true
android.enableJetifier=false
android.useAndroidX=true
org.gradle.jvmargs=-Xmx8g
+1 -1
View File
@@ -1,6 +1,6 @@
#Tue Aug 15 23:01:16 CEST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists