Merge branch 'master' into keyboard-enter-finishes-task
This commit is contained in:
commit
3f3e0fab52
198 changed files with 5539 additions and 1422 deletions
2
.github/ISSUE_TEMPLATE/thumbnail-request.md
vendored
2
.github/ISSUE_TEMPLATE/thumbnail-request.md
vendored
|
@ -7,7 +7,7 @@ assignees: flocke, RichyHBM, ziegenberg
|
|||
|
||||
---
|
||||
|
||||
Please fill in **all the information below** to help speed up the process!
|
||||
<!-- Please fill in **all the information below** to help speed up the process! -->
|
||||
|
||||
**Name**:
|
||||
**Website**:
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
* Bug fix: Crash when clicking on an entry multiple times (Issue #631, PR #634 by @jsoberg)
|
||||
* Bug fix: Crash during settings changes (Issue #639, PR #640 by @jsoberg)
|
||||
* Bug fix: Don't use regionalized language codes (Issue #567)
|
||||
* Bug fix: Report backup failure correctly (Issue #671)
|
||||
* Internal: Update Gradle, build tools and dependencies
|
||||
* Internal: Min API Level set to 22 (Lollipop 5.1)
|
||||
* Internal: Refactoring and reducing build warnings
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# andOTP - Android OTP Authenticator
|
||||
|
||||
[![Build Status](https://travis-ci.org/andOTP/andOTP.svg?branch=master)](https://travis-ci.org/andOTP/andOTP)
|
||||
[![Current release](https://img.shields.io/github/release/andOTP/andOTP/all.svg)](https://github.com/andOTP/andOTP/releases/download/v0.8.0-beta2/andOTP_v0.8.0-beta2.apk)
|
||||
[![Current release](https://img.shields.io/github/release/andOTP/andOTP/all.svg)](https://github.com/andOTP/andOTP/releases/download/v0.8.0/andOTP_v0.8.0.apk)
|
||||
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/andotp/localized.svg)](https://crowdin.com/project/andotp)
|
||||
[![Chat - Telegram](https://img.shields.io/badge/chat-Telegram-blue.svg)](https://t.me/andOTP)
|
||||
[![Chat - Matrix](https://img.shields.io/badge/chat-Matrix-blue.svg)](https://matrix.to/#/#andOTP:privacytools.io)
|
||||
|
|
|
@ -8,8 +8,8 @@ android {
|
|||
applicationId "org.shadowice.flocke.andotp"
|
||||
minSdkVersion 22
|
||||
targetSdkVersion 29
|
||||
versionCode 34
|
||||
versionName "0.8.0-beta2"
|
||||
versionCode 35
|
||||
versionName "0.8.0"
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
@ -57,12 +57,12 @@ android {
|
|||
dependencies {
|
||||
def lifecycle_version = "2.2.0"
|
||||
|
||||
implementation 'androidx.media:media:1.2.0'
|
||||
implementation 'androidx.media:media:1.2.1'
|
||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.2.0'
|
||||
implementation 'androidx.cardview:cardview:1.0.0'
|
||||
implementation 'androidx.recyclerview:recyclerview:1.1.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||
implementation "androidx.lifecycle:lifecycle-process:${lifecycle_version}"
|
||||
implementation "androidx.lifecycle:lifecycle-common-java8:${lifecycle_version}"
|
||||
implementation 'com.google.android.material:material:1.2.1'
|
||||
|
@ -71,13 +71,14 @@ dependencies {
|
|||
implementation "commons-codec:commons-codec:1.15"
|
||||
implementation "com.github.aakira:expandable-layout:1.6.0"
|
||||
implementation "com.heinrichreimersoftware:material-intro:2.0.0"
|
||||
implementation "com.journeyapps:zxing-android-embedded:3.6.0"
|
||||
implementation("com.journeyapps:zxing-android-embedded:4.1.0"){ transitive = false }
|
||||
implementation "com.google.zxing:core:3.3.0" // Keep pinned to 3.3.0 to support SDK versions below 24
|
||||
implementation "com.vanniktech:vntnumberpickerpreference:1.0.0"
|
||||
implementation "me.zhanghai.android.materialprogressbar:library:1.6.1"
|
||||
implementation "org.sufficientlysecure:openpgp-api:12.0"
|
||||
implementation "com.leinardi.android:speed-dial:3.1.1"
|
||||
implementation "com.mikepenz:aboutlibraries:6.2.3"
|
||||
implementation "com.mikepenz:aboutlibraries:6.2.3" // Supporting a newer version will need some work
|
||||
|
||||
androidTestImplementation "androidx.test.espresso:espresso-core:3.3.0"
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1'
|
||||
}
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
android:installLocation="auto"
|
||||
package="org.shadowice.flocke.andotp">
|
||||
|
||||
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" /> <!-- Needed to support SDK below 24, see build.gradle -->
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:backupAgent=".Utilities.BackupAgent"
|
||||
|
|
|
@ -22,190 +22,307 @@
|
|||
|
||||
package org.shadowice.flocke.andotp.Activities;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.ProcessLifecycleOwner;
|
||||
|
||||
import android.text.Editable;
|
||||
import android.text.InputType;
|
||||
import android.text.method.PasswordTransformationMethod;
|
||||
import android.util.Base64;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewStub;
|
||||
import android.view.WindowManager;
|
||||
import android.view.WindowManager.LayoutParams;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.apache.commons.codec.binary.Hex;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.shadowice.flocke.andotp.R;
|
||||
import org.shadowice.flocke.andotp.Tasks.AuthenticationTask;
|
||||
import org.shadowice.flocke.andotp.Tasks.AuthenticationTask.Result;
|
||||
import org.shadowice.flocke.andotp.Utilities.Constants;
|
||||
import org.shadowice.flocke.andotp.Utilities.EditorActionHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.EncryptionHelper;
|
||||
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.shadowice.flocke.andotp.Utilities.Constants.AuthMethod;
|
||||
|
||||
public class AuthenticateActivity extends ThemedActivity
|
||||
implements EditText.OnEditorActionListener, View.OnClickListener {
|
||||
private String password;
|
||||
public class AuthenticateActivity extends BaseActivity
|
||||
implements EditText.OnEditorActionListener, View.OnClickListener {
|
||||
|
||||
AuthMethod authMethod;
|
||||
String newEncryption = "";
|
||||
boolean oldPassword = false;
|
||||
private static final String TAG_TASK_FRAGMENT = "AuthenticateActivity.TaskFragmentTag";
|
||||
|
||||
TextInputEditText passwordInput;
|
||||
private AuthMethod authMethod;
|
||||
private String newEncryption = "";
|
||||
private String existingAuthCredentials;
|
||||
private boolean isAuthUpgrade = false;
|
||||
private ProcessLifecycleObserver observer;
|
||||
|
||||
private TextInputLayout passwordLayout;
|
||||
private TextInputEditText passwordInput;
|
||||
private Button unlockButton;
|
||||
private ProgressBar unlockProgress;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if (! settings.getScreenshotsEnabled())
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
|
||||
authMethod = settings.getAuthMethod();
|
||||
newEncryption = getIntent().getStringExtra(Constants.EXTRA_AUTH_NEW_ENCRYPTION);
|
||||
existingAuthCredentials = settings.getAuthCredentials();
|
||||
if (existingAuthCredentials.isEmpty()) {
|
||||
existingAuthCredentials = settings.getOldCredentials(authMethod);
|
||||
isAuthUpgrade = true;
|
||||
}
|
||||
|
||||
// If our password is still empty at this point, we can't do anything.
|
||||
if (existingAuthCredentials.isEmpty()) {
|
||||
int missingPwResId = (authMethod == AuthMethod.PASSWORD)
|
||||
? R.string.auth_toast_password_missing : R.string.auth_toast_pin_missing;
|
||||
Toast.makeText(this, missingPwResId, Toast.LENGTH_LONG).show();
|
||||
finishWithResult(true, null);
|
||||
}
|
||||
// If we're not using password or pin for auth method, we have nothing to authenticate here.
|
||||
if (authMethod != AuthMethod.PASSWORD && authMethod != AuthMethod.PIN) {
|
||||
finishWithResult(true, null);
|
||||
}
|
||||
|
||||
setTitle(R.string.auth_activity_title);
|
||||
|
||||
if (! settings.getScreenshotsEnabled())
|
||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
|
||||
|
||||
setContentView(R.layout.activity_container);
|
||||
initToolbar();
|
||||
initPasswordViews();
|
||||
|
||||
setBroadcastCallback(() -> {
|
||||
if (settings.getRelockOnScreenOff()) {
|
||||
cancelBackgroundTask();
|
||||
}
|
||||
});
|
||||
|
||||
observer = new ProcessLifecycleObserver();
|
||||
ProcessLifecycleOwner.get().getLifecycle()
|
||||
.addObserver(observer);
|
||||
|
||||
getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
||||
}
|
||||
|
||||
private void initToolbar() {
|
||||
Toolbar toolbar = findViewById(R.id.container_toolbar);
|
||||
toolbar.setNavigationIcon(null);
|
||||
setSupportActionBar(toolbar);
|
||||
}
|
||||
|
||||
private void initPasswordViews() {
|
||||
ViewStub stub = findViewById(R.id.container_stub);
|
||||
stub.setLayoutResource(R.layout.content_authenticate);
|
||||
View v = stub.inflate();
|
||||
|
||||
Intent callingIntent = getIntent();
|
||||
int labelMsg = callingIntent.getIntExtra(Constants.EXTRA_AUTH_MESSAGE, R.string.auth_msg_authenticate);
|
||||
newEncryption = callingIntent.getStringExtra(Constants.EXTRA_AUTH_NEW_ENCRYPTION);
|
||||
initPasswordLabelView(v);
|
||||
initPasswordLayoutView(v);
|
||||
initPasswordInputView(v);
|
||||
initUnlockViews(v);
|
||||
}
|
||||
|
||||
private void initPasswordLabelView(View v) {
|
||||
int labelMsg = getIntent().getIntExtra(Constants.EXTRA_AUTH_MESSAGE, R.string.auth_msg_authenticate);
|
||||
TextView passwordLabel = v.findViewById(R.id.passwordLabel);
|
||||
TextInputLayout passwordLayout = v.findViewById(R.id.passwordLayout);
|
||||
passwordInput = v.findViewById(R.id.passwordEdit);
|
||||
|
||||
if (settings.getBlockAccessibility())
|
||||
passwordLayout.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && settings.getBlockAutofill())
|
||||
passwordLayout.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
|
||||
|
||||
passwordLabel.setText(labelMsg);
|
||||
}
|
||||
|
||||
authMethod = settings.getAuthMethod();
|
||||
password = settings.getAuthCredentials();
|
||||
|
||||
if (password.isEmpty()) {
|
||||
password = settings.getOldCredentials(authMethod);
|
||||
oldPassword = true;
|
||||
private void initPasswordLayoutView(View v) {
|
||||
passwordLayout = v.findViewById(R.id.passwordLayout);
|
||||
int hintResId = (authMethod == AuthMethod.PASSWORD) ? R.string.auth_hint_password : R.string.auth_hint_pin;
|
||||
passwordLayout.setHint(getString(hintResId));
|
||||
if (settings.getBlockAccessibility()) {
|
||||
passwordLayout.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
|
||||
}
|
||||
|
||||
if (authMethod == AuthMethod.PASSWORD) {
|
||||
if (password.isEmpty()) {
|
||||
Toast.makeText(this, R.string.auth_toast_password_missing, Toast.LENGTH_LONG).show();
|
||||
finishWithResult(true, null);
|
||||
} else {
|
||||
passwordLayout.setHint(getString(R.string.auth_hint_password));
|
||||
passwordInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
||||
}
|
||||
} else if (authMethod == AuthMethod.PIN) {
|
||||
if (password.isEmpty()) {
|
||||
Toast.makeText(this, R.string.auth_toast_pin_missing, Toast.LENGTH_LONG).show();
|
||||
finishWithResult(true, null);
|
||||
} else {
|
||||
passwordLayout.setHint(getString(R.string.auth_hint_pin));
|
||||
passwordInput.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
|
||||
}
|
||||
} else {
|
||||
finishWithResult(true, null);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && settings.getBlockAutofill()) {
|
||||
passwordLayout.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
|
||||
}
|
||||
}
|
||||
|
||||
private void initPasswordInputView(View v) {
|
||||
passwordInput = v.findViewById(R.id.passwordEdit);
|
||||
int inputType = (authMethod == AuthMethod.PASSWORD)
|
||||
? (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)
|
||||
: (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
|
||||
passwordInput.setInputType(inputType);
|
||||
passwordInput.setTransformationMethod(new PasswordTransformationMethod());
|
||||
passwordInput.setOnEditorActionListener(this);
|
||||
}
|
||||
|
||||
Button unlockButton = v.findViewById(R.id.buttonUnlock);
|
||||
private void initUnlockViews(View v) {
|
||||
unlockButton = v.findViewById(R.id.buttonUnlock);
|
||||
unlockButton.setOnClickListener(this);
|
||||
unlockProgress = v.findViewById(R.id.unlockProgress);
|
||||
}
|
||||
|
||||
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
||||
private void cancelBackgroundTask() {
|
||||
TaskFragment taskFragment = findTaskFragment();
|
||||
if (taskFragment != null) {
|
||||
taskFragment.task.cancel();
|
||||
}
|
||||
setupUiForTaskState(false);
|
||||
}
|
||||
|
||||
private class ProcessLifecycleObserver implements DefaultLifecycleObserver {
|
||||
@Override
|
||||
public void onStop(LifecycleOwner owner) {
|
||||
if (settings.getRelockOnBackground()) {
|
||||
cancelBackgroundTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
checkBackgroundTask();
|
||||
}
|
||||
|
||||
private void checkBackgroundTask() {
|
||||
TaskFragment taskFragment = findTaskFragment();
|
||||
if (taskFragment != null) {
|
||||
if (taskFragment.task.isCanceled()) {
|
||||
// The task was canceled, so remove the task fragment and reset password input.
|
||||
getFragmentManager().beginTransaction()
|
||||
.remove(taskFragment)
|
||||
.commit();
|
||||
resetPasswordInput();
|
||||
} else {
|
||||
taskFragment.task.setCallback(this::handleResult);
|
||||
setupUiForTaskState(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void resetPasswordInput() {
|
||||
passwordInput.setText("");
|
||||
passwordInput.requestFocus();
|
||||
InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
keyboard.showSoftInput(passwordInput, 0);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private TaskFragment findTaskFragment() {
|
||||
return (TaskFragment) getFragmentManager().findFragmentByTag(TAG_TASK_FRAGMENT);
|
||||
}
|
||||
|
||||
private void setupUiForTaskState(boolean isTaskRunning) {
|
||||
passwordLayout.setEnabled(!isTaskRunning);
|
||||
passwordInput.setEnabled(!isTaskRunning);
|
||||
unlockButton.setEnabled(!isTaskRunning);
|
||||
unlockButton.setVisibility(isTaskRunning? View.INVISIBLE : View.VISIBLE);
|
||||
unlockProgress.setVisibility(isTaskRunning ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
checkPassword(passwordInput.getText().toString());
|
||||
Editable text = passwordInput.getText();
|
||||
startAuthTask(text != null ? text.toString() : "");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
||||
if (EditorActionHelper.isActionDoneOrKeyboardEnter(actionId, event)) {
|
||||
checkPassword(v.getText().toString());
|
||||
startAuthTask(v.getText().toString());
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void checkPassword(String plainPassword) {
|
||||
if (! oldPassword) {
|
||||
try {
|
||||
EncryptionHelper.PBKDF2Credentials credentials = EncryptionHelper.generatePBKDF2Credentials(plainPassword, settings.getSalt(), settings.getIterations());
|
||||
byte[] passwordArray = Base64.decode(password, Base64.URL_SAFE);
|
||||
private void startAuthTask(String plainPassword) {
|
||||
TaskFragment taskFragment = findTaskFragment();
|
||||
// Don't start a task if we already have an active task running.
|
||||
if (taskFragment == null || taskFragment.task.isCanceled()) {
|
||||
AuthenticationTask task = new AuthenticationTask(this, isAuthUpgrade, existingAuthCredentials, plainPassword);
|
||||
task.setCallback(this::handleResult);
|
||||
|
||||
if (Arrays.equals(passwordArray, credentials.password)) {
|
||||
finishWithResult(true, credentials.key);
|
||||
} else {
|
||||
finishWithResult(false, null);
|
||||
}
|
||||
} catch (NoSuchAlgorithmException | InvalidKeySpecException | IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
finishWithResult(false, null);
|
||||
}
|
||||
} else {
|
||||
String hashedPassword = new String(Hex.encodeHex(DigestUtils.sha256(plainPassword)));
|
||||
|
||||
if (hashedPassword.equals(password)) {
|
||||
byte[] key = settings.setAuthCredentials(plainPassword);
|
||||
|
||||
if (key == null)
|
||||
Toast.makeText(this, R.string.settings_toast_auth_upgrade_failed, Toast.LENGTH_LONG).show();
|
||||
|
||||
if (authMethod == AuthMethod.PASSWORD)
|
||||
settings.removeAuthPasswordHash();
|
||||
else if (authMethod == AuthMethod.PIN)
|
||||
settings.removeAuthPINHash();
|
||||
|
||||
finishWithResult(true, key);
|
||||
} else {
|
||||
finishWithResult(false, null);
|
||||
if (taskFragment == null) {
|
||||
taskFragment = new TaskFragment();
|
||||
getFragmentManager()
|
||||
.beginTransaction()
|
||||
.add(taskFragment, TAG_TASK_FRAGMENT)
|
||||
.commit();
|
||||
}
|
||||
taskFragment.startTask(task);
|
||||
setupUiForTaskState(true);
|
||||
}
|
||||
}
|
||||
|
||||
// End with a result
|
||||
public void finishWithResult(boolean success, byte[] key) {
|
||||
private void handleResult(Result result) {
|
||||
if (result.authUpgradeFailed) {
|
||||
Toast.makeText(this, R.string.settings_toast_auth_upgrade_failed, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
finishWithResult(result.encryptionKey != null, result.encryptionKey);
|
||||
}
|
||||
|
||||
private void finishWithResult(boolean success, byte[] encryptionKey) {
|
||||
Intent data = new Intent();
|
||||
|
||||
if (newEncryption != null && ! newEncryption.isEmpty())
|
||||
if (newEncryption != null && !newEncryption.isEmpty())
|
||||
data.putExtra(Constants.EXTRA_AUTH_NEW_ENCRYPTION, newEncryption);
|
||||
|
||||
if (key != null)
|
||||
data.putExtra(Constants.EXTRA_AUTH_PASSWORD_KEY, key);
|
||||
|
||||
if (encryptionKey != null)
|
||||
data.putExtra(Constants.EXTRA_AUTH_PASSWORD_KEY, encryptionKey);
|
||||
if (success)
|
||||
setResult(RESULT_OK, data);
|
||||
|
||||
finish();
|
||||
}
|
||||
|
||||
// Go back to the main activity
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
finishWithResult(false, null);
|
||||
super.onBackPressed();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
// We don't want the task to callback to a dead activity and cause a memory leak, so null it here.
|
||||
TaskFragment taskFragment = findTaskFragment();
|
||||
if (taskFragment != null) {
|
||||
taskFragment.task.setCallback(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
ProcessLifecycleOwner.get().getLifecycle()
|
||||
.removeObserver(observer);
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldDestroyOnScreenOff() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Retained instance fragment to hold a running {@link AuthenticationTask} between configuration changes.*/
|
||||
public static class TaskFragment extends Fragment {
|
||||
|
||||
AuthenticationTask task;
|
||||
|
||||
public TaskFragment() {
|
||||
super();
|
||||
setRetainInstance(true);
|
||||
}
|
||||
|
||||
public void startTask(@NonNull AuthenticationTask task) {
|
||||
this.task = task;
|
||||
task.execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
package org.shadowice.flocke.andotp.Activities;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Fragment;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.DialogInterface;
|
||||
|
@ -30,17 +31,25 @@ import android.content.Intent;
|
|||
import android.content.IntentSender;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewStub;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Switch;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.material.switchmaterial.SwitchMaterial;
|
||||
|
||||
import org.openintents.openpgp.OpenPgpError;
|
||||
import org.openintents.openpgp.OpenPgpSignatureResult;
|
||||
import org.openintents.openpgp.util.OpenPgpApi;
|
||||
|
@ -48,26 +57,35 @@ import org.openintents.openpgp.util.OpenPgpServiceConnection;
|
|||
import org.shadowice.flocke.andotp.Database.Entry;
|
||||
import org.shadowice.flocke.andotp.Dialogs.PasswordEntryDialog;
|
||||
import org.shadowice.flocke.andotp.R;
|
||||
import org.shadowice.flocke.andotp.Tasks.EncryptedBackupTask;
|
||||
import org.shadowice.flocke.andotp.Tasks.EncryptedRestoreTask;
|
||||
import org.shadowice.flocke.andotp.Tasks.GenericBackupTask;
|
||||
import org.shadowice.flocke.andotp.Tasks.GenericRestoreTask;
|
||||
import org.shadowice.flocke.andotp.Tasks.PGPBackupTask;
|
||||
import org.shadowice.flocke.andotp.Tasks.PGPRestoreTask;
|
||||
import org.shadowice.flocke.andotp.Tasks.PlainTextBackupTask;
|
||||
import org.shadowice.flocke.andotp.Tasks.PlainTextRestoreTask;
|
||||
import org.shadowice.flocke.andotp.Utilities.BackupHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.Constants;
|
||||
import org.shadowice.flocke.andotp.Utilities.DatabaseHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.EncryptionHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.StorageAccessHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.Tools;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.crypto.SecretKey;
|
||||
|
||||
public class BackupActivity extends BaseActivity {
|
||||
private final static String TAG = BackupActivity.class.getSimpleName();
|
||||
|
||||
private static final String TAG_BACKUP_TASK_FRAGMENT = "BackupActivity.BackupTaskFragmentTag";
|
||||
private static final String TAG_RESTORE_TASK_FRAGMENT = "BackupActivity.RestoreTaskFragmentTag";
|
||||
|
||||
private Constants.BackupType backupType = Constants.BackupType.ENCRYPTED;
|
||||
private SecretKey encryptionKey = null;
|
||||
|
||||
private OpenPgpServiceConnection pgpServiceConnection;
|
||||
|
@ -76,9 +94,17 @@ public class BackupActivity extends BaseActivity {
|
|||
private Uri encryptTargetFile;
|
||||
private Uri decryptSourceFile;
|
||||
|
||||
private Switch replace;
|
||||
private Button btnBackup;
|
||||
private Button btnRestore;
|
||||
private TextView txtBackupLabel;
|
||||
private TextView txtBackupWarning;
|
||||
private SwitchMaterial swReplace;
|
||||
private CheckBox chkOldFormat;
|
||||
private ProgressBar progressBackup;
|
||||
private ProgressBar progressRestore;
|
||||
|
||||
private boolean reload = false;
|
||||
private boolean allowExit = true;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
@ -98,96 +124,119 @@ public class BackupActivity extends BaseActivity {
|
|||
byte[] keyMaterial = callingIntent.getByteArrayExtra(Constants.EXTRA_BACKUP_ENCRYPTION_KEY);
|
||||
encryptionKey = EncryptionHelper.generateSymmetricKey(keyMaterial);
|
||||
|
||||
// Plain-text
|
||||
Spinner spBackupType = v.findViewById(R.id.backupType);
|
||||
btnBackup = v.findViewById(R.id.buttonBackup);
|
||||
btnRestore = v.findViewById(R.id.buttonRestore);
|
||||
txtBackupLabel = v.findViewById(R.id.backupLabel);
|
||||
txtBackupWarning = v.findViewById(R.id.backupErrorLabel);
|
||||
swReplace = v.findViewById(R.id.backup_replace);
|
||||
chkOldFormat = v.findViewById(R.id.restoreOldCrypt);
|
||||
progressBackup = v.findViewById(R.id.progressBarBackup);
|
||||
progressRestore = v.findViewById(R.id.progressBarRestore);
|
||||
|
||||
LinearLayout backupPlain = v.findViewById(R.id.button_backup_plain);
|
||||
LinearLayout restorePlain = v.findViewById(R.id.button_restore_plain);
|
||||
setupBackupType(settings.getDefaultBackupType());
|
||||
spBackupType.setSelection(backupType.ordinal());
|
||||
|
||||
backupPlain.setOnClickListener(new View.OnClickListener() {
|
||||
spBackupType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
backupPlainWithWarning();
|
||||
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
|
||||
Constants.BackupType type = Constants.BackupType.values()[i];
|
||||
setupBackupType(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> adapterView) { }
|
||||
});
|
||||
|
||||
restorePlain.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
showOpenFileSelector(Constants.INTENT_BACKUP_OPEN_DOCUMENT_PLAIN);
|
||||
}
|
||||
});
|
||||
|
||||
// Password
|
||||
|
||||
TextView cryptSetup = v.findViewById(R.id.msg_crypt_setup);
|
||||
LinearLayout backupCrypt = v.findViewById(R.id.button_backup_crypt);
|
||||
LinearLayout restoreCrypt = v.findViewById(R.id.button_restore_crypt);
|
||||
LinearLayout restoreCryptOld = v.findViewById(R.id.button_restore_crypt_old);
|
||||
|
||||
if (settings.getBackupPasswordEnc().isEmpty()) {
|
||||
cryptSetup.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
cryptSetup.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
backupCrypt.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
showSaveFileSelector(Constants.BACKUP_MIMETYPE_CRYPT, Constants.BackupType.ENCRYPTED, Constants.INTENT_BACKUP_SAVE_DOCUMENT_CRYPT);
|
||||
}
|
||||
});
|
||||
|
||||
restoreCrypt.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
showOpenFileSelector(Constants.INTENT_BACKUP_OPEN_DOCUMENT_CRYPT);
|
||||
}
|
||||
});
|
||||
|
||||
restoreCryptOld.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
showOpenFileSelector(Constants.INTENT_BACKUP_OPEN_DOCUMENT_CRYPT_OLD);
|
||||
}
|
||||
});
|
||||
|
||||
// OpenPGP
|
||||
|
||||
String PGPProvider = settings.getOpenPGPProvider();
|
||||
pgpEncryptionUserIDs = settings.getOpenPGPEncryptionUserIDs();
|
||||
|
||||
TextView setupPGP = v.findViewById(R.id.msg_openpgp_setup);
|
||||
LinearLayout backupPGP = v.findViewById(R.id.button_backup_openpgp);
|
||||
LinearLayout restorePGP = v.findViewById(R.id.button_restore_openpgp);
|
||||
|
||||
if (TextUtils.isEmpty(PGPProvider)) {
|
||||
setupPGP.setVisibility(View.VISIBLE);
|
||||
backupPGP.setVisibility(View.GONE);
|
||||
restorePGP.setVisibility(View.GONE);
|
||||
} else if (TextUtils.isEmpty(pgpEncryptionUserIDs)){
|
||||
setupPGP.setVisibility(View.VISIBLE);
|
||||
setupPGP.setText(R.string.backup_desc_openpgp_keyid);
|
||||
backupPGP.setVisibility(View.GONE);
|
||||
} else {
|
||||
pgpServiceConnection = new OpenPgpServiceConnection(BackupActivity.this.getApplicationContext(), PGPProvider);
|
||||
pgpServiceConnection.bindToService();
|
||||
|
||||
backupPGP.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
btnBackup.setOnClickListener(view -> {
|
||||
switch (backupType) {
|
||||
case PLAIN_TEXT:
|
||||
backupPlainWithWarning();
|
||||
break;
|
||||
case ENCRYPTED:
|
||||
showSaveFileSelector(Constants.BACKUP_MIMETYPE_CRYPT, Constants.BackupType.ENCRYPTED, Constants.INTENT_BACKUP_SAVE_DOCUMENT_CRYPT);
|
||||
break;
|
||||
case OPEN_PGP:
|
||||
showSaveFileSelector(Constants.BACKUP_MIMETYPE_PGP, Constants.BackupType.OPEN_PGP, Constants.INTENT_BACKUP_SAVE_DOCUMENT_PGP);
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
restorePGP.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
btnRestore.setOnClickListener(view -> {
|
||||
switch (backupType) {
|
||||
case PLAIN_TEXT:
|
||||
showOpenFileSelector(Constants.INTENT_BACKUP_OPEN_DOCUMENT_PLAIN);
|
||||
break;
|
||||
case ENCRYPTED:
|
||||
if (chkOldFormat.isChecked())
|
||||
showOpenFileSelector(Constants.INTENT_BACKUP_OPEN_DOCUMENT_CRYPT_OLD);
|
||||
else
|
||||
showOpenFileSelector(Constants.INTENT_BACKUP_OPEN_DOCUMENT_CRYPT);
|
||||
break;
|
||||
case OPEN_PGP:
|
||||
showOpenFileSelector(Constants.INTENT_BACKUP_OPEN_DOCUMENT_PGP);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setupBackupType(Constants.BackupType type) {
|
||||
switch (type) {
|
||||
case PLAIN_TEXT:
|
||||
txtBackupLabel.setText(R.string.backup_label_warning_plain);
|
||||
|
||||
chkOldFormat.setVisibility(View.GONE);
|
||||
txtBackupWarning.setVisibility(View.GONE);
|
||||
|
||||
btnBackup.setEnabled(true);
|
||||
btnRestore.setEnabled(true);
|
||||
|
||||
break;
|
||||
case ENCRYPTED:
|
||||
txtBackupLabel.setText(R.string.backup_label_crypt);
|
||||
|
||||
chkOldFormat.setVisibility(View.VISIBLE);
|
||||
txtBackupWarning.setVisibility(View.GONE);
|
||||
|
||||
btnBackup.setEnabled(true);
|
||||
btnRestore.setEnabled(true);
|
||||
|
||||
break;
|
||||
case OPEN_PGP:
|
||||
txtBackupLabel.setText(R.string.backup_label_pgp);
|
||||
|
||||
chkOldFormat.setVisibility(View.GONE);
|
||||
|
||||
String PGPProvider = settings.getOpenPGPProvider();
|
||||
pgpEncryptionUserIDs = settings.getOpenPGPEncryptionUserIDs();
|
||||
|
||||
if (TextUtils.isEmpty(PGPProvider)) {
|
||||
txtBackupWarning.setText(R.string.backup_desc_openpgp_provider);
|
||||
txtBackupWarning.setVisibility(View.VISIBLE);
|
||||
|
||||
btnBackup.setEnabled(false);
|
||||
btnRestore.setEnabled(false);
|
||||
} else if (TextUtils.isEmpty(pgpEncryptionUserIDs)){
|
||||
txtBackupWarning.setText(R.string.backup_desc_openpgp_keyid);
|
||||
txtBackupWarning.setVisibility(View.VISIBLE);
|
||||
|
||||
btnBackup.setEnabled(false);
|
||||
btnRestore.setEnabled(false);
|
||||
} else {
|
||||
txtBackupWarning.setVisibility(View.GONE);
|
||||
|
||||
btnBackup.setEnabled(true);
|
||||
btnRestore.setEnabled(true);
|
||||
|
||||
pgpServiceConnection = new OpenPgpServiceConnection(BackupActivity.this.getApplicationContext(), PGPProvider);
|
||||
pgpServiceConnection.bindToService();
|
||||
}
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
replace = v.findViewById(R.id.backup_replace);
|
||||
backupType = type;
|
||||
settings.setDefaultBackupType(type);
|
||||
}
|
||||
|
||||
// End with a result
|
||||
|
@ -201,14 +250,18 @@ public class BackupActivity extends BaseActivity {
|
|||
// Go back to the main activity
|
||||
@Override
|
||||
public boolean onSupportNavigateUp() {
|
||||
finishWithResult();
|
||||
if (allowExit)
|
||||
finishWithResult();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
finishWithResult();
|
||||
super.onBackPressed();
|
||||
if (allowExit) {
|
||||
finishWithResult();
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -219,6 +272,85 @@ public class BackupActivity extends BaseActivity {
|
|||
pgpServiceConnection.unbindFromService();
|
||||
}
|
||||
|
||||
// TODO: Show more information about the finished backup (e.g. a notification with the file name)
|
||||
private void notifyBackupState(int msgId) {
|
||||
Toast.makeText(this, msgId, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
private void handleBackupTaskResult(GenericBackupTask.BackupTaskResult result) {
|
||||
showBackupProgress(false);
|
||||
|
||||
if (result.messageId != 0)
|
||||
notifyBackupState(result.messageId);
|
||||
else
|
||||
if (!result.success)
|
||||
notifyBackupState(R.string.backup_toast_export_failed);
|
||||
|
||||
// Clean up the task fragment
|
||||
BackupTaskFragment backupTaskFragment = findBackupTaskFragment();
|
||||
if (backupTaskFragment != null) {
|
||||
getFragmentManager().beginTransaction()
|
||||
.remove(backupTaskFragment)
|
||||
.commit();
|
||||
}
|
||||
|
||||
if (result.success)
|
||||
finishWithResult();
|
||||
}
|
||||
|
||||
private void handleRestoreTaskResult(GenericRestoreTask.RestoreTaskResult result) {
|
||||
if (result.success) {
|
||||
if (result.isPGP) {
|
||||
InputStream is = new ByteArrayInputStream(result.payload.getBytes(StandardCharsets.UTF_8));
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
|
||||
OpenPgpApi api = new OpenPgpApi(this, pgpServiceConnection.getService());
|
||||
Intent resultIntent = api.executeApi(result.decryptIntent, is, os);
|
||||
|
||||
handleOpenPGPResult(resultIntent, os, result.uri, Constants.INTENT_BACKUP_DECRYPT_PGP);
|
||||
} else {
|
||||
restoreEntries(result.payload, false);
|
||||
}
|
||||
} else {
|
||||
if (result.messageId != 0)
|
||||
notifyBackupState(result.messageId);
|
||||
else
|
||||
notifyBackupState(R.string.backup_toast_import_failed);
|
||||
}
|
||||
|
||||
showRestoreProgress(false);
|
||||
|
||||
// Clean up the task fragment
|
||||
RestoreTaskFragment restoreTaskFragment = findRestoreTaskFragment();
|
||||
if (restoreTaskFragment != null) {
|
||||
getFragmentManager().beginTransaction()
|
||||
.remove(restoreTaskFragment)
|
||||
.commit();
|
||||
}
|
||||
|
||||
if (result.success && !result.isPGP)
|
||||
finishWithResult();
|
||||
}
|
||||
|
||||
private void toggleInProgressMode(boolean running) {
|
||||
allowExit = !running;
|
||||
|
||||
btnBackup.setEnabled(!running);
|
||||
btnRestore.setEnabled(!running);
|
||||
chkOldFormat.setEnabled(!running);
|
||||
swReplace.setEnabled(!running);
|
||||
}
|
||||
|
||||
private void showBackupProgress(boolean running) {
|
||||
toggleInProgressMode(running);
|
||||
progressBackup.setVisibility(running ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
private void showRestoreProgress(boolean running) {
|
||||
toggleInProgressMode(running);
|
||||
progressRestore.setVisibility(running ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
// Get the result from external activities
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
|
||||
|
@ -291,26 +423,11 @@ public class BackupActivity extends BaseActivity {
|
|||
} else {
|
||||
if (settings.isBackupLocationSet()) {
|
||||
if (intentId == Constants.INTENT_BACKUP_SAVE_DOCUMENT_PLAIN) {
|
||||
BackupHelper.BackupFile plainBackupFile = BackupHelper.backupFile(this, settings.getBackupLocation(), Constants.BackupType.PLAIN_TEXT);
|
||||
|
||||
if (plainBackupFile.file != null)
|
||||
doBackupPlain(plainBackupFile.file.getUri());
|
||||
else
|
||||
Toast.makeText(this, plainBackupFile.errorMessage, Toast.LENGTH_LONG).show();
|
||||
doBackupPlain(null);
|
||||
} else if (intentId == Constants.INTENT_BACKUP_SAVE_DOCUMENT_CRYPT) {
|
||||
BackupHelper.BackupFile cryptBackupFile = BackupHelper.backupFile(this, settings.getBackupLocation(), Constants.BackupType.ENCRYPTED);
|
||||
|
||||
if (cryptBackupFile.file != null)
|
||||
doBackupCrypt(cryptBackupFile.file.getUri());
|
||||
else
|
||||
Toast.makeText(this, cryptBackupFile.errorMessage, Toast.LENGTH_LONG).show();
|
||||
doBackupCrypt(null);
|
||||
} else if (intentId == Constants.INTENT_BACKUP_SAVE_DOCUMENT_PGP) {
|
||||
BackupHelper.BackupFile pgpBackupFile = BackupHelper.backupFile(this, settings.getBackupLocation(), Constants.BackupType.OPEN_PGP);
|
||||
|
||||
if (pgpBackupFile.file != null)
|
||||
backupEncryptedWithPGP(pgpBackupFile.file.getUri(), null);
|
||||
else
|
||||
Toast.makeText(this, pgpBackupFile.errorMessage, Toast.LENGTH_LONG).show();
|
||||
backupEncryptedWithPGP(null, null);
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_no_location, Toast.LENGTH_LONG).show();
|
||||
|
@ -318,11 +435,11 @@ public class BackupActivity extends BaseActivity {
|
|||
}
|
||||
}
|
||||
|
||||
private void restoreEntries(String text) {
|
||||
private void restoreEntries(String text, boolean finish) {
|
||||
ArrayList<Entry> entries = DatabaseHelper.stringToEntries(text);
|
||||
|
||||
if (entries.size() > 0) {
|
||||
if (! replace.isChecked()) {
|
||||
if (! swReplace.isChecked()) {
|
||||
ArrayList<Entry> currentEntries = DatabaseHelper.loadDatabase(this, encryptionKey);
|
||||
|
||||
entries.removeAll(currentEntries);
|
||||
|
@ -332,7 +449,9 @@ public class BackupActivity extends BaseActivity {
|
|||
if (DatabaseHelper.saveDatabase(this, entries, encryptionKey)) {
|
||||
reload = true;
|
||||
Toast.makeText(this, R.string.backup_toast_import_success, Toast.LENGTH_LONG).show();
|
||||
finishWithResult();
|
||||
|
||||
if (finish)
|
||||
finishWithResult();
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_import_save_failed, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
@ -345,9 +464,10 @@ public class BackupActivity extends BaseActivity {
|
|||
|
||||
private void doRestorePlain(Uri uri) {
|
||||
if (Tools.isExternalStorageReadable()) {
|
||||
String content = StorageAccessHelper.loadFileString(this, uri);
|
||||
PlainTextRestoreTask task = new PlainTextRestoreTask(this, uri);
|
||||
task.setCallback(this::handleRestoreTaskResult);
|
||||
|
||||
restoreEntries(content);
|
||||
startRestoreTask(task);
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_storage_not_accessible, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
@ -357,15 +477,13 @@ public class BackupActivity extends BaseActivity {
|
|||
if (Tools.isExternalStorageWritable()) {
|
||||
ArrayList<Entry> entries = DatabaseHelper.loadDatabase(this, encryptionKey);
|
||||
|
||||
if (StorageAccessHelper.saveFile(this, uri, DatabaseHelper.entriesToString(entries)))
|
||||
Toast.makeText(this, R.string.backup_toast_export_success, Toast.LENGTH_LONG).show();
|
||||
else
|
||||
Toast.makeText(this, R.string.backup_toast_export_failed, Toast.LENGTH_LONG).show();
|
||||
PlainTextBackupTask task = new PlainTextBackupTask(this, entries, uri);
|
||||
task.setCallback(this::handleBackupTaskResult);
|
||||
|
||||
startBackupTask(task);
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_storage_not_accessible, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
finishWithResult();
|
||||
}
|
||||
|
||||
private void backupPlainWithWarning() {
|
||||
|
@ -408,39 +526,10 @@ public class BackupActivity extends BaseActivity {
|
|||
|
||||
private void doRestoreCryptWithPassword(Uri uri, String password, boolean old_format) {
|
||||
if (Tools.isExternalStorageReadable()) {
|
||||
boolean success = true;
|
||||
String decryptedString = "";
|
||||
EncryptedRestoreTask task = new EncryptedRestoreTask(this, uri, password, old_format);
|
||||
task.setCallback(this::handleRestoreTaskResult);
|
||||
|
||||
try {
|
||||
byte[] data = StorageAccessHelper.loadFile(this, uri);
|
||||
|
||||
if (old_format) {
|
||||
SecretKey key = EncryptionHelper.generateSymmetricKeyFromPassword(password);
|
||||
byte[] decrypted = EncryptionHelper.decrypt(key, data);
|
||||
|
||||
decryptedString = new String(decrypted, StandardCharsets.UTF_8);
|
||||
} else {
|
||||
byte[] iterBytes = Arrays.copyOfRange(data, 0, Constants.INT_LENGTH);
|
||||
byte[] salt = Arrays.copyOfRange(data, Constants.INT_LENGTH, Constants.INT_LENGTH + Constants.ENCRYPTION_IV_LENGTH);
|
||||
byte[] encrypted = Arrays.copyOfRange(data, Constants.INT_LENGTH + Constants.ENCRYPTION_IV_LENGTH, data.length);
|
||||
|
||||
int iter = ByteBuffer.wrap(iterBytes).getInt();
|
||||
|
||||
SecretKey key = EncryptionHelper.generateSymmetricKeyPBKDF2(password, iter, salt);
|
||||
|
||||
byte[] decrypted = EncryptionHelper.decrypt(key, encrypted);
|
||||
decryptedString = new String(decrypted, StandardCharsets.UTF_8);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
success = false;
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (success) {
|
||||
restoreEntries(decryptedString);
|
||||
} else {
|
||||
Toast.makeText(this,R.string.backup_toast_import_decryption_failed, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
startRestoreTask(task);
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_storage_not_accessible, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
@ -464,19 +553,15 @@ public class BackupActivity extends BaseActivity {
|
|||
|
||||
private void doBackupCryptWithPassword(Uri uri, String password) {
|
||||
if (Tools.isExternalStorageWritable()) {
|
||||
ArrayList<Entry> entries = DatabaseHelper.loadDatabase(this, encryptionKey);
|
||||
|
||||
boolean success = BackupHelper.backupToFile(this, uri, password, encryptionKey);
|
||||
EncryptedBackupTask task = new EncryptedBackupTask(this, entries, password, uri);
|
||||
task.setCallback(this::handleBackupTaskResult);
|
||||
|
||||
if (success) {
|
||||
Toast.makeText(this, R.string.backup_toast_export_success, Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_export_failed, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
startBackupTask(task);
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_storage_not_accessible, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
finishWithResult();
|
||||
}
|
||||
|
||||
/* OpenPGP backup functions */
|
||||
|
@ -485,28 +570,21 @@ public class BackupActivity extends BaseActivity {
|
|||
if (decryptIntent == null)
|
||||
decryptIntent = new Intent(OpenPgpApi.ACTION_DECRYPT_VERIFY);
|
||||
|
||||
String input = StorageAccessHelper.loadFileString(this, uri);
|
||||
PGPRestoreTask task = new PGPRestoreTask(this, uri, decryptIntent);
|
||||
task.setCallback(this::handleRestoreTaskResult);
|
||||
|
||||
InputStream is = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8));
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
OpenPgpApi api = new OpenPgpApi(this, pgpServiceConnection.getService());
|
||||
Intent result = api.executeApi(decryptIntent, is, os);
|
||||
handleOpenPGPResult(result, os, uri, Constants.INTENT_BACKUP_DECRYPT_PGP);
|
||||
startRestoreTask(task);
|
||||
}
|
||||
|
||||
private void doBackupEncrypted(Uri uri, String data) {
|
||||
if (Tools.isExternalStorageWritable()) {
|
||||
boolean success = StorageAccessHelper.saveFile(this, uri, data);
|
||||
PGPBackupTask task = new PGPBackupTask(this, data, uri);
|
||||
task.setCallback(this::handleBackupTaskResult);
|
||||
|
||||
if (success)
|
||||
Toast.makeText(this, R.string.backup_toast_export_success, Toast.LENGTH_LONG).show();
|
||||
else
|
||||
Toast.makeText(this, R.string.backup_toast_export_failed, Toast.LENGTH_LONG).show();
|
||||
startBackupTask(task);
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_storage_not_accessible, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
finishWithResult();
|
||||
}
|
||||
|
||||
private void backupEncryptedWithPGP(Uri uri, Intent encryptIntent) {
|
||||
|
@ -549,12 +627,12 @@ public class BackupActivity extends BaseActivity {
|
|||
OpenPgpSignatureResult sigResult = result.getParcelableExtra(OpenPgpApi.RESULT_SIGNATURE);
|
||||
|
||||
if (sigResult.getResult() == OpenPgpSignatureResult.RESULT_VALID_KEY_CONFIRMED) {
|
||||
restoreEntries(outputStreamToString(os));
|
||||
restoreEntries(outputStreamToString(os), true);
|
||||
} else {
|
||||
Toast.makeText(this, R.string.backup_toast_openpgp_not_verified, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
} else {
|
||||
restoreEntries(outputStreamToString(os));
|
||||
restoreEntries(outputStreamToString(os), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -578,4 +656,145 @@ public class BackupActivity extends BaseActivity {
|
|||
Toast.makeText(this, String.format(getString(R.string.backup_toast_openpgp_error), error.getMessage()), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private BackupTaskFragment findBackupTaskFragment() {
|
||||
return (BackupTaskFragment) getFragmentManager().findFragmentByTag(TAG_BACKUP_TASK_FRAGMENT);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private RestoreTaskFragment findRestoreTaskFragment() {
|
||||
return (RestoreTaskFragment) getFragmentManager().findFragmentByTag(TAG_RESTORE_TASK_FRAGMENT);
|
||||
}
|
||||
|
||||
private void startBackupTask(GenericBackupTask task) {
|
||||
BackupTaskFragment backupTaskFragment = findBackupTaskFragment();
|
||||
RestoreTaskFragment restoreTaskFragment = findRestoreTaskFragment();
|
||||
|
||||
// Don't start a task if we already have an active task running (backup or restore).
|
||||
if ((backupTaskFragment == null || backupTaskFragment.task.isCanceled()) && (restoreTaskFragment == null || restoreTaskFragment.task.isCanceled())) {
|
||||
if (backupTaskFragment == null) {
|
||||
backupTaskFragment = new BackupTaskFragment();
|
||||
getFragmentManager()
|
||||
.beginTransaction()
|
||||
.add(backupTaskFragment, TAG_BACKUP_TASK_FRAGMENT)
|
||||
.commit();
|
||||
}
|
||||
|
||||
backupTaskFragment.startTask(task);
|
||||
|
||||
showBackupProgress(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void startRestoreTask(GenericRestoreTask task) {
|
||||
BackupTaskFragment backupTaskFragment = findBackupTaskFragment();
|
||||
RestoreTaskFragment restoreTaskFragment = findRestoreTaskFragment();
|
||||
|
||||
// Don't start a task if we already have an active task running (backup or restore).
|
||||
if ((backupTaskFragment == null || backupTaskFragment.task.isCanceled()) && (restoreTaskFragment == null || restoreTaskFragment.task.isCanceled())) {
|
||||
if (restoreTaskFragment == null) {
|
||||
restoreTaskFragment = new RestoreTaskFragment();
|
||||
getFragmentManager()
|
||||
.beginTransaction()
|
||||
.add(restoreTaskFragment, TAG_RESTORE_TASK_FRAGMENT)
|
||||
.commit();
|
||||
}
|
||||
|
||||
restoreTaskFragment.startTask(task);
|
||||
|
||||
showRestoreProgress(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkBackgroundBackupTask() {
|
||||
BackupTaskFragment backupTaskFragment = findBackupTaskFragment();
|
||||
|
||||
if (backupTaskFragment != null) {
|
||||
if (backupTaskFragment.task.isCanceled()) {
|
||||
// The task was canceled or has finished, so remove the task fragment.
|
||||
getFragmentManager().beginTransaction()
|
||||
.remove(backupTaskFragment)
|
||||
.commit();
|
||||
} else {
|
||||
backupTaskFragment.task.setCallback(this::handleBackupTaskResult);
|
||||
showBackupProgress(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void checkBackgroundRestoreTask() {
|
||||
RestoreTaskFragment restoreTaskFragment = findRestoreTaskFragment();
|
||||
|
||||
if (restoreTaskFragment != null) {
|
||||
if (restoreTaskFragment.task.isCanceled()) {
|
||||
// The task was canceled or has finished, so remove the task fragment.
|
||||
getFragmentManager().beginTransaction()
|
||||
.remove(restoreTaskFragment)
|
||||
.commit();
|
||||
} else {
|
||||
restoreTaskFragment.task.setCallback(this::handleRestoreTaskResult);
|
||||
showRestoreProgress(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
||||
// We don't want the task to callback to a dead activity and cause a memory leak, so null it here.
|
||||
BackupTaskFragment backupTaskFragment = findBackupTaskFragment();
|
||||
RestoreTaskFragment restoreTaskFragment = findRestoreTaskFragment();
|
||||
|
||||
if (backupTaskFragment != null)
|
||||
backupTaskFragment.task.setCallback(null);
|
||||
|
||||
if (restoreTaskFragment != null)
|
||||
restoreTaskFragment.task.setCallback(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
checkBackgroundBackupTask();
|
||||
checkBackgroundRestoreTask();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldDestroyOnScreenOff() {
|
||||
return allowExit; // Don't destroy the backup activity as long as a backup task is running
|
||||
}
|
||||
|
||||
/** Retained instance fragment to hold a running {@link GenericBackupTask} between configuration changes.*/
|
||||
public static class BackupTaskFragment extends Fragment {
|
||||
GenericBackupTask task;
|
||||
|
||||
public BackupTaskFragment() {
|
||||
super();
|
||||
setRetainInstance(true);
|
||||
}
|
||||
|
||||
public void startTask(@NonNull GenericBackupTask task) {
|
||||
this.task = task;
|
||||
this.task.execute();
|
||||
}
|
||||
}
|
||||
|
||||
/** Retained instance fragment to hold a running {@link GenericRestoreTask} between configuration changes.*/
|
||||
public static class RestoreTaskFragment extends Fragment {
|
||||
GenericRestoreTask task;
|
||||
|
||||
public RestoreTaskFragment() {
|
||||
super();
|
||||
setRetainInstance(true);
|
||||
}
|
||||
|
||||
public void startTask(@NonNull GenericRestoreTask task) {
|
||||
this.task = task;
|
||||
this.task.execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,15 +43,9 @@ public abstract class BaseActivity extends ThemedActivity {
|
|||
@Override
|
||||
protected void onDestroy() {
|
||||
unregisterReceiver(screenOffReceiver);
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
private void destroyIfNotMain() {
|
||||
if (getClass() != MainActivity.class)
|
||||
finish();
|
||||
}
|
||||
|
||||
public void setBroadcastCallback(BroadcastReceivedCallback cb) {
|
||||
this.broadcastReceivedCallback = cb;
|
||||
}
|
||||
|
@ -62,14 +56,20 @@ public abstract class BaseActivity extends ThemedActivity {
|
|||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
|
||||
if (broadcastReceivedCallback != null)
|
||||
if (broadcastReceivedCallback != null) {
|
||||
broadcastReceivedCallback.onReceivedScreenOff();
|
||||
|
||||
destroyIfNotMain();
|
||||
}
|
||||
if (shouldDestroyOnScreenOff()) {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean shouldDestroyOnScreenOff() {
|
||||
return true;
|
||||
}
|
||||
|
||||
interface BroadcastReceivedCallback {
|
||||
void onReceivedScreenOff();
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@ import android.widget.ArrayAdapter;
|
|||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.Switch;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
@ -66,6 +67,7 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
|
||||
private EncryptionFragment encryptionFragment;
|
||||
private AuthenticationFragment authenticationFragment;
|
||||
private AndroidSyncFragment androidSyncFragment;
|
||||
|
||||
private void saveSettings() {
|
||||
Constants.EncryptionType encryptionType = encryptionFragment.getEncryptionType();
|
||||
|
@ -73,6 +75,7 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
|
||||
settings.setEncryption(encryptionType);
|
||||
settings.setAuthMethod(authMethod);
|
||||
settings.setAndroidBackupServiceEnabled(androidSyncFragment.getSyncEnabled());
|
||||
|
||||
if (authMethod == Constants.AuthMethod.PASSWORD || authMethod == Constants.AuthMethod.PIN) {
|
||||
String password = authenticationFragment.getPassword();
|
||||
|
@ -89,6 +92,7 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
|
||||
encryptionFragment = new EncryptionFragment();
|
||||
authenticationFragment = new AuthenticationFragment();
|
||||
androidSyncFragment = new AndroidSyncFragment(encryptionFragment);
|
||||
|
||||
encryptionFragment.setEncryptionChangedCallback(newEncryptionType -> authenticationFragment.updateEncryptionType(newEncryptionType));
|
||||
|
||||
|
@ -121,6 +125,13 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
.build()
|
||||
);
|
||||
|
||||
addSlide(new FragmentSlide.Builder()
|
||||
.background(R.color.colorPrimary)
|
||||
.backgroundDark(R.color.colorPrimaryDark)
|
||||
.fragment(androidSyncFragment)
|
||||
.build()
|
||||
);
|
||||
|
||||
addSlide(new SimpleSlide.Builder()
|
||||
.title(R.string.intro_slide4_title)
|
||||
.description(R.string.intro_slide4_desc)
|
||||
|
@ -130,6 +141,7 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
.build()
|
||||
);
|
||||
|
||||
|
||||
addOnNavigationBlockedListener((position, direction) -> {
|
||||
if (position == 2)
|
||||
authenticationFragment.flashWarning();
|
||||
|
@ -138,7 +150,7 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
if (position == 3)
|
||||
if (position == getSlides().size() - 1)
|
||||
saveSettings();
|
||||
}
|
||||
|
||||
|
@ -223,6 +235,39 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
}
|
||||
}
|
||||
|
||||
public static class AndroidSyncFragment extends SlideFragment {
|
||||
private Switch introAndroidSync;
|
||||
private EncryptionFragment encryptionFragment;
|
||||
|
||||
public AndroidSyncFragment(EncryptionFragment encryptionFragment) {
|
||||
this.encryptionFragment = encryptionFragment;
|
||||
}
|
||||
|
||||
public boolean getSyncEnabled()
|
||||
{
|
||||
return introAndroidSync.isChecked();
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View root = inflater.inflate(R.layout.component_intro_android_sync, container, false);
|
||||
|
||||
introAndroidSync = root.findViewById(R.id.introAndroidSync);
|
||||
introAndroidSync.setOnCheckedChangeListener((compoundButton, b) -> {
|
||||
compoundButton.setText( b ?
|
||||
R.string.settings_toast_android_sync_enabled :
|
||||
R.string.settings_toast_android_sync_disabled
|
||||
);
|
||||
});
|
||||
|
||||
introAndroidSync.setChecked(encryptionFragment.getEncryptionType() != Constants.EncryptionType.KEYSTORE);
|
||||
introAndroidSync.setEnabled(encryptionFragment.getEncryptionType() != Constants.EncryptionType.KEYSTORE);
|
||||
|
||||
return root;
|
||||
}
|
||||
}
|
||||
|
||||
public static class AuthenticationFragment extends SlideFragment implements TextView.OnEditorActionListener {
|
||||
private Constants.EncryptionType encryptionType = Constants.EncryptionType.KEYSTORE;
|
||||
|
||||
|
@ -232,6 +277,7 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
private String lengthWarning = "";
|
||||
private String noPasswordWarning = "";
|
||||
private String confirmPasswordWarning = "";
|
||||
private String passwordMismatchWarning = "";
|
||||
|
||||
private TextView desc = null;
|
||||
private Spinner selection = null;
|
||||
|
@ -389,6 +435,7 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
lengthWarning = getString(R.string.settings_label_short_password, minLength);
|
||||
noPasswordWarning = getString(R.string.intro_slide3_warn_no_password);
|
||||
confirmPasswordWarning = getString(R.string.intro_slide3_warn_confirm_password);
|
||||
passwordMismatchWarning = getString(R.string.intro_slide3_warn_password_mismatch);
|
||||
|
||||
focusOnPasswordInput();
|
||||
}
|
||||
|
@ -415,6 +462,7 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
lengthWarning = getString(R.string.settings_label_short_pin, minLength);
|
||||
noPasswordWarning = getString(R.string.intro_slide3_warn_no_pin);
|
||||
confirmPasswordWarning = getString(R.string.intro_slide3_warn_confirm_pin);
|
||||
passwordMismatchWarning = getString(R.string.intro_slide3_warn_pin_mismatch);
|
||||
|
||||
focusOnPasswordInput();
|
||||
}
|
||||
|
@ -479,6 +527,9 @@ public class IntroScreenActivity extends IntroActivity {
|
|||
if (! confirm.isEmpty() && confirm.equals(password)) {
|
||||
hideWarning();
|
||||
return true;
|
||||
} else if (! confirm.isEmpty() && ! confirm.equals(password)) {
|
||||
updateWarning(passwordMismatchWarning);
|
||||
return false;
|
||||
} else {
|
||||
updateWarning(confirmPasswordWarning);
|
||||
return false;
|
||||
|
|
|
@ -34,6 +34,8 @@ import android.os.Bundle;
|
|||
import android.os.CountDownTimer;
|
||||
import android.os.Handler;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.GravityCompat;
|
||||
import androidx.drawerlayout.widget.DrawerLayout;
|
||||
import androidx.appcompat.app.ActionBarDrawerToggle;
|
||||
|
@ -56,6 +58,7 @@ import android.widget.AdapterView;
|
|||
import android.widget.CheckedTextView;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.zxing.integration.android.IntentIntegrator;
|
||||
|
@ -114,6 +117,8 @@ public class MainActivity extends BaseActivity
|
|||
private String filterString;
|
||||
|
||||
private CountDownTimer countDownTimer;
|
||||
private ProgressBar progressBar;
|
||||
private TextView emptyListView;
|
||||
|
||||
// QR code scanning
|
||||
private void scanQRCode(){
|
||||
|
@ -245,8 +250,8 @@ public class MainActivity extends BaseActivity
|
|||
}
|
||||
});
|
||||
|
||||
final ProgressBar progressBar = findViewById(R.id.progressBar);
|
||||
progressBar.setVisibility(settings.isHideGlobalTimeoutEnabled() ? View.GONE : View.VISIBLE);
|
||||
progressBar = findViewById(R.id.progressBar);
|
||||
emptyListView = findViewById(R.id.emptyListView);
|
||||
|
||||
RecyclerView recList = findViewById(R.id.cardList);
|
||||
recList.setHasFixedSize(true);
|
||||
|
@ -256,6 +261,43 @@ public class MainActivity extends BaseActivity
|
|||
|
||||
tagsDrawerAdapter = new TagsAdapter(this, new HashMap<String, Boolean>());
|
||||
adapter = new EntriesCardAdapter(this, tagsDrawerAdapter);
|
||||
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
|
||||
@Override
|
||||
public void onChanged() {
|
||||
super.onChanged();
|
||||
hideProgressBar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemRangeChanged(int positionStart, int itemCount) {
|
||||
super.onItemRangeChanged(positionStart, itemCount);
|
||||
hideProgressBar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) {
|
||||
super.onItemRangeChanged(positionStart, itemCount, payload);
|
||||
hideProgressBar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemRangeInserted(int positionStart, int itemCount) {
|
||||
super.onItemRangeInserted(positionStart, itemCount);
|
||||
hideProgressBar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemRangeRemoved(int positionStart, int itemCount) {
|
||||
super.onItemRangeRemoved(positionStart, itemCount);
|
||||
hideProgressBar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
|
||||
super.onItemRangeMoved(fromPosition, toPosition, itemCount);
|
||||
hideProgressBar();
|
||||
}
|
||||
});
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
byte[] encKey = savedInstanceState.getByteArray("encKey");
|
||||
|
@ -586,6 +628,10 @@ public class MainActivity extends BaseActivity
|
|||
}
|
||||
});
|
||||
|
||||
if (settings.isFocusSearchOnStartEnabled()) {
|
||||
searchItem.expandActionView();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -894,4 +940,20 @@ public class MainActivity extends BaseActivity
|
|||
settings.unregisterPreferenceChangeListener(this);
|
||||
super.onDestroy();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will hide the progress bar if the token list is empty along with
|
||||
* showing a view which has instruction on how to add the tokens
|
||||
* */
|
||||
private void hideProgressBar(){
|
||||
int itemCount = adapter.getItemCount();
|
||||
progressBar.setVisibility((settings.isHideGlobalTimeoutEnabled() || itemCount <= 0) ? View.GONE : View.VISIBLE);
|
||||
emptyListView.setVisibility(itemCount > 0 ? View.GONE : View.VISIBLE);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldDestroyOnScreenOff() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ import android.preference.PreferenceManager;
|
|||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import android.provider.DocumentsContract;
|
||||
import android.util.Log;
|
||||
import android.view.ViewStub;
|
||||
import android.widget.Toast;
|
||||
|
||||
|
@ -168,6 +169,13 @@ public class SettingsActivity extends BaseActivity
|
|||
if (fragment.useAndroidSync != null)
|
||||
fragment.useAndroidSync.setEnabled(true);
|
||||
}
|
||||
} else if(key.equals(getString(R.string.settings_key_enable_android_backup_service)))
|
||||
{
|
||||
Log.d(SettingsActivity.class.getSimpleName(), "onSharedPreferenceChanged called modifying settings_key_enable_android_backup_service service is now: " +
|
||||
(settings.getAndroidBackupServiceEnabled() ? "enabled" : "disabled"));
|
||||
|
||||
int message = settings.getAndroidBackupServiceEnabled() ? R.string.settings_toast_android_sync_enabled : R.string.settings_toast_android_sync_disabled;
|
||||
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
fragment.updateAutoBackup();
|
||||
|
|
|
@ -30,7 +30,6 @@ import android.preference.DialogPreference;
|
|||
import android.text.Editable;
|
||||
import android.text.InputType;
|
||||
import android.text.TextWatcher;
|
||||
import android.text.method.PasswordTransformationMethod;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
|
@ -69,7 +68,7 @@ public class CredentialsPreference extends DialogPreference
|
|||
boolean testEncryptionChange(byte[] newKey);
|
||||
}
|
||||
|
||||
private List<String> entries;
|
||||
private final List<String> entries;
|
||||
private static final List<AuthMethod> entryValues = Arrays.asList(
|
||||
AuthMethod.NONE,
|
||||
AuthMethod.PASSWORD,
|
||||
|
@ -79,7 +78,7 @@ public class CredentialsPreference extends DialogPreference
|
|||
|
||||
private int minLength = 0;
|
||||
|
||||
private Settings settings;
|
||||
private final Settings settings;
|
||||
private AuthMethod value = AuthMethod.NONE;
|
||||
private EncryptionChangeCallback encryptionChangeCallback = null;
|
||||
|
||||
|
@ -233,77 +232,65 @@ public class CredentialsPreference extends DialogPreference
|
|||
|
||||
if (password.length() >= minLength) {
|
||||
toShortWarning.setVisibility(View.GONE);
|
||||
|
||||
String confirm = passwordConfirm.getEditableText().toString();
|
||||
|
||||
if (!password.isEmpty() && !confirm.isEmpty() && password.equals(confirm)) {
|
||||
btnSave.setEnabled(true);
|
||||
} else {
|
||||
btnSave.setEnabled(false);
|
||||
}
|
||||
boolean canSave = !password.isEmpty() && !confirm.isEmpty() && password.equals(confirm);
|
||||
btnSave.setEnabled(canSave);
|
||||
} else {
|
||||
toShortWarning.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateLayout() {
|
||||
if (value == AuthMethod.NONE) {
|
||||
if (value == AuthMethod.NONE || value == AuthMethod.DEVICE) {
|
||||
credentialsLayout.setVisibility(View.GONE);
|
||||
|
||||
if (getDialog() != null)
|
||||
UIHelper.hideKeyboard(getContext(), getDialog().getCurrentFocus());
|
||||
|
||||
btnSave.setEnabled(true);
|
||||
} else if (value == AuthMethod.PASSWORD) {
|
||||
credentialsLayout.setVisibility(View.VISIBLE);
|
||||
|
||||
passwordLayout.setHint(getContext().getString(R.string.settings_hint_password));
|
||||
passwordConfirm.setHint(R.string.settings_hint_password_confirm);
|
||||
|
||||
ConfirmedPasswordTransformationHelper.setup(passwordLayout, passwordInput, passwordConfirm);
|
||||
|
||||
passwordInput.setTransformationMethod(new PasswordTransformationMethod());
|
||||
passwordConfirm.setTransformationMethod(new PasswordTransformationMethod());
|
||||
|
||||
minLength = Constants.AUTH_MIN_PASSWORD_LENGTH;
|
||||
toShortWarning.setText(getContext().getString(R.string.settings_label_short_password, minLength));
|
||||
|
||||
passwordInput.requestFocus();
|
||||
UIHelper.showKeyboard(getContext(), passwordInput);
|
||||
|
||||
btnSave.setEnabled(false);
|
||||
} else if (value == AuthMethod.PIN) {
|
||||
credentialsLayout.setVisibility(View.VISIBLE);
|
||||
|
||||
passwordLayout.setHint(getContext().getString(R.string.settings_hint_pin));
|
||||
passwordConfirm.setHint(R.string.settings_hint_pin_confirm);
|
||||
|
||||
passwordInput.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
|
||||
passwordConfirm.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
|
||||
|
||||
ConfirmedPasswordTransformationHelper.setup(passwordLayout, passwordInput, passwordConfirm);
|
||||
|
||||
minLength = Constants.AUTH_MIN_PIN_LENGTH;
|
||||
toShortWarning.setText(getContext().getString(R.string.settings_label_short_pin, minLength));
|
||||
|
||||
passwordInput.requestFocus();
|
||||
UIHelper.showKeyboard(getContext(), passwordInput);
|
||||
|
||||
btnSave.setEnabled(false);
|
||||
} else if (value == AuthMethod.DEVICE) {
|
||||
credentialsLayout.setVisibility(View.GONE);
|
||||
|
||||
if (getDialog() != null)
|
||||
UIHelper.hideKeyboard(getContext(), getDialog().getCurrentFocus());
|
||||
|
||||
if (getDialog() != null) {
|
||||
UIHelper.hideKeyboard(getContext(), passwordInput);
|
||||
}
|
||||
btnSave.setEnabled(true);
|
||||
} else if (value == AuthMethod.PASSWORD || value == AuthMethod.PIN) {
|
||||
prepareAuthMethodInputFields();
|
||||
}
|
||||
}
|
||||
|
||||
private void prepareAuthMethodInputFields() {
|
||||
if (value != AuthMethod.PIN && value != AuthMethod.PASSWORD) {
|
||||
return;
|
||||
}
|
||||
boolean isPassword = value == AuthMethod.PASSWORD;
|
||||
|
||||
credentialsLayout.setVisibility(View.VISIBLE);
|
||||
int layoutHintRes = isPassword ? R.string.settings_hint_password : R.string.settings_hint_pin;
|
||||
passwordLayout.setHint(getContext().getString(layoutHintRes));
|
||||
int confirmHintRes = isPassword ? R.string.settings_hint_password_confirm : R.string.settings_hint_pin_confirm;
|
||||
passwordConfirm.setHint(confirmHintRes);
|
||||
|
||||
int inputType = isPassword ?
|
||||
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
|
||||
(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
|
||||
passwordInput.setInputType(inputType);
|
||||
passwordConfirm.setInputType(inputType);
|
||||
ConfirmedPasswordTransformationHelper.setup(passwordLayout, passwordInput, passwordConfirm);
|
||||
|
||||
minLength = isPassword ? Constants.AUTH_MIN_PASSWORD_LENGTH : Constants.AUTH_MIN_PIN_LENGTH;
|
||||
int shortWarningRes = isPassword ? R.string.settings_label_short_password : R.string.settings_label_short_pin;
|
||||
toShortWarning.setText(getContext().getString(shortWarningRes, minLength));
|
||||
|
||||
passwordInput.requestFocus();
|
||||
UIHelper.showKeyboard(getContext(), passwordInput);
|
||||
btnSave.setEnabled(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
value = entryValues.get(position);
|
||||
updateLayout();
|
||||
clearInputFields();
|
||||
}
|
||||
|
||||
private void clearInputFields() {
|
||||
passwordInput.setText(null);
|
||||
passwordConfirm.setText(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Base64;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.codec.binary.Hex;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.shadowice.flocke.andotp.Tasks.AuthenticationTask.Result;
|
||||
import org.shadowice.flocke.andotp.Utilities.Constants.AuthMethod;
|
||||
import org.shadowice.flocke.andotp.Utilities.EncryptionHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.EncryptionHelper.PBKDF2Credentials;
|
||||
import org.shadowice.flocke.andotp.Utilities.Settings;
|
||||
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class AuthenticationTask extends UiBasedBackgroundTask<Result> {
|
||||
|
||||
private final Settings settings;
|
||||
|
||||
private final boolean isAuthUpgrade;
|
||||
private final String existingAuthCredentials;
|
||||
private final String plainPassword;
|
||||
|
||||
/**
|
||||
* @param context Context to be used to query settings (the application Context will be used to avoid memory leaks).
|
||||
* @param isAuthUpgrade true if this is an authentication upgrade and new credentials should be saved, false if this is just confirmation.
|
||||
* @param existingAuthCredentials The existing hashed authentication credentials that we have stored.
|
||||
* @param plainPassword The plaintext user-entered password to check authentication with. */
|
||||
public AuthenticationTask(Context context, boolean isAuthUpgrade, String existingAuthCredentials, String plainPassword) {
|
||||
super(Result.failure());
|
||||
Context applicationContext = context.getApplicationContext();
|
||||
this.settings = new Settings(applicationContext);
|
||||
|
||||
this.isAuthUpgrade = isAuthUpgrade;
|
||||
this.existingAuthCredentials = existingAuthCredentials;
|
||||
this.plainPassword = plainPassword;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected Result doInBackground() {
|
||||
if (isAuthUpgrade) {
|
||||
return upgradeAuthentication();
|
||||
} else {
|
||||
return confirmAuthentication();
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Result upgradeAuthentication() {
|
||||
String hashedPassword = new String(Hex.encodeHex(DigestUtils.sha256(plainPassword)));
|
||||
if (!hashedPassword.equals(existingAuthCredentials))
|
||||
return Result.failure();
|
||||
|
||||
byte[] key = settings.setAuthCredentials(plainPassword);
|
||||
|
||||
AuthMethod authMethod = settings.getAuthMethod();
|
||||
if (authMethod == AuthMethod.PASSWORD)
|
||||
settings.removeAuthPasswordHash();
|
||||
else if (authMethod == AuthMethod.PIN)
|
||||
settings.removeAuthPINHash();
|
||||
|
||||
if (key == null)
|
||||
return Result.upgradeFailure();
|
||||
else
|
||||
return Result.success(key);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Result confirmAuthentication() {
|
||||
try {
|
||||
PBKDF2Credentials credentials = EncryptionHelper.generatePBKDF2Credentials(plainPassword, settings.getSalt(), settings.getIterations());
|
||||
byte[] passwordArray = Base64.decode(existingAuthCredentials, Base64.URL_SAFE);
|
||||
|
||||
if (Arrays.equals(passwordArray, credentials.password)) {
|
||||
return Result.success(credentials.key);
|
||||
}
|
||||
return Result.failure();
|
||||
} catch (NoSuchAlgorithmException | InvalidKeySpecException | IllegalArgumentException e) {
|
||||
Log.e("AuthenticationTask", "Problem decoding password", e);
|
||||
return Result.failure();
|
||||
}
|
||||
}
|
||||
|
||||
public static class Result {
|
||||
@Nullable
|
||||
public final byte[] encryptionKey;
|
||||
public final boolean authUpgradeFailed;
|
||||
|
||||
public Result(@Nullable byte[] encryptionKey, boolean authUpgradeFailed) {
|
||||
this.encryptionKey = encryptionKey;
|
||||
this.authUpgradeFailed = authUpgradeFailed;
|
||||
}
|
||||
|
||||
public static Result success(byte[] encryptionKey) {
|
||||
return new Result(encryptionKey, false);
|
||||
}
|
||||
|
||||
public static Result upgradeFailure() {
|
||||
return new Result(null, true);
|
||||
}
|
||||
|
||||
public static Result failure() {
|
||||
return new Result(null, false);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.shadowice.flocke.andotp.Database.Entry;
|
||||
import org.shadowice.flocke.andotp.Utilities.BackupHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.Constants;
|
||||
import org.shadowice.flocke.andotp.Utilities.DatabaseHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class EncryptedBackupTask extends GenericBackupTask {
|
||||
private final String password;
|
||||
private final ArrayList<Entry> entries;
|
||||
|
||||
public EncryptedBackupTask(Context context, ArrayList<Entry> entries, String password, @Nullable Uri uri) {
|
||||
super(context, uri);
|
||||
this.entries = entries;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected Constants.BackupType getBackupType() {
|
||||
return Constants.BackupType.ENCRYPTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean doBackup() {
|
||||
String payload = DatabaseHelper.entriesToString(entries);
|
||||
return BackupHelper.backupToFile(applicationContext, uri, password, payload);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.shadowice.flocke.andotp.R;
|
||||
import org.shadowice.flocke.andotp.Utilities.Constants;
|
||||
import org.shadowice.flocke.andotp.Utilities.EncryptionHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.StorageAccessHelper;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.crypto.SecretKey;
|
||||
|
||||
public class EncryptedRestoreTask extends GenericRestoreTask {
|
||||
private final String password;
|
||||
private final boolean oldFormat;
|
||||
|
||||
public EncryptedRestoreTask(Context context, Uri uri, String password, boolean oldFormat) {
|
||||
super(context, uri);
|
||||
this.password = password;
|
||||
this.oldFormat = oldFormat;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected RestoreTaskResult doInBackground() {
|
||||
boolean success = true;
|
||||
String decryptedString = "";
|
||||
|
||||
try {
|
||||
byte[] data = StorageAccessHelper.loadFile(applicationContext, uri);
|
||||
|
||||
if (oldFormat) {
|
||||
SecretKey key = EncryptionHelper.generateSymmetricKeyFromPassword(password);
|
||||
byte[] decrypted = EncryptionHelper.decrypt(key, data);
|
||||
|
||||
decryptedString = new String(decrypted, StandardCharsets.UTF_8);
|
||||
} else {
|
||||
byte[] iterBytes = Arrays.copyOfRange(data, 0, Constants.INT_LENGTH);
|
||||
byte[] salt = Arrays.copyOfRange(data, Constants.INT_LENGTH, Constants.INT_LENGTH + Constants.ENCRYPTION_IV_LENGTH);
|
||||
byte[] encrypted = Arrays.copyOfRange(data, Constants.INT_LENGTH + Constants.ENCRYPTION_IV_LENGTH, data.length);
|
||||
|
||||
int iter = ByteBuffer.wrap(iterBytes).getInt();
|
||||
|
||||
SecretKey key = EncryptionHelper.generateSymmetricKeyPBKDF2(password, iter, salt);
|
||||
|
||||
byte[] decrypted = EncryptionHelper.decrypt(key, encrypted);
|
||||
decryptedString = new String(decrypted, StandardCharsets.UTF_8);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
success = false;
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (success) {
|
||||
return RestoreTaskResult.success(decryptedString);
|
||||
} else {
|
||||
return RestoreTaskResult.failure(R.string.backup_toast_import_decryption_failed);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.shadowice.flocke.andotp.R;
|
||||
import org.shadowice.flocke.andotp.Utilities.BackupHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.Constants;
|
||||
import org.shadowice.flocke.andotp.Utilities.Settings;
|
||||
|
||||
public abstract class GenericBackupTask extends UiBasedBackgroundTask<GenericBackupTask.BackupTaskResult> {
|
||||
protected final Context applicationContext;
|
||||
protected final Settings settings;
|
||||
protected final Constants.BackupType type;
|
||||
protected Uri uri;
|
||||
|
||||
public GenericBackupTask(Context context, @Nullable Uri uri) {
|
||||
super(BackupTaskResult.failure());
|
||||
|
||||
this.applicationContext = context.getApplicationContext();
|
||||
this.settings = new Settings(applicationContext);
|
||||
|
||||
this.type = getBackupType();
|
||||
this.uri = uri;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected BackupTaskResult doInBackground() {
|
||||
if (uri == null) {
|
||||
BackupHelper.BackupFile backupFile = BackupHelper.backupFile(applicationContext, settings.getBackupLocation(), type);
|
||||
|
||||
if (backupFile.file == null)
|
||||
return new BackupTaskResult(false, backupFile.errorMessage);
|
||||
|
||||
uri = backupFile.file.getUri();
|
||||
}
|
||||
|
||||
boolean success = doBackup();
|
||||
|
||||
if (success)
|
||||
return BackupTaskResult.success();
|
||||
else
|
||||
return BackupTaskResult.failure();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
protected abstract Constants.BackupType getBackupType();
|
||||
protected abstract boolean doBackup();
|
||||
|
||||
|
||||
public static class BackupTaskResult {
|
||||
public final boolean success;
|
||||
public final int messageId;
|
||||
|
||||
public BackupTaskResult(boolean success, int messageId) {
|
||||
this.success = success;
|
||||
this.messageId = messageId;
|
||||
}
|
||||
|
||||
public static BackupTaskResult success() {
|
||||
return new BackupTaskResult(true, R.string.backup_toast_export_success);
|
||||
}
|
||||
|
||||
public static BackupTaskResult failure() {
|
||||
return new BackupTaskResult(false, R.string.backup_toast_export_failed);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.shadowice.flocke.andotp.R;
|
||||
import org.shadowice.flocke.andotp.Utilities.Settings;
|
||||
|
||||
public abstract class GenericRestoreTask extends UiBasedBackgroundTask<GenericRestoreTask.RestoreTaskResult> {
|
||||
protected final Context applicationContext;
|
||||
protected final Settings settings;
|
||||
protected Uri uri;
|
||||
|
||||
public GenericRestoreTask(Context context, @Nullable Uri uri) {
|
||||
super(GenericRestoreTask.RestoreTaskResult.failure(R.string.backup_toast_import_failed));
|
||||
|
||||
this.applicationContext = context.getApplicationContext();
|
||||
this.settings = new Settings(applicationContext);
|
||||
|
||||
this.uri = uri;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected abstract RestoreTaskResult doInBackground();
|
||||
|
||||
public static class RestoreTaskResult {
|
||||
public final boolean success;
|
||||
public final String payload;
|
||||
public final int messageId;
|
||||
|
||||
public boolean isPGP = false;
|
||||
public Intent decryptIntent = null;
|
||||
public Uri uri = null;
|
||||
|
||||
public RestoreTaskResult(boolean success, String payload, int messageId) {
|
||||
this.success = success;
|
||||
this.payload = payload;
|
||||
this.messageId = messageId;
|
||||
}
|
||||
|
||||
public RestoreTaskResult(boolean success, String payload, int messageId, boolean isPGP, Intent decryptIntent, Uri uri) {
|
||||
this.success = success;
|
||||
this.payload = payload;
|
||||
this.messageId = messageId;
|
||||
this.isPGP = isPGP;
|
||||
this.decryptIntent = decryptIntent;
|
||||
this.uri = uri;
|
||||
}
|
||||
|
||||
public static RestoreTaskResult success(String payload) {
|
||||
return new RestoreTaskResult(true, payload, 0);
|
||||
}
|
||||
|
||||
public static RestoreTaskResult failure(int messageId) {
|
||||
return new RestoreTaskResult(false, null, messageId);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.shadowice.flocke.andotp.Utilities.Constants;
|
||||
import org.shadowice.flocke.andotp.Utilities.StorageAccessHelper;
|
||||
|
||||
public class PGPBackupTask extends GenericBackupTask {
|
||||
private final String payload;
|
||||
|
||||
public PGPBackupTask(Context context, String payload, @Nullable Uri uri) {
|
||||
super(context, uri);
|
||||
this.payload = payload;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected Constants.BackupType getBackupType() {
|
||||
return Constants.BackupType.OPEN_PGP;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean doBackup() {
|
||||
return StorageAccessHelper.saveFile(applicationContext, uri, payload);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.shadowice.flocke.andotp.Utilities.StorageAccessHelper;
|
||||
|
||||
public class PGPRestoreTask extends GenericRestoreTask {
|
||||
private final Intent decryptIntent;
|
||||
|
||||
public PGPRestoreTask(Context context, Uri uri, Intent decryptIntent) {
|
||||
super(context, uri);
|
||||
this.decryptIntent = decryptIntent;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected RestoreTaskResult doInBackground() {
|
||||
String data = StorageAccessHelper.loadFileString(applicationContext, uri);
|
||||
|
||||
return new RestoreTaskResult(true, data, 0, true, decryptIntent, uri);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.shadowice.flocke.andotp.Database.Entry;
|
||||
import org.shadowice.flocke.andotp.Utilities.Constants;
|
||||
import org.shadowice.flocke.andotp.Utilities.DatabaseHelper;
|
||||
import org.shadowice.flocke.andotp.Utilities.StorageAccessHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class PlainTextBackupTask extends GenericBackupTask {
|
||||
private final ArrayList<Entry> entries;
|
||||
|
||||
public PlainTextBackupTask(Context context, ArrayList<Entry> entries, @Nullable Uri uri) {
|
||||
super(context, uri);
|
||||
this.entries = entries;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected Constants.BackupType getBackupType() {
|
||||
return Constants.BackupType.PLAIN_TEXT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean doBackup() {
|
||||
String payload = DatabaseHelper.entriesToString(entries);
|
||||
return StorageAccessHelper.saveFile(applicationContext, uri, payload);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.shadowice.flocke.andotp.Utilities.StorageAccessHelper;
|
||||
|
||||
public class PlainTextRestoreTask extends GenericRestoreTask {
|
||||
public PlainTextRestoreTask(Context context, Uri uri) {
|
||||
super(context, uri);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NonNull
|
||||
protected RestoreTaskResult doInBackground() {
|
||||
String data = StorageAccessHelper.loadFileString(applicationContext, uri);
|
||||
return RestoreTaskResult.success(data);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
package org.shadowice.flocke.andotp.Tasks;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.AnyThread;
|
||||
import androidx.annotation.MainThread;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/** Encapsulates a background task that needs to communicate back to the UI (on the main thread) to
|
||||
* provide a result. */
|
||||
public abstract class UiBasedBackgroundTask<Result> {
|
||||
|
||||
private final Result failedResult;
|
||||
private final ExecutorService executor;
|
||||
private final Handler mainThreadHandler;
|
||||
|
||||
private final Object callbackLock = new Object();
|
||||
@Nullable
|
||||
private UiCallback<Result> callback;
|
||||
@Nullable
|
||||
private Result awaitedResult;
|
||||
|
||||
private volatile boolean isCanceled = false;
|
||||
|
||||
/** @param failedResult The result to return if the task fails (throws an exception or returns null). */
|
||||
public UiBasedBackgroundTask(@NonNull Result failedResult) {
|
||||
this.failedResult = failedResult;
|
||||
this.executor = Executors.newSingleThreadExecutor();
|
||||
this.mainThreadHandler = new Handler(Looper.getMainLooper());
|
||||
}
|
||||
|
||||
/** @param callback If null, any results which may arrive from a currently executing task will
|
||||
* be stored until a new callback is set. */
|
||||
public void setCallback(@Nullable UiCallback<Result> callback) {
|
||||
synchronized (callbackLock) {
|
||||
// Don't bother doing anything if the task was canceled.
|
||||
if (isCanceled()) {
|
||||
return;
|
||||
}
|
||||
this.callback = callback;
|
||||
// If we have an awaited result and are setting a new callback, publish the result immediately.
|
||||
if (awaitedResult != null && callback != null) {
|
||||
emitResultOnMainThread(callback, awaitedResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void emitResultOnMainThread(@NonNull UiCallback<Result> callback, @NonNull Result result) {
|
||||
mainThreadHandler.post(() -> callback.onResult(result));
|
||||
this.callback = null;
|
||||
this.awaitedResult = null;
|
||||
}
|
||||
|
||||
/** Executed the task on a background thread. Safe to call from the main thread. */
|
||||
@AnyThread
|
||||
public void execute() {
|
||||
executor.execute(this::runTask);
|
||||
}
|
||||
|
||||
private void runTask() {
|
||||
Result result = failedResult;
|
||||
try {
|
||||
result = doInBackground();
|
||||
} catch (Exception e) {
|
||||
Log.e("UiBasedBackgroundTask", "Problem running background task", e);
|
||||
}
|
||||
|
||||
synchronized (callbackLock) {
|
||||
// Don't bother issuing callback or storing result if this task is canceled.
|
||||
if (isCanceled()) {
|
||||
return;
|
||||
}
|
||||
if (callback != null) {
|
||||
emitResultOnMainThread(callback, result);
|
||||
} else {
|
||||
awaitedResult = result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Work to be done in a background thread.
|
||||
* @return Return the result from this task's execution.
|
||||
* @throws Exception If an Exception is thrown from this task's execution, it will be logged
|
||||
* and the provided default Result will be returned. */
|
||||
@NonNull
|
||||
protected abstract Result doInBackground() throws Exception;
|
||||
|
||||
@AnyThread
|
||||
public boolean isCanceled() {
|
||||
return isCanceled;
|
||||
}
|
||||
|
||||
@AnyThread
|
||||
public void cancel() {
|
||||
isCanceled = true;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface UiCallback<Result> {
|
||||
@MainThread
|
||||
void onResult(@NonNull Result result);
|
||||
}
|
||||
}
|
|
@ -29,6 +29,8 @@ import android.app.backup.BackupDataOutput;
|
|||
import android.app.backup.FileBackupHelper;
|
||||
import android.app.backup.SharedPreferencesBackupHelper;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
@ -44,19 +46,29 @@ public class BackupAgent extends BackupAgentHelper {
|
|||
@Override
|
||||
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException {
|
||||
Settings settings = new Settings(this);
|
||||
StringBuilder stringBuilder = new StringBuilder("onBackup called with the backup service set to ");
|
||||
stringBuilder.append(settings.getAndroidBackupServiceEnabled() ? "enabled" : "disabled");
|
||||
|
||||
if(settings.getAndroidBackupServiceEnabled()) {
|
||||
synchronized (DatabaseHelper.DatabaseFileLock) {
|
||||
stringBuilder.append(" calling parent onBackup");
|
||||
super.onBackup(oldState, data, newState);
|
||||
}
|
||||
}
|
||||
Log.d(BackupAgent.class.getSimpleName(), stringBuilder.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException {
|
||||
Settings settings = new Settings(this);
|
||||
StringBuilder stringBuilder = new StringBuilder("onRestore called with the backup service set to ");
|
||||
stringBuilder.append(settings.getAndroidBackupServiceEnabled() ? "enabled" : "disabled");
|
||||
|
||||
synchronized (DatabaseHelper.DatabaseFileLock) {
|
||||
stringBuilder.append(" but restore happens regardless, calling parent onRestore");
|
||||
super.onRestore(data, appVersionCode, newState);
|
||||
}
|
||||
Log.d(BackupAgent.class.getSimpleName(), stringBuilder.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -101,11 +101,17 @@ public class BackupHelper {
|
|||
return Constants.BackupType.UNAVAILABLE;
|
||||
}
|
||||
|
||||
public static boolean backupToFile(Context context, Uri uri, String password, SecretKey encryptionKey)
|
||||
{
|
||||
public static boolean backupToFile(Context context, Uri uri, String password, SecretKey encryptionKey) {
|
||||
ArrayList<Entry> entries = DatabaseHelper.loadDatabase(context, encryptionKey);
|
||||
String plain = DatabaseHelper.entriesToString(entries);
|
||||
|
||||
return backupToFile(context, uri, password, plain);
|
||||
}
|
||||
|
||||
public static boolean backupToFile(Context context, Uri uri, String password, String plain)
|
||||
{
|
||||
boolean success = true;
|
||||
|
||||
try {
|
||||
int iter = EncryptionHelper.generateRandomIterations();
|
||||
byte[] salt = EncryptionHelper.generateRandom(Constants.ENCRYPTION_IV_LENGTH);
|
||||
|
@ -120,12 +126,12 @@ public class BackupHelper {
|
|||
System.arraycopy(salt, 0, data, Constants.INT_LENGTH, Constants.ENCRYPTION_IV_LENGTH);
|
||||
System.arraycopy(encrypted, 0, data, Constants.INT_LENGTH + Constants.ENCRYPTION_IV_LENGTH, encrypted.length);
|
||||
|
||||
StorageAccessHelper.saveFile(context, uri, data);
|
||||
success = StorageAccessHelper.saveFile(context, uri, data);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
success = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return success;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -79,6 +79,7 @@ public class EntryThumbnail {
|
|||
AirBNB(R.drawable.thumb_airbnb),
|
||||
Airbrake(R.drawable.thumb_airbrake),
|
||||
AirTable(R.drawable.thumb_airtable),
|
||||
AirVPN(R.drawable.thumb_airvpn),
|
||||
AllegroPl(R.drawable.thumb_allegropl),
|
||||
Alwaysdata(R.drawable.thumb_alwaysdata),
|
||||
Amazon(R.drawable.thumb_amazon),
|
||||
|
@ -86,16 +87,19 @@ public class EntryThumbnail {
|
|||
AngelList(R.drawable.thumb_angellist),
|
||||
AnimeBytes(R.drawable.thumb_animebytes),
|
||||
Anonaddy(R.drawable.thumb_anonaddy),
|
||||
AnyDesk(R.drawable.thumb_anydesk),
|
||||
Apache(R.drawable.thumb_apache),
|
||||
Apple(R.drawable.thumb_apple),
|
||||
Appveyor(R.drawable.thumb_appveyor),
|
||||
ArenaNet(R.drawable.thumb_arenanet),
|
||||
AtlanticNet(R.drawable.thumb_atlantic_net),
|
||||
Atlassian(R.drawable.thumb_atlassian),
|
||||
Autodesk(R.drawable.thumb_autodesk),
|
||||
AutoDNS(R.drawable.thumb_autodns),
|
||||
AVM(R.drawable.thumb_avm),
|
||||
Backblaze(R.drawable.thumb_backblaze),
|
||||
BattleNet(R.drawable.thumb_battlenet),
|
||||
BestBuy(R.drawable.thumb_bestbuy),
|
||||
Betterment(R.drawable.thumb_betterment),
|
||||
Binance(R.drawable.thumb_binance),
|
||||
BitBucket(R.drawable.thumb_bitbucket),
|
||||
|
@ -109,14 +113,18 @@ public class EntryThumbnail {
|
|||
Bitwala(R.drawable.thumb_bitwala),
|
||||
Bitwarden(R.drawable.thumb_bitwarden),
|
||||
BlockchainInfo(R.drawable.thumb_blockchain_info),
|
||||
Boxcryptor(R.drawable.thumb_boxcryptor),
|
||||
BraveRewards(R.drawable.thumb_braverewards),
|
||||
Bugcrowd(R.drawable.thumb_bugcrowd),
|
||||
CEXio(R.drawable.thumb_cexio),
|
||||
ChurchTools(R.drawable.thumb_church_tools),
|
||||
Cisco(R.drawable.thumb_cisco),
|
||||
Citrix(R.drawable.thumb_citrix),
|
||||
CloudDownload(R.drawable.thumb_cloud_download),
|
||||
Cloudflare(R.drawable.thumb_cloudflare),
|
||||
Clubhouse(R.drawable.thumb_clubhouse),
|
||||
Cobranded(R.drawable.thumb_cobranded),
|
||||
Codeberg(R.drawable.thumb_codeberg),
|
||||
Codegiant(R.drawable.thumb_codegiant),
|
||||
Coinbase(R.drawable.thumb_coinbase),
|
||||
CoinJar(R.drawable.thumb_coinjar),
|
||||
|
@ -124,12 +132,14 @@ public class EntryThumbnail {
|
|||
ComputerBase(R.drawable.thumb_computerbase),
|
||||
ConnectWiseManage(R.drawable.thumb_connectwise_manage),
|
||||
CozyCloud(R.drawable.thumb_cozycloud),
|
||||
CrowdSupply(R.drawable.thumb_crowd_supply),
|
||||
Crowdin(R.drawable.thumb_crowdin),
|
||||
Cyon(R.drawable.thumb_cyon),
|
||||
Dashlane(R.drawable.thumb_dashlane),
|
||||
Debian(R.drawable.thumb_debian),
|
||||
Degiro(R.drawable.thumb_degiro),
|
||||
Denic(R.drawable.thumb_denic),
|
||||
Deribit(R.drawable.thumb_deribit),
|
||||
Diaspora(R.drawable.thumb_diaspora),
|
||||
Digidentity(R.drawable.thumb_digidentity),
|
||||
DigitalOcean(R.drawable.thumb_digital_ocean),
|
||||
|
@ -152,6 +162,7 @@ public class EntryThumbnail {
|
|||
FACEIT(R.drawable.thumb_faceit),
|
||||
Fanatical(R.drawable.thumb_fanatical),
|
||||
Fastmail(R.drawable.thumb_fastmail),
|
||||
FidelityInvestments(R.drawable.thumb_fidelity_investments),
|
||||
Figma(R.drawable.thumb_figma),
|
||||
Fingerprint(R.drawable.thumb_fingerprint),
|
||||
Finnair(R.drawable.thumb_finnair),
|
||||
|
@ -168,6 +179,7 @@ public class EntryThumbnail {
|
|||
GitHub(R.drawable.thumb_github),
|
||||
GitLab(R.drawable.thumb_gitlab),
|
||||
GMX(R.drawable.thumb_gmx),
|
||||
GoatCounter(R.drawable.thumb_goatcounter),
|
||||
GoDaddy(R.drawable.thumb_godaddy),
|
||||
Gogs(R.drawable.thumb_gogs),
|
||||
Google(R.drawable.thumb_google),
|
||||
|
@ -180,12 +192,14 @@ public class EntryThumbnail {
|
|||
HitBTC(R.drawable.thumb_hitbtc),
|
||||
HMRC(R.drawable.thumb_hmrc),
|
||||
HomeAssistant(R.drawable.thumb_home_assistant),
|
||||
HostingDE(R.drawable.thumb_hosting_de),
|
||||
Hover(R.drawable.thumb_hover),
|
||||
HumbleBundle(R.drawable.thumb_humblebundle),
|
||||
HurricaneElectric(R.drawable.thumb_hurricane_electric),
|
||||
IBM(R.drawable.thumb_ibm),
|
||||
Iconomi(R.drawable.thumb_iconomi),
|
||||
IFTTT(R.drawable.thumb_ifttt),
|
||||
ImmoScout24(R.drawable.thumb_immo_scout24),
|
||||
Infomaniak(R.drawable.thumb_infomaniak),
|
||||
Instagram(R.drawable.thumb_instagram),
|
||||
INWX(R.drawable.thumb_inwx),
|
||||
|
@ -193,7 +207,9 @@ public class EntryThumbnail {
|
|||
Jagex(R.drawable.thumb_jagex),
|
||||
JetBrains(R.drawable.thumb_jetbrains),
|
||||
Joomla(R.drawable.thumb_joomla),
|
||||
KDE(R.drawable.thumb_kde),
|
||||
Keeper(R.drawable.thumb_keeper),
|
||||
Keycloak(R.drawable.thumb_keycloak),
|
||||
Kickstarter(R.drawable.thumb_kickstarter),
|
||||
Kraken(R.drawable.thumb_kraken),
|
||||
Kucoin(R.drawable.thumb_kucoin),
|
||||
|
@ -209,17 +225,23 @@ public class EntryThumbnail {
|
|||
LocalMonero(R.drawable.thumb_localmonero),
|
||||
LoginGov(R.drawable.thumb_login_gov),
|
||||
LogMeIn(R.drawable.thumb_logmein),
|
||||
LuaDNS(R.drawable.thumb_luadns),
|
||||
MailDE(R.drawable.thumb_mail_de),
|
||||
Mailbox(R.drawable.thumb_mailbox),
|
||||
Mailchimp(R.drawable.thumb_mailchimp),
|
||||
Mailcow(R.drawable.thumb_mailcow),
|
||||
Mailgun(R.drawable.thumb_mailgun),
|
||||
Mailru(R.drawable.thumb_mailru),
|
||||
Malwaretips(R.drawable.thumb_malwaretips),
|
||||
Mangadex(R.drawable.thumb_mangadex),
|
||||
Mapbox(R.drawable.thumb_mapbox),
|
||||
Mastodon(R.drawable.thumb_mastodon),
|
||||
Matomo(R.drawable.thumb_matomo),
|
||||
Mattermost(R.drawable.thumb_mattermost),
|
||||
Mediawiki(R.mipmap.thumb_mediawiki, AssetType.Bitmap),
|
||||
Mega(R.drawable.thumb_mega),
|
||||
MercadoLibre(R.drawable.thumb_mercadolibre),
|
||||
Mercury(R.drawable.thumb_mercury),
|
||||
Microsoft(R.drawable.thumb_microsoft),
|
||||
MicrosoftTeams(R.drawable.thumb_microsoft_teams),
|
||||
Migadu(R.drawable.thumb_migadu),
|
||||
|
@ -229,11 +251,14 @@ public class EntryThumbnail {
|
|||
Mixer(R.drawable.thumb_mixer),
|
||||
MongoDB(R.drawable.thumb_mongodb),
|
||||
MVPSnet(R.drawable.thumb_mvpsnet),
|
||||
MyGovAU(R.drawable.thumb_my_gov_au),
|
||||
NameCheap(R.drawable.thumb_namecheap),
|
||||
NameCom(R.drawable.thumb_namecom),
|
||||
NAS(R.drawable.thumb_nas),
|
||||
netcup(R.drawable.thumb_netcup),
|
||||
netlify(R.drawable.thumb_netlify),
|
||||
NextCloud(R.drawable.thumb_nextcloud),
|
||||
NextDNS(R.drawable.thumb_nextdns),
|
||||
Nintendo(R.drawable.thumb_nintendo),
|
||||
NoStarchPress(R.drawable.thumb_no_starch_press),
|
||||
NOYB(R.drawable.thumb_noyb),
|
||||
|
@ -257,8 +282,11 @@ public class EntryThumbnail {
|
|||
PaySafe(R.drawable.thumb_paysafecard),
|
||||
PayWithPrivacy(R.drawable.thumb_paywithprivacy),
|
||||
PCloud(R.drawable.thumb_pcloud),
|
||||
PeeringDB(R.drawable.thumb_peeringdb),
|
||||
Phabricator(R.drawable.thumb_phabricator),
|
||||
phpMyAdmin(R.drawable.thumb_phpmyadmin),
|
||||
PlayStation(R.drawable.thumb_playstation),
|
||||
Plex(R.drawable.thumb_plex),
|
||||
Pluralsight(R.drawable.thumb_pluralsight),
|
||||
Plurk(R.drawable.thumb_plurk),
|
||||
Posteo(R.drawable.thumb_posteo),
|
||||
|
@ -281,15 +309,19 @@ public class EntryThumbnail {
|
|||
RSS(R.drawable.thumb_rss),
|
||||
Samsung(R.drawable.thumb_samsung),
|
||||
SAP(R.drawable.thumb_sap),
|
||||
Saxobank(R.drawable.thumb_saxobank),
|
||||
Scaleway(R.drawable.thumb_scaleway),
|
||||
School(R.drawable.thumb_school),
|
||||
Sciebo(R.drawable.thumb_sciebo),
|
||||
SelfWealth(R.drawable.thumb_selfwealth),
|
||||
Seafile(R.mipmap.thumb_seafile, AssetType.Bitmap),
|
||||
Sentry(R.drawable.thumb_sentry),
|
||||
Sevdesk(R.drawable.thumb_sevdesk),
|
||||
SimpleLogin(R.drawable.thumb_simple_login),
|
||||
Skrill(R.drawable.thumb_skrill),
|
||||
Slack(R.drawable.thumb_slack),
|
||||
Snapchat(R.drawable.thumb_snapchat),
|
||||
SOGo(R.drawable.thumb_sogo),
|
||||
Sophos(R.drawable.thumb_sophos),
|
||||
SourceForge(R.drawable.thumb_sourceforge),
|
||||
Squarespace(R.drawable.thumb_squarespace),
|
||||
|
@ -297,14 +329,18 @@ public class EntryThumbnail {
|
|||
StarCitizen(R.drawable.thumb_starcitizen),
|
||||
Steam(R.drawable.thumb_steam),
|
||||
Stripe(R.drawable.thumb_stripe),
|
||||
Sumologic(R.drawable.thumb_sumologic),
|
||||
Sync(R.drawable.thumb_sync),
|
||||
Synology(R.drawable.thumb_synology),
|
||||
TeaHub(R.drawable.thumb_teahub),
|
||||
TeamViewer(R.drawable.thumb_teamviewer),
|
||||
Terminal(R.drawable.thumb_terminal),
|
||||
TeslaMotors(R.drawable.thumb_tesla_motors),
|
||||
TMobile(R.drawable.thumb_t_mobile),
|
||||
TransIP(R.drawable.thumb_transip),
|
||||
Trello(R.drawable.thumb_trello),
|
||||
Tumblr(R.drawable.thumb_tumblr),
|
||||
TUBerlin(R.drawable.thumb_tu_berlin),
|
||||
TurboTax(R.drawable.thumb_turbotax),
|
||||
Tutanota(R.drawable.thumb_tutanota),
|
||||
TUWien(R.drawable.thumb_tuwien_ac_at),
|
||||
|
@ -314,8 +350,8 @@ public class EntryThumbnail {
|
|||
Uber(R.drawable.thumb_uber),
|
||||
UbiquitiNetworks(R.drawable.thumb_ubnt),
|
||||
Ubisoft(R.drawable.thumb_ubisoft),
|
||||
Unity(R.drawable.thumb_unity),
|
||||
UbuntuOne(R.drawable.thumb_ubuntu_one),
|
||||
Unity(R.drawable.thumb_unity),
|
||||
Uphold(R.drawable.thumb_uphold),
|
||||
USAA(R.drawable.thumb_usaa),
|
||||
VagrantCloud(R.drawable.thumb_vagrant_cloud),
|
||||
|
@ -326,9 +362,10 @@ public class EntryThumbnail {
|
|||
Wallet(R.drawable.thumb_wallet),
|
||||
Wargaming(R.drawable.thumb_wargaming),
|
||||
Wasabi(R.drawable.thumb_wasabi),
|
||||
Weclapp(R.drawable.thumb_weclapp),
|
||||
WebDe(R.drawable.thumb_web_de),
|
||||
Weclapp(R.drawable.thumb_weclapp),
|
||||
Wikimedia(R.drawable.thumb_wikimedia),
|
||||
Wildduck(R.drawable.thumb_wildduck),
|
||||
Wordfence(R.drawable.thumb_wordfence),
|
||||
Wordpress(R.drawable.thumb_wordpress),
|
||||
Workplace(R.drawable.thumb_workplace),
|
||||
|
@ -341,8 +378,8 @@ public class EntryThumbnail {
|
|||
Zoho(R.drawable.thumb_zoho),
|
||||
Zoom(R.drawable.thumb_zoom);
|
||||
|
||||
private int resource;
|
||||
private AssetType assetType;
|
||||
private final int resource;
|
||||
private final AssetType assetType;
|
||||
|
||||
EntryThumbnails(int resource) {
|
||||
this.resource = resource;
|
||||
|
|
|
@ -576,6 +576,10 @@ public class Settings {
|
|||
return getBoolean(R.string.settings_key_show_individual_timeouts, false);
|
||||
}
|
||||
|
||||
public boolean isFocusSearchOnStartEnabled() {
|
||||
return getBoolean(R.string.settings_key_focus_search_on_start, false);
|
||||
}
|
||||
|
||||
public Constants.TapMode getTapSingle() {
|
||||
String singleTap = getString(R.string.settings_key_tap_single, R.string.settings_default_tap_single);
|
||||
return Constants.TapMode.valueOf(singleTap.toUpperCase(Locale.ENGLISH));
|
||||
|
@ -601,4 +605,13 @@ public class Settings {
|
|||
public boolean getBlockAutofill() {
|
||||
return getBoolean(R.string.settings_key_block_autofill, false);
|
||||
}
|
||||
|
||||
public void setDefaultBackupType(Constants.BackupType type) {
|
||||
setString(R.string.settings_key_backup_default_type, type.name().toLowerCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
public Constants.BackupType getDefaultBackupType() {
|
||||
String defaultType = getString(R.string.settings_key_backup_default_type, Constants.BackupType.ENCRYPTED.name());
|
||||
return Constants.BackupType.valueOf(defaultType.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
}
|
||||
|
|
9
app/src/main/res/drawable/thumb_airvpn.xml
Normal file
9
app/src/main/res/drawable/thumb_airvpn.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:fillColor="#4ea9ff"
|
||||
android:pathData="m100,0c-55.22,-0 -100,44.76 -100,100 0,55.22 44.76,100 100,100 55.22,-0 100,-44.76 100,-100 0,-55.22 -44.76,-100 -100,-100zM128.31,44.51c3.82,1.97 6.13,5.50 7.34,9.35 1.11,5.12 0.34,9.93 -0.03,14.66 3.86,-0.03 8.08,0.85 11.15,2.78 2.66,1.99 3.77,4.67 3.92,7.76 0.02,1.01 -0.07,1.92 -0.24,2.83 -0.05,0.30 -0.14,0.61 -0.25,0.92 1.47,-0.42 2.98,-0.48 4.39,-0.47 6.83,0.55 12.99,4.05 17.55,8.50 4.31,4.56 7.70,9.94 8.08,15.85 -0.29,9.08 -7.18,15.37 -14.66,18.20 -8.40,2.63 -17.58,3.25 -25.41,0.70 -4.56,-1.59 -8.3,-4.12 -10.61,-8.23 -0.43,-0.84 -0.70,-1.75 -0.94,-2.60l-0.24,0c-0.13,0.59 -0.32,1.17 -0.54,1.73 -0.44,1.18 -1.13,2.22 -1.79,3.18 -1.57,2.10 -3.62,3.68 -5.71,4.94 -3.45,1.95 -7.26,2.78 -11.04,2.64 -3.83,-0.28 -7.58,-2.38 -10.01,-4.87 -0.43,-0.48 -0.75,-1.06 -1.04,-1.60l-0.49,0c-0.24,0.82 -0.73,1.52 -1.19,2.17 -1.12,1.38 -2.61,2.28 -4.05,3.06 -3.78,1.70 -8.00,2.62 -11.85,2.88 -3.42,0.23 -6.74,-0.21 -9.74,-1.61 -3.51,-1.83 -4.9,-5.42 -5.47,-8.99 -0.48,-4.84 0.67,-9.55 2.35,-13.84 1.41,-3.45 3.26,-6.67 5.44,-9.41 2.68,-3.43 6.46,-6.31 10.13,-8.13 5.64,-2.51 11.82,-2.97 17.50,-2.34 3.79,0.5 7.37,1.60 10.71,3.14 1.35,0.63 2.61,1.38 3.79,2.13 -0.78,-1.50 -1.77,-2.82 -2.77,-4.04 -1.05,-1.22 -2.26,-2.24 -3.45,-3.15 -3.91,-2.84 -8.48,-4.13 -13.04,-4.67 -4.88,-0.43 -9.68,0.23 -14.16,1.58 -4.43,1.39 -8.40,3.69 -11.91,6.42 -3.63,2.90 -6.59,6.42 -8.93,10.21 -2.84,4.70 -4.36,10.14 -4.86,15.35 -0.30,3.28 -0.22,6.79 0.20,9.76 -0.05,1.74 -1.06,1.94 -2.43,2.09 -3.97,0.16 -7.61,-0.79 -11.25,-1.82 -6.30,-1.76 -12.84,-4.89 -17.11,-9.14 -2.54,-2.72 -4.21,-6.01 -5.30,-9.39 -1.7,-7.27 -0.82,-13.84 3.32,-19.48 3.84,-4.60 9.12,-7.39 14.34,-9.24 2.83,-0.91 5.73,-1.57 8.48,-1.94 1.39,-0.18 2.76,-0.30 4.09,-0.36 -0.02,-2.35 0.68,-4.48 1.75,-6.45 3.22,-4.80 8.51,-6.84 13.79,-7.8 3.70,-0.46 7.30,-0.33 10.57,-0.19 0.92,0.10 2.60,0.26 2.60,0.26 0.85,-1.97 1.41,-3.14 2.36,-4.64 4.22,-5.75 11.59,-9.02 17.83,-10.63 9.87,-1.65 20.14,-2.16 28.89,1.93z" />
|
||||
</vector>
|
12
app/src/main/res/drawable/thumb_anydesk.xml
Normal file
12
app/src/main/res/drawable/thumb_anydesk.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="71.33dp"
|
||||
android:height="49.43dp"
|
||||
android:viewportWidth="71.33"
|
||||
android:viewportHeight="49.43">
|
||||
<path
|
||||
android:pathData="M60.38,24.71l-19.24,19.24l5.48,5.48l24.71,-24.72l-24.71,-24.71l-5.48,5.48z"
|
||||
android:fillColor="#e74f3d" />
|
||||
<path
|
||||
android:pathData="M24.71,49.42l-24.71,-24.71l24.71,-24.71l24.71,24.71z"
|
||||
android:fillColor="#e74f3d" />
|
||||
</vector>
|
69
app/src/main/res/drawable/thumb_autodesk.xml
Normal file
69
app/src/main/res/drawable/thumb_autodesk.xml
Normal file
|
@ -0,0 +1,69 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="174.42dp"
|
||||
android:height="166.08dp"
|
||||
android:viewportWidth="174.42"
|
||||
android:viewportHeight="166.08">
|
||||
<path android:pathData="m32.58,166.08c-4.72,0 -7.18,-1.78 -9.54,-5.92l-21.53,-39.92c-1.48,-2.86 -1.50,-3.81 -1.50,-5.87l33.84,1.49 7.74,7.74h67.89l-56.37,34.92c-2.74,1.62 -13.19,7.56 -20.53,7.56z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="109.14"
|
||||
android:endY="124.80"
|
||||
android:startX="14.14"
|
||||
android:startY="143.72"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF2B7A77"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF4EBAA9"
|
||||
android:offset="0.5126" />
|
||||
<item
|
||||
android:color="#FF5CC2B1"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m41.62,123.60h-29.27c-8.84,0 -12.34,-4.62 -12.34,-9.23 0,-2.92 0.93,-4.51 2.23,-7.75l42.66,-101.85 0.45,-0.89 0.59,-0.91 1.22,-1.19 1.80,-0.96 2.61,-0.57 4.49,0.11 29.64,11.02 -10.02,31.61z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="15.92"
|
||||
android:endY="123.72"
|
||||
android:startX="63.07"
|
||||
android:startY="13.01"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF236736"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF6BA443"
|
||||
android:offset="0.4997" />
|
||||
<item
|
||||
android:color="#FF86C146"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillType="evenOdd"
|
||||
android:pathData="m127.59,166.08 l-67.34,-159.43c-1.16,-2.71 -3.02,-6.21 -7.83,-6.21 -4.30,0 -6.35,2.08 -7.50,4.32 0.59,-1.61 2.40,-4.75 7.65,-4.75h46.48c4.28,0 6.33,2.52 7.27,4.83l68.10,161.24z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="150.57"
|
||||
android:endY="165.51"
|
||||
android:startX="81.28"
|
||||
android:startY="0.512"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF29A5E3"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF356EB9"
|
||||
android:offset="0.5104" />
|
||||
<item
|
||||
android:color="#FF394DA5"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</vector>
|
42
app/src/main/res/drawable/thumb_bestbuy.xml
Normal file
42
app/src/main/res/drawable/thumb_bestbuy.xml
Normal file
|
@ -0,0 +1,42 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="137.81dp"
|
||||
android:viewportWidth="200.00"
|
||||
android:viewportHeight="137.81">
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="M46.72,0l153.27,14.64l-11.60,123.17l-153.53,-14.38l-34.85,-40.77l4.70,-49.82z" />
|
||||
<path
|
||||
android:fillColor="#f6eb16"
|
||||
android:pathData="M47.71,2.79l149.48,14.35l-11.06,117.86l-149.99,-14.35l-33.60,-39.00l4.68,-47.55z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="M92.93,53.1l-0.35,3.69l15.62,1.49l-0.92,9.66l-34.17,-3.27l3.28,-36.12l33.93,3.24l-0.97,10.16l-15.28,-1.46l-0.31,3.27l13.94,1.33l-0.89,9.31z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="m115.38,56.00 l-6.41,9.46c0,0 8.06,4.33 19.24,5.30 11.16,0.99 19.36,-2.21 21.98,-7.56 2.63,-5.33 -0.51,-11.40 -5.69,-13.08 -5.18,-1.67 -14.16,-3.46 -13.22,-5.24 0.93,-1.77 6.57,-1.40 9.99,0.02 3.42,1.42 4.35,2.28 4.35,2.28l5.89,-8.42c0,0 -6.26,-4.58 -17.97,-5.27 -11.72,-0.69 -20.33,5.17 -20.93,10.62 -0.60,5.45 2.89,8.67 8.22,10.61 0,0 4.51,1.45 7.92,2.19 3.40,0.75 5.56,2.99 1.50,3.79 -4.06,0.79 -12.42,-2.20 -14.89,-4.72z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="m159.93,73.13 l2.08,-24.46 -9.98,-0.95 1.11,-11.76 38.46,3.67 -1.11,11.76 -9.99,-0.95 -2.33,24.43z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="m79.22,69.84 l17.65,1.59 -1.87,20.50c0,0 -1.74,4.91 4.13,5.48 5.88,0.55 5.62,-4.72 5.62,-4.72l1.93,-20.23 17.72,1.69 -2.27,23.85c0,0 -2.09,13.02 -23.76,10.95C76.7,106.89 76.99,93.19 76.99,93.19Z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="M139.62,96.71l-15.39,-22.49l20.50,1.87l5.06,9.97l6.53,-8.86l20.57,1.95l-19.19,19.01l-1.48,15.53l-18.05,-1.72z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="m67.83,86.56c0,0 7.43,-1.46 7.24,-9.05 -0.19,-7.6 -15.36,-9.48 -15.36,-9.48l-25.03,-2.48 -3.41,36.25c0,0 19.98,2.1 25.80,2.57 5.82,0.46 17.54,-0.03 18.70,-7.52 1.15,-7.50 -7.93,-10.27 -7.93,-10.27zM50.73,76.18c0,0 7.68,-0.71 7.26,2.89 -0.43,3.60 -7.73,1.97 -7.73,1.97zM49.13,94.67 L49.53,88.78c0,0 9.61,-0.35 9.30,3.76 -0.31,4.12 -9.7,2.12 -9.7,2.12z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="m64.17,45.02c0,0 7.43,-1.46 7.24,-9.05 -0.19,-7.59 -15.36,-9.49 -15.36,-9.49L31.00,24.00 27.6,60.26c0,0 19.98,2.1 25.79,2.56 5.82,0.47 17.54,-0.02 18.70,-7.52 1.15,-7.50 -7.92,-10.27 -7.92,-10.27zM47.23,34.74c0,0 7.69,-0.70 7.27,2.89 -0.43,3.60 -7.73,1.97 -7.73,1.97zM45.63,53.24 L46.03,47.34c0,0 9.60,-0.35 9.30,3.77 -0.31,4.12 -9.70,2.12 -9.70,2.12z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="m22.25,60.56c-0.35,3.74 -3.67,6.48 -7.40,6.13 -3.74,-0.35 -6.48,-3.68 -6.13,-7.42 0.36,-3.73 3.68,-6.47 7.42,-6.12 3.73,0.35 6.47,3.68 6.11,7.41z" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m19.77,60.33c-0.22,2.36 -2.32,4.09 -4.69,3.87 -2.36,-0.22 -4.09,-2.33 -3.87,-4.69 0.23,-2.36 2.33,-4.09 4.69,-3.87 2.36,0.22 4.09,2.32 3.87,4.69z" />
|
||||
<path
|
||||
android:fillColor="#010101"
|
||||
android:pathData="m177.03,82.72c0.15,-1.60 1.58,-2.78 3.18,-2.63 1.60,0.15 2.79,1.58 2.64,3.19 -0.15,1.60 -1.58,2.78 -3.19,2.63 -1.60,-0.16 -2.78,-1.58 -2.63,-3.19zM182.14,83.21c0.13,-1.36 -0.75,-2.44 -1.97,-2.55 -1.22,-0.12 -2.29,0.77 -2.42,2.13 -0.13,1.36 0.75,2.44 1.97,2.56 1.22,0.11 2.29,-0.77 2.42,-2.14zM178.98,81.23 L180.20,81.35c0.79,0.07 1.19,0.39 1.13,1.08 -0.05,0.56 -0.40,0.80 -0.95,0.80l0.75,1.52 -0.63,-0.05 -0.71,-1.50 -0.37,-0.03 -0.13,1.42 -0.61,-0.05zM179.46,82.70 L180.00,82.75c0.36,0.03 0.68,0.01 0.72,-0.43 0.04,-0.38 -0.30,-0.47 -0.62,-0.51l-0.55,-0.05z" />
|
||||
</vector>
|
57
app/src/main/res/drawable/thumb_boxcryptor.xml
Normal file
57
app/src/main/res/drawable/thumb_boxcryptor.xml
Normal file
|
@ -0,0 +1,57 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="150dp"
|
||||
android:height="150dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m179.02,143.60c-0.14,0 -0.88,0.67 -1.72,1.48 -4.77,4.87 -15.54,12.05 -24.35,16.21 -11.11,5.21 -22.23,8.08 -35.22,9.18l-6.54,0.57v14.25c0,12.58 0.09,14.30 0.78,14.59 1.13,0.43 14.02,-0.66 20.17,-1.72 23.95,-4.06 46.34,-14.59 63.66,-29.94 2.01,-1.77 3.88,-3.44 4.18,-3.68 0.29,-0.23 -3.59,-4.35 -10.08,-10.66 -5.80,-5.64 -10.67,-10.28 -10.87,-10.28z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m168.15,133.07c-0.19,0 -1.86,1.29 -3.69,2.91 -6.78,5.88 -17.75,12.10 -26.71,15.16 -7.08,2.39 -15.84,4.01 -24.35,4.54l-1.96,0.09 -0.14,5.93c-0.04,3.25 0.05,6.12 0.24,6.31 0.19,0.19 3.05,0.14 6.29,-0.09 15.98,-1.24 31.33,-6.31 44.52,-14.68 4.67,-2.96 13.77,-9.95 14.56,-11.19 0.19,-0.23 -1.62,-2.39 -4.03,-4.73 -2.41,-2.34 -4.52,-4.25 -4.72,-4.25z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m145.13,110.64c-0.14,0 -1.91,1.29 -3.93,2.87 -7.62,5.88 -16.28,9.18 -26.66,10.23l-3.34,0.33v14.30c0,12.43 0.09,14.35 0.73,14.63 0.44,0.14 3.05,-0 5.90,-0.28 17.17,-1.72 31.87,-7.84 44.71,-18.46l3.83,-3.25 -10.47,-10.18c-5.80,-5.64 -10.62,-10.23 -10.77,-10.18z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m76.30,110.59c-0.19,0 -2.36,2.00 -4.87,4.44l-4.52,4.40 2.36,1.96c4.03,3.39 8.21,6.17 12.25,8.22 7.42,3.73 18.89,6.79 25.53,6.79h2.65v-6.17,-6.17l-3.54,-0.33c-4.87,-0.47 -11.75,-2.20 -15.84,-4.01 -3.83,-1.67 -10.77,-6.07 -12.54,-7.89 -0.68,-0.67 -1.32,-1.24 -1.47,-1.24z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m133.07,98.73 l-3.19,2.34c-3.98,2.91 -9.10,5.02 -13.82,5.74 -2.01,0.28 -3.93,0.62 -4.23,0.71 -0.49,0.09 -0.63,1.91 -0.63,6.84 0,3.68 0.14,6.79 0.39,6.88 0.78,0.47 8.51,-0.71 12.39,-1.86 6.78,-2.00 15.05,-6.60 18.30,-10.09 0.83,-0.86 0.64,-1.1 -4.18,-5.74z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m88.25,98.63 l-5.11,5.07 -5.16,5.02 1.72,1.43c7.28,6.12 18.15,10.52 27.05,11.05l2.70,0.14 0.14,-6.98 0.14,-6.98 -3.24,-0.33c-3.98,-0.38 -9.44,-2.24 -13.03,-4.44 -1.47,-0.95 -3.24,-2.20 -3.93,-2.82z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m159.88,76.63v2.24c0,3.34 -1.62,10.33 -3.39,14.73 -1.42,3.58 -5.65,10.38 -8.70,14.01l-1.37,1.57 10.62,10.33 10.57,10.28 3.44,-3.97c4.87,-5.64 7.67,-9.85 10.97,-16.45 4.57,-9.18 7.13,-18.27 7.72,-27.64l0.29,-5.11h-15.05z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m143.21,76.63 l-0.29,2.24c-0.88,6.26 -3.34,12.15 -6.83,16.40l-1.77,2.15 5.01,4.87 5.01,4.92 1.18,-1.1c2.21,-2.00 6.88,-9.32 8.46,-13.29 1.72,-4.30 3.44,-11.52 3.44,-14.44V76.63h-7.08z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m68.26,76.24c-2.53,0.02 -4.39,0.14 -4.50,0.28 -0.49,0.81 0.78,8.89 2.01,12.77 1.91,5.93 5.26,11.81 9.34,16.40l1.37,1.57 5.06,-4.97 5.11,-4.97 -1.77,-2.29C81.02,90.12 79.01,85.33 78.32,79.64L77.97,76.39 70.99,76.25c-0.95,-0.01 -1.88,-0.01 -2.72,-0.00z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m144.39,44.10 l-5.11,4.97 -5.06,4.97 1.96,2.44c3.54,4.30 5.75,9.80 6.74,16.40l0.29,1.81h7.18,7.18l-0.34,-3.39c-0.73,-7.17 -3.69,-15.11 -7.92,-21.14 -0.93,-1.38 -2.46,-3.30 -3.34,-4.30z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m76.89,44.05 l-1.82,1.96C69.02,52.57 64.39,63.23 63.85,71.84l-0.14,2.63 7.03,0.14c5.36,0.09 7.03,-0 7.18,-0.47 0.09,-0.33 0.49,-2.44 0.93,-4.68 0.88,-4.54 3.19,-9.42 6.19,-13.20l1.91,-2.48 -5.01,-4.83z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m109.70,30.23 l-2.06,0.04c-8.80,0.19 -20.71,4.83 -27.45,10.76l-2.01,1.76 5.01,4.92 5.06,4.92 1.72,-1.33c4.92,-3.73 9.79,-5.78 15.93,-6.74l3.78,-0.62v-6.84z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m111.67,30.08v6.98,6.98l2.36,0.28c5.95,0.76 11.95,3.10 16.18,6.36l2.46,1.91 5.11,-4.97c3.09,-3.01 4.92,-5.11 4.62,-5.35 -5.26,-4.64 -13.48,-8.99 -20.17,-10.62 -2.11,-0.52 -5.41,-1.1 -7.23,-1.29z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m167.31,22.1c-0.14,0 -5.01,4.59 -10.77,10.18l-10.47,10.18 1.27,1.14c2.06,1.86 6.1,7.89 8.11,12.10 2.31,4.78 3.88,10.38 4.28,15.26l0.29,3.73h15.00,15.00l-0.29,-4.68C188.71,53.52 181.19,36.25 169.77,24.34c-1.18,-1.24 -2.31,-2.24 -2.46,-2.24z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m111.67,14.82v6.50,6.50h2.36c8.26,0.04 19.77,4.44 27.74,10.71l3.00,2.29 4.52,-4.40 4.57,-4.44 -2.75,-2.34c-7.77,-6.60 -18.74,-11.76 -28.87,-13.53 -2.16,-0.38 -5.41,-0.81 -7.23,-1.00z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="m42.75,11.09c-0.54,0 -5.95,6.12 -9.15,10.38C22.92,35.54 16.28,53.81 15.64,71.13l-0.14,3.34 22.68,0.14 22.72,0.09 0.29,-3.20c0.98,-9.61 4.92,-18.89 11.21,-26.45L74.92,42.09 58.98,26.59C50.23,18.08 42.9,11.09 42.75,11.09Z" />
|
||||
<path
|
||||
android:fillColor="#008e5a"
|
||||
android:pathData="M31.63,0 L26.81,5.45C18.25,15.11 11.06,26.88 6.64,38.60 2.90,48.40 0,62.61 0,71.17v3.53h6.34,6.29l0.39,-4.92c1.42,-20.47 9.69,-40.46 22.77,-55.10 1.82,-2.05 3.69,-4.21 4.13,-4.78 0.83,-1.00 0.73,-1.1 -3.73,-5.45z" />
|
||||
</vector>
|
18
app/src/main/res/drawable/thumb_braverewards.xml
Normal file
18
app/src/main/res/drawable/thumb_braverewards.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="170.43dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="170.43"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:fillColor="#f1471f"
|
||||
android:pathData="m170.43,64.64 l-6.19,-16.71 4.26,-9.58c0.53,-1.26 0.26,-2.66 -0.66,-3.66l-11.65,-11.78c-5.12,-5.12 -12.71,-6.92 -19.57,-4.52l-3.26,1.13 -17.84,-19.30 -30.15,-0.19l-0.2,-0L54.79,0.26 37.01,19.70 33.82,18.57c-6.92,-2.46 -14.58,-0.66 -19.70,4.59L2.26,35.15C1.46,35.95 1.26,37.08 1.66,38.08L6.12,48.07 -0,64.78 3.99,79.89 22.10,148.66c2.06,7.92 6.85,14.84 13.58,19.64 0,-0 21.97,15.51 43.60,29.56C81.22,199.13 83.22,200 85.35,200c2.13,-0 4.12,-0.86 6.05,-2.13 24.36,-15.97 43.60,-29.62 43.60,-29.62 6.65,-4.79 11.45,-11.71 13.51,-19.64l17.97,-68.77 3.92,-15.18" />
|
||||
<path
|
||||
android:fillColor="#f25934"
|
||||
android:pathData="m23.04,22.42c-3.39,0.00 -7.41,1.22 -9.85,3.40L2.06,37.15 6.72,49.53 -0,66.24 22.96,151.59c1.46,5.26 4.72,9.85 8.98,13.91L71.57,192.07C78.71,196.67 82.4,199.68 84.31,199.68c2.38,-0 2.02,-4.67 2.17,-16.79l-1.46,-151.59 -17.64,7.32 -22.63,-5.26 -17.37,-9.98c-1.10,-0.64 -2.63,-0.94 -4.32,-0.94" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m89.21,123.03c-0.79,-0.33 -1.66,-0.59 -1.93,-0.59l-1.06,-0 -1.06,-0c-0.26,-0 -1.13,0.26 -1.93,0.59l-8.65,3.59c-0.79,0.33 -2.13,0.93 -2.92,1.33l-13.04,6.79c-0.79,0.39 -0.86,1.13 -0.13,1.66l11.51,8.12c0.73,0.53 1.86,1.39 2.53,1.99l5.12,4.39c0.66,0.59 1.73,1.53 2.39,2.13l4.92,4.39c0.66,0.59 1.73,0.59 2.39,-0l5.05,-4.39c0.66,-0.6 1.73,-1.53 2.39,-2.13l5.12,-4.46c0.66,-0.59 1.79,-1.46 2.53,-1.99l11.51,-8.18c0.73,-0.53 0.66,-1.26 -0.13,-1.66l-13.04,-6.65c-0.79,-0.39 -2.13,-0.99 -2.92,-1.33l-8.65,-3.59" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m151.67,67.61c0.26,-0.86 0.26,-1.19 0.26,-1.19 0,-0.86 -0.06,-2.33 -0.2,-3.19l-0.66,-1.93c-0.4,-0.79 -1.06,-2.06 -1.59,-2.79l-7.52,-11.11c-0.46,-0.73 -1.33,-1.86 -1.93,-2.59L130.30,32.59c-0.53,-0.66 -1.06,-1.26 -1.13,-1.19l-0.13,-0c0,-0 -0.73,0.13 -1.59,0.26l-14.84,2.92c-0.86,0.2 -2.26,0.46 -3.12,0.59l-0.26,0.06c-0.86,0.13 -2.26,0.06 -3.12,-0.19l-12.45,-3.99c-0.86,-0.26 -2.26,-0.66 -3.06,-0.86 0,-0 -2.53,-0.59 -4.59,-0.53 -2.06,-0 -4.59,0.53 -4.59,0.53 -0.86,0.19 -2.26,0.59 -3.06,0.86l-12.45,3.99c-0.86,0.26 -2.26,0.33 -3.12,0.19l-0.26,-0.06c-0.86,-0.13 -2.26,-0.46 -3.12,-0.59l-14.98,-2.79c-0.86,-0.2 -1.59,-0.26 -1.59,-0.26l-0.13,-0c-0.06,-0 -0.59,0.53 -1.13,1.19L31.76,44.91c-0.53,0.66 -1.39,1.86 -1.93,2.59L22.31,58.62c-0.46,0.73 -1.19,1.99 -1.59,2.79l-0.66,1.93c-0.13,0.86 -0.26,2.33 -0.2,3.19 0,-0 0,0.26 0.26,1.19 0.46,1.59 1.59,3.06 1.59,3.06 0.53,0.66 1.53,1.79 2.13,2.39l22.03,23.43c0.59,0.66 0.79,1.86 0.46,2.66l-4.59,10.85c-0.33,0.79 -0.39,2.13 -0.06,2.99l1.26,3.39c1.06,2.86 2.86,5.39 5.26,7.32l4.46,3.59c0.66,0.53 1.86,0.73 2.66,0.33l14.11,-6.72c0.79,-0.4 1.99,-1.19 2.66,-1.79l10.11,-9.12c1.46,-1.33 1.53,-3.59 0.2,-5.06l-21.23,-14.31c-0.73,-0.46 -0.99,-1.53 -0.59,-2.33l9.32,-17.57c0.39,-0.79 0.46,-2.06 0.13,-2.86l-1.13,-2.59c-0.33,-0.79 -1.33,-1.73 -2.13,-2.06l-27.36,-10.25c-0.79,-0.33 -0.79,-0.66 0.06,-0.73l17.64,-1.66c0.86,-0.06 2.26,0.06 3.12,0.26l15.71,4.39c0.86,0.26 1.39,1.13 1.26,1.99l-5.46,29.89c-0.13,0.86 -0.13,2.06 0.06,2.72 0.19,0.66 1.06,1.26 1.93,1.46l10.91,2.33c0.86,0.2 2.26,0.2 3.12,-0l10.18,-2.33c0.86,-0.2 1.73,-0.86 1.93,-1.46 0.19,-0.59 0.26,-1.86 0.06,-2.72l-5.39,-29.89c-0.13,-0.86 0.39,-1.79 1.26,-1.99l15.71,-4.39c0.86,-0.26 2.26,-0.33 3.12,-0.26l17.64,1.66c0.86,0.06 0.93,0.39 0.06,0.73l-27.36,10.38c-0.79,0.33 -1.79,1.19 -2.13,2.06l-1.13,2.59c-0.33,0.79 -0.33,2.13 0.13,2.86l9.38,17.57c0.39,0.79 0.13,1.79 -0.59,2.33l-21.23,14.38c-1.39,1.39 -1.26,3.72 0.19,5.06l10.12,9.12c0.66,0.59 1.86,1.39 2.66,1.73l14.18,6.72c0.79,0.4 1.99,0.20 2.66,-0.33l4.46,-3.66c2.39,-1.93 4.19,-4.46 5.19,-7.32l1.26,-3.39c0.33,-0.79 0.26,-2.19 -0.06,-2.99l-4.59,-10.85c-0.33,-0.79 -0.13,-1.99 0.46,-2.66l22.03,-23.43c0.59,-0.66 1.53,-1.73 2.13,-2.39 -0.13,-0.2 1.06,-1.66 1.46,-3.26" />
|
||||
</vector>
|
30
app/src/main/res/drawable/thumb_citrix.xml
Normal file
30
app/src/main/res/drawable/thumb_citrix.xml
Normal file
|
@ -0,0 +1,30 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="112.50dp"
|
||||
android:height="38.21dp"
|
||||
android:viewportWidth="150.00"
|
||||
android:viewportHeight="50.95">
|
||||
<path
|
||||
android:fillColor="#0f0c0c"
|
||||
android:pathData="M0,31.45C0,19.95 7.71,11.95 18.70,11.95c7.41,0 13.46,3.71 15.86,9.46 0.29,0.58 0.36,1.08 0.36,1.67 0,1.31 -1.02,2.18 -2.32,2.18 -1.02,0 -1.89,-0.58 -2.32,-1.74 -1.88,-4.65 -6.18,-7.34 -11.56,-7.34 -8.22,0 -13.97,6.25 -13.97,15.28 0,8.95 5.67,15.20 13.97,15.20 5.38,0 9.45,-2.61 11.64,-8.07 0.43,-1.09 1.16,-1.74 2.25,-1.74 1.30,0 2.32,1.01 2.32,2.32 0,0.51 -0.07,0.87 -0.29,1.52C32.30,46.94 26.34,50.95 18.70,50.95 7.63,50.95 0,42.94 0,31.45" />
|
||||
<path
|
||||
android:fillColor="#0f0c0c"
|
||||
android:pathData="m62.41,47.75c0,1.59 -0.87,2.61 -2.4,2.61 -1.52,0 -2.32,-1.02 -2.32,-2.61V2.62C57.68,0.94 58.55,0 60.08,0c1.52,0 2.32,0.94 2.32,2.62v10.27h8.14c1.45,0 2.32,0.8 2.32,2.10 0,1.31 -0.87,2.11 -2.32,2.11h-8.14l-0.00,30.63" />
|
||||
<path
|
||||
android:fillColor="#0f0c0c"
|
||||
android:pathData="m98.85,15.44c0,1.30 -0.94,2.25 -2.32,2.25 -0.51,0 -1.02,-0.14 -1.74,-0.50 -1.08,-0.51 -2.25,-0.80 -3.78,-0.80 -5.02,0 -8.29,4.36 -8.29,9.89v21.46c0,1.67 -0.8,2.61 -2.32,2.61 -1.52,0 -2.40,-0.94 -2.40,-2.61V15.15c0,-1.67 0.87,-2.62 2.40,-2.62 1.52,0 2.32,0.94 2.32,2.62v0.94c2.03,-2.69 5.23,-4.14 8.80,-4.14 2.76,0 4.72,0.58 6.11,1.45 0.8,0.50 1.23,1.16 1.23,2.03" />
|
||||
<path
|
||||
android:fillColor="#0f0c0c"
|
||||
android:pathData="m103.65,15.15c0,-1.67 0.86,-2.62 2.39,-2.62 1.52,0 2.32,0.94 2.32,2.62v32.59c0,1.59 -0.87,2.61 -2.4,2.61 -1.52,0 -2.32,-1.02 -2.32,-2.61V15.15" />
|
||||
<path
|
||||
android:fillColor="#0f0c0c"
|
||||
android:pathData="m43.23,15.15c0,-1.67 0.87,-2.62 2.4,-2.62 1.52,0 2.32,0.94 2.32,2.62v32.59c0,1.59 -0.87,2.61 -2.39,2.61 -1.52,0 -2.32,-1.02 -2.32,-2.61V15.15" />
|
||||
<path
|
||||
android:fillColor="#0f0c0c"
|
||||
android:pathData="m49.31,3.71c0,2.05 -1.66,3.71 -3.71,3.71 -2.05,0 -3.71,-1.66 -3.71,-3.71C41.88,1.66 43.54,0 45.59,0c2.05,0 3.71,1.66 3.71,3.71" />
|
||||
<path
|
||||
android:fillColor="#0f0c0c"
|
||||
android:pathData="m132.97,34.36 l-12.88,15.06c-0.50,0.65 -1.16,0.94 -1.89,0.94 -1.30,0 -2.25,-1.02 -2.25,-2.18 0,-0.50 0.14,-1.09 0.65,-1.67L130.06,31.30 117.11,16.46c-0.51,-0.58 -0.80,-1.09 -0.80,-1.74 0,-1.16 0.94,-2.18 2.32,-2.18 0.72,0 1.23,0.29 1.81,0.94l12.51,14.69 12.51,-14.69c0.58,-0.65 1.09,-0.94 1.82,-0.94 1.38,0 2.32,1.02 2.32,2.18 0,0.65 -0.29,1.16 -0.8,1.74l-12.95,14.84 13.46,15.20c0.51,0.58 0.65,1.16 0.65,1.67 0,1.16 -0.94,2.18 -2.25,2.18 -0.73,0 -1.38,-0.29 -1.89,-0.94L132.97,34.36" />
|
||||
<path
|
||||
android:fillColor="#0f0c0c"
|
||||
android:pathData="m136.69,3.71c0,2.05 -1.66,3.71 -3.71,3.71 -2.05,0 -3.71,-1.66 -3.71,-3.71C129.25,1.66 130.92,0 132.97,0c2.05,0 3.71,1.66 3.71,3.71" />
|
||||
</vector>
|
33
app/src/main/res/drawable/thumb_codeberg.xml
Normal file
33
app/src/main/res/drawable/thumb_codeberg.xml
Normal file
|
@ -0,0 +1,33 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="47.10dp"
|
||||
android:height="45.62dp"
|
||||
android:viewportWidth="47.10"
|
||||
android:viewportHeight="45.62">
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="M26.32,35.16L24.75,36.05L24.75,43.23L26.02,43.23L26.15,42.67C26.53,43.15 27.07,43.38 27.77,43.38C28.48,43.38 29.08,43.17 29.56,42.75C30.18,42.19 30.49,41.37 30.49,40.28C30.49,39.44 30.28,38.76 29.86,38.25C29.39,37.68 28.73,37.39 27.89,37.39C27.58,37.39 27.31,37.45 27.06,37.57C26.74,37.72 26.50,37.93 26.32,38.19L26.32,35.16zM27.58,38.54C27.97,38.54 28.27,38.71 28.49,39.04C28.70,39.38 28.81,39.83 28.81,40.41C28.81,40.99 28.69,41.45 28.46,41.78C28.23,42.12 27.91,42.28 27.51,42.28C27.20,42.28 26.93,42.18 26.70,41.97C26.47,41.76 26.34,41.50 26.32,41.19L26.32,39.83C26.32,39.47 26.44,39.17 26.68,38.92C26.93,38.67 27.23,38.54 27.58,38.54z" />
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="M44.06,37.40C43.40,37.40 42.83,37.63 42.34,38.07C41.71,38.66 41.39,39.50 41.39,40.59C41.39,41.36 41.59,41.99 41.98,42.5C42.44,43.09 43.08,43.38 43.92,43.38C44.60,43.38 45.13,43.10 45.51,42.55C45.51,43.80 45.06,44.42 44.16,44.42C43.52,44.42 42.95,44.25 42.44,43.92L42.04,44.72C42.70,45.32 43.48,45.62 44.38,45.62C45.25,45.62 45.92,45.37 46.38,44.86C46.86,44.34 47.10,43.60 47.10,42.65L47.10,37.55L45.88,37.55L45.76,38.17C45.76,38.08 45.64,37.96 45.40,37.79C45.03,37.53 44.58,37.40 44.06,37.40zM44.40,38.53C44.66,38.53 44.90,38.63 45.12,38.82C45.35,39.00 45.48,39.22 45.51,39.48L45.51,40.92C45.51,41.28 45.38,41.59 45.13,41.86C44.88,42.12 44.59,42.25 44.25,42.25C43.43,42.25 43.02,41.62 43.02,40.38C43.02,39.81 43.14,39.36 43.39,39.03C43.64,38.70 43.98,38.53 44.40,38.53z" />
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="M17.84,35.19L16.26,36.07L16.26,37.88C15.87,37.56 15.38,37.40 14.81,37.40C14.14,37.40 13.57,37.63 13.10,38.07C12.46,38.66 12.15,39.50 12.15,40.59C12.15,41.37 12.34,42.00 12.73,42.5C13.20,43.09 13.88,43.38 14.77,43.38C15.09,43.38 15.40,43.31 15.70,43.17C16.00,43.03 16.21,42.85 16.35,42.63L16.58,43.23L17.84,43.23L17.84,35.19zM15.15,38.53C15.42,38.53 15.66,38.62 15.86,38.81C16.07,38.98 16.20,39.20 16.26,39.48L16.26,41.07C16.22,41.38 16.07,41.65 15.81,41.90C15.55,42.13 15.27,42.25 14.97,42.25C14.16,42.25 13.76,41.62 13.76,40.38C13.76,39.81 13.89,39.36 14.14,39.03C14.39,38.70 14.72,38.53 15.15,38.53z" />
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="M8.96,37.40C8.14,37.40 7.48,37.66 6.97,38.18C6.41,38.75 6.13,39.49 6.13,40.41C6.13,41.21 6.39,41.90 6.89,42.46C7.44,43.08 8.14,43.38 8.96,43.38C9.67,43.38 10.29,43.14 10.83,42.66C11.47,42.08 11.79,41.33 11.79,40.41C11.79,39.61 11.57,38.94 11.14,38.39C10.62,37.73 9.90,37.40 8.96,37.40zM8.96,38.53C9.77,38.53 10.18,39.15 10.18,40.41C10.18,41.61 9.77,42.21 8.96,42.21C8.15,42.21 7.75,41.61 7.75,40.41C7.75,39.15 8.15,38.53 8.96,38.53z" />
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="M33.88,37.40C33.07,37.40 32.40,37.67 31.88,38.20C31.29,38.79 31.00,39.53 31.00,40.42C31.00,41.33 31.26,42.04 31.78,42.56C32.32,43.11 33.07,43.38 34.04,43.38C34.94,43.38 35.69,43.12 36.29,42.58L35.89,41.75C35.30,42.08 34.73,42.25 34.19,42.25C33.81,42.25 33.47,42.12 33.19,41.87C32.91,41.61 32.76,41.29 32.73,40.91L36.63,40.91L36.63,40.33C36.63,39.51 36.42,38.83 35.98,38.32C35.48,37.71 34.78,37.40 33.88,37.40zM33.87,38.52C34.62,38.52 35.01,38.93 35.06,39.74L32.64,39.74C32.73,38.93 33.14,38.52 33.87,38.52z" />
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="M21.37,37.40C20.56,37.40 19.89,37.67 19.36,38.20C18.78,38.79 18.49,39.53 18.49,40.42C18.49,41.33 18.75,42.04 19.26,42.56C19.81,43.11 20.56,43.38 21.53,43.38C22.43,43.38 23.18,43.12 23.78,42.58L23.38,41.75C22.79,42.08 22.22,42.25 21.68,42.25C21.29,42.25 20.96,42.12 20.68,41.87C20.40,41.61 20.25,41.29 20.22,40.91L24.12,40.91L24.12,40.33C24.12,39.51 23.90,38.83 23.47,38.32C22.97,37.71 22.27,37.40 21.37,37.40zM21.35,38.52C22.10,38.52 22.50,38.93 22.54,39.74L20.13,39.74C20.22,38.93 20.63,38.52 21.35,38.52z" />
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="m39.99,37.40c-0.25,0 -0.49,0.06 -0.73,0.20 -0.23,0.12 -0.39,0.27 -0.47,0.45l-0.15,-0.50h-1.33v5.67h1.55v-4.07c0.13,-0.29 0.34,-0.43 0.62,-0.43 0.30,0 0.60,0.15 0.87,0.47l1.32,-0.72c-0.36,-0.70 -0.92,-1.06 -1.67,-1.06z" />
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="m3.65,35.16c-1.14,0 -2.03,0.38 -2.67,1.15 -0.65,0.76 -0.97,1.78 -0.97,3.03 0,0.96 0.23,1.81 0.71,2.52 0.65,1.00 1.65,1.50 3.00,1.50 0.93,0 1.74,-0.34 2.43,-1.03L5.51,41.36c-0.61,0.39 -1.15,0.58 -1.60,0.58 -0.68,0 -1.23,-0.26 -1.63,-0.78 -0.38,-0.50 -0.57,-1.10 -0.57,-1.80 0,-0.79 0.16,-1.43 0.48,-1.92 0.37,-0.57 0.90,-0.86 1.58,-0.86 0.49,0 1.03,0.21 1.63,0.65l0.63,-1.03C5.25,35.50 4.45,35.16 3.65,35.16Z" />
|
||||
<path
|
||||
android:fillColor="#2185d0"
|
||||
android:pathData="M24.27,0A16.12,16.12 0,0 0,8.21 16.12,16.12 16.12,0 0,0 10.67,24.68L24.12,7.30a0.25,0.18 0,0 1,0.43 0L38,24.68A16.12,16.12 0,0 0,40.46 16.12,16.12 16.12,0 0,0 24.33,0a16.12,16.12 0,0 0,-0.06 0z" />
|
||||
</vector>
|
12
app/src/main/res/drawable/thumb_crowd_supply.xml
Normal file
12
app/src/main/res/drawable/thumb_crowd_supply.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="124dp"
|
||||
android:height="120.6dp"
|
||||
android:viewportWidth="124"
|
||||
android:viewportHeight="120.6">
|
||||
<path
|
||||
android:fillColor="#00b2ad"
|
||||
android:pathData="M63.7,0L63.7,120.6L124,60.3ZM82.7,81.3c-6.6,0 -11.8,-3.6 -14,-12l8,-1.7c0.9,5.1 3.9,7 6.3,7 2.8,0 5,-1.9 5,-5.1 0,-8 -18.2,-8.2 -18.2,-20.1 0,-7.3 4.4,-12 12.8,-12 7.3,0 11.7,4.3 13.1,10.4l-7.3,2.1c-1.4,-4 -3.1,-5.7 -6,-5.7 -2.9,0 -4.5,1.8 -4.5,4.7 0,6.4 18.2,6.9 18.2,20.3 0.2,7.2 -4.9,12.1 -13.4,12.1z" />
|
||||
<path
|
||||
android:fillColor="#4e4e56"
|
||||
android:pathData="m0,60.3 l60.3,60.3L60.3,0ZM52.7,54.2h-8.2v-3.6c0,-4.7 -2.1,-6 -5.3,-6 -3.2,0 -5.3,1.3 -5.3,6L33.9,68c0,4.7 2.1,6 5.3,6 3.2,0 5.3,-1.3 5.3,-6v-3.8h8.2v2.7c0,10.5 -5.6,14.3 -13.5,14.3 -7.9,0 -13.5,-3.8 -13.5,-14.3L25.7,51.7c0,-10.5 5.6,-14.3 13.5,-14.3 7.9,0 13.5,3.8 13.5,14.3z" />
|
||||
</vector>
|
|
@ -1,9 +1,24 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:viewportWidth="128"
|
||||
android:viewportHeight="128"
|
||||
android:width="128dp"
|
||||
android:height="128dp">
|
||||
<path
|
||||
android:pathData="M84.29 53.81A10.62 10.62 0 0 1 80 45.23a21.44 21.44 0 0 1 1 -4.46c0.19 -0.66 0.23 -1 1 -1.14 3.65 -0.75 5.25 -0.63 5.56 -1.07a13.17 13.17 0 0 0 1.38 -3.85l-28.2 -9s1.78 4.58 2.71 5l12.82 5.7S69.6 37.83 66 38.93l-0.86 0.27a12.17 12.17 0 0 0 3.56 3.67c2.38 -0.69 6.76 -1.81 6.76 -1.81A36.94 36.94 0 0 1 42.69 61.18c-0.63 0 -3.27 0 -4.92 0.1 -1.44 0.13 -2.13 1.31 -0.72 1.94a10.69 10.69 0 0 1 5.17 6.27c0.51 1.65 -0.39 2.64 -1.52 3.54 -2.49 1.92 -8.83 6.66 -15.07 11.3 -0.73 -1.38 -1.41 -2.78 -2 -4.18 -5.62 -12.71 -8.35 -30.36 -8.35 -54V26L63.93 10.34 112.62 26v0.22a231.3 231.3 0 0 1 -1.11 23.55l-0.07 0.62h8l0 -0.51a236.47 236.47 0 0 0 1.09 -23.66v-6L63.93 2 7.3 20.18v6c0 24.74 3 43.44 9 57.19 0.86 1.94 1.82 3.87 2.86 5.76l-8.75 6.49c1.13 2 2.42 3.87 2.42 3.87L44 77.24A101.06 101.06 0 0 1 100.63 60h9.45a88 88 0 0 1 -5.82 20.16A68.1 68.1 0 0 1 92.93 97.79 72.62 72.62 0 0 1 80 109.27a67.73 67.73 0 0 1 -16 8.4l-0.06 0 -0.15 0a68.06 68.06 0 0 1 -15.93 -8.38A73.34 73.34 0 0 1 34.92 97.78c-1.19 -1.35 -2.38 -2.82 -3.63 -4.51L31 92.83 24.5 97.46l0.34 0.46c1.42 1.91 2.77 3.59 4.13 5.12A81.27 81.27 0 0 0 43.3 115.78a74.81 74.81 0 0 0 18 9.39c0.06 0 1.47 0.51 2.18 0.71l0.37 0.09 0.12 0 0.12 0 0.38 -0.09c0.7 -0.2 2.11 -0.69 2.17 -0.71a74.65 74.65 0 0 0 17.93 -9.38 81 81 0 0 0 14.35 -12.73 76.17 76.17 0 0 0 12.65 -19.69A96.83 96.83 0 0 0 118.14 60h6.77l0.72 -4.53h-25C90 55.26 86.88 55.66 84.29 53.81Z"
|
||||
android:fillColor="#007C97" />
|
||||
</vector>
|
||||
android:width="91.03dp"
|
||||
android:height="122.87dp"
|
||||
android:viewportWidth="91.03"
|
||||
android:viewportHeight="122.87">
|
||||
<path
|
||||
android:pathData="m19.21,8.26c0,-0.77 -0.76,-1.53 -1.83,-1.83l-12.81,-4.73C2.44,0.79 0,1.86 0,3.38V114.70c0,0.76 0.76,1.67 1.53,1.98l13.11,4.72c1.98,0.76 4.57,-0.3 4.57,-1.98z"
|
||||
android:fillColor="#0e353d"/>
|
||||
<path
|
||||
android:pathData="m43.15,6.88c0,-0.76 -0.76,-1.52 -1.83,-1.82L28.51,0.33c-2.14,-0.91 -4.57,0.16 -4.57,1.68v34.77c0,0.76 0.76,1.67 1.52,1.98l13.11,4.72c1.99,0.76 4.58,-0.3 4.58,-1.98z"
|
||||
android:fillColor="#0e353d"/>
|
||||
<path
|
||||
android:pathData="m43.15,86.03c0,-0.76 -0.76,-1.53 -1.83,-1.83l-12.81,-4.73c-2.14,-0.91 -4.57,0.16 -4.57,1.68v34.77c0,0.76 0.76,1.68 1.52,1.98l13.11,4.72c1.99,0.77 4.58,-0.3 4.58,-1.98z"
|
||||
android:fillColor="#0e353d"/>
|
||||
<path
|
||||
android:pathData="m67.09,79.47c0,-0.76 -0.76,-1.52 -1.83,-1.83l-12.81,-4.72c-2.13,-0.91 -4.57,0.15 -4.57,1.68v32.62c0,0.77 0.76,1.68 1.52,1.98l13.11,4.73c1.99,0.76 4.58,-0.31 4.58,-1.99z"
|
||||
android:fillColor="#0e353d"/>
|
||||
<path
|
||||
android:pathData="m67.09,20.76c0,-0.76 -0.76,-1.52 -1.83,-1.83l-12.81,-4.72c-2.13,-0.92 -4.57,0.15 -4.57,1.68v32.62c0,0.76 0.76,1.68 1.52,1.99l13.11,4.72c1.99,0.76 4.58,-0.3 4.58,-1.98z"
|
||||
android:fillColor="#0e353d"/>
|
||||
<path
|
||||
android:pathData="m91.03,39.52c0,-0.76 -0.76,-1.53 -1.83,-1.83l-12.81,-4.72c-2.13,-0.92 -4.57,0.15 -4.57,1.68v53.66c0,0.77 0.76,1.68 1.52,1.98l13.12,4.73c1.98,0.76 4.57,-0.31 4.57,-1.99z"
|
||||
android:fillColor="#0e353d"/>
|
||||
</vector>
|
||||
|
|
9
app/src/main/res/drawable/thumb_deribit.xml
Normal file
9
app/src/main/res/drawable/thumb_deribit.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="172.40dp"
|
||||
android:height="167dp"
|
||||
android:viewportWidth="172.40"
|
||||
android:viewportHeight="167">
|
||||
<path
|
||||
android:fillColor="#15C8B1"
|
||||
android:pathData="m116.6,27.8h-4.9V0H83.8V27.8H55.9V0H27.9V27.8H0V55.6H27.9V111.3H0V139.1H27.9v27.9H55.8V139.2h27.9v27.8H111.6V139.2h4.9c30.8,0 55.9,-24.9 55.9,-55.7 0.1,-30.7 -24.9,-55.7 -55.8,-55.7m0,83.6H55.9V55.7h60.8c15.4,0 27.9,12.5 27.9,27.8 0,15.4 -12.6,27.9 -28,27.9" />
|
||||
</vector>
|
9
app/src/main/res/drawable/thumb_fidelity_investments.xml
Normal file
9
app/src/main/res/drawable/thumb_fidelity_investments.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="57.23dp"
|
||||
android:height="54.91dp"
|
||||
android:viewportWidth="76.31"
|
||||
android:viewportHeight="73.21">
|
||||
<path
|
||||
android:fillColor="#1e1c1c"
|
||||
android:pathData="M32.65,45.20H46.35l4.00,2.59H32.04L23.82,73.21C14.74,69.69 6.33,61.53 2.80,52.36 -0.94,43.47 -0.94,32.30 2.89,23.38 6.49,14.20 15.14,5.92 24.34,2.51c7.24,-2.99 16.93,-3.31 24.62,-0.95 8.81,2.52 17.14,8.84 21.98,17.09 5.41,9.04 6.92,20.53 3.64,30.86 -2.07,6.85 -6.36,13.41 -12.25,18.10L52.21,50.75 66.30,58.61c0.08,0 0.12,-0.08 0.08,-0.16L47.93,42.51 71.79,46.15c0.08,0 0.11,-0.03 0.11,-0.07L71.75,45.95 49.25,38.06 72.63,32.42c0.08,0 0.08,-0.07 0.03,-0.11l-23.98,1.56 18.78,-14.21c0.03,-0.07 -0.12,-0.11 -0.16,-0.03L46.21,30.31 57.85,9.76c0,-0.03 0,-0.12 -0.07,-0.07L42.56,27.54 45.48,4.08c0,-0.04 -0.08,-0.08 -0.16,-0.04l-7,22.78 -6.12,-23.46c-0.03,-0.03 -0.12,-0.08 -0.16,0L33.72,27.69 19.27,8.88c-0.05,-0.04 -0.08,0 -0.12,0.03L30.07,29.74 9.41,18.45c-0.03,0 -0.11,0.04 -0.11,0.07L27.67,33.61 4.21,31.14c-0.08,0.04 -0.08,0.11 0,0.15L26.95,37.95 4.33,44.59c-0.04,0.03 -0.04,0.11 0,0.15L27.67,42.03 9.33,57.60c-0.03,0 -0.07,0.07 0,0.12l0.24,-0.08 14.68,-7.68 3.44,-5.48h3.91l-2.71,-1.92 9.08,-14.57 -5.36,17.21 0.01,0.00" />
|
||||
</vector>
|
14
app/src/main/res/drawable/thumb_goatcounter.xml
Normal file
14
app/src/main/res/drawable/thumb_goatcounter.xml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="193.85dp"
|
||||
android:height="199.90dp"
|
||||
android:viewportWidth="193.85"
|
||||
android:viewportHeight="199.90">
|
||||
<path
|
||||
android:pathData="M11.57,109.62 L66.88,46.48c0,0 -58.21,-26.60 -56.47,-27.52 85.13,-44.98 173.05,99.89 173.05,99.89l-11.59,30.57c0,0 -79.32,-0.23 -89.83,-35.34"
|
||||
android:strokeWidth="20.76"
|
||||
android:strokeColor="#9a15a4" />
|
||||
<path
|
||||
android:pathData="M83.31,189.52C83.29,172.59 101.23,134.80 101.23,134.80"
|
||||
android:strokeWidth="20.76"
|
||||
android:strokeColor="#9a15a4" />
|
||||
</vector>
|
18
app/src/main/res/drawable/thumb_hosting_de.xml
Normal file
18
app/src/main/res/drawable/thumb_hosting_de.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="124.31dp"
|
||||
android:height="150dp"
|
||||
android:viewportWidth="124.31"
|
||||
android:viewportHeight="150">
|
||||
<path
|
||||
android:fillColor="#faaf3c"
|
||||
android:pathData="M69.88,139.38C39.71,143.23 5.25,119.56 0.8,84.67 -1.65,65.47 1.25,46.45 13.45,34.29 25.66,22.12 29.36,46.69 29.27,57.81c-0.09,11.11 2.60,35.95 4.67,44.23 5.56,22.24 19.04,37.38 35.93,37.33z" />
|
||||
<path
|
||||
android:fillColor="#8cc864"
|
||||
android:pathData="M7.62,1.60C28.02,-4.61 54.62,7.68 61.81,31.27 65.77,44.25 66.00,57.73 59.00,67.58 52,77.43 46.54,60.88 45.30,53.19 44.05,45.50 39.26,28.65 36.86,23.17 30.39,8.45 19.29,-0.42 7.62,1.60Z" />
|
||||
<path
|
||||
android:fillColor="#e6322d"
|
||||
android:pathData="m54.43,10.61c30.16,-3.85 64.62,19.81 69.08,54.71 2.45,19.2 -0.45,38.21 -12.65,50.37 -12.20,12.16 -15.90,-12.40 -15.81,-23.52 0.09,-11.11 -2.6,-35.95 -4.67,-44.23C84.80,25.70 71.32,10.56 54.43,10.61Z" />
|
||||
<path
|
||||
android:fillColor="#194b64"
|
||||
android:pathData="m116.69,148.39c-20.39,6.21 -46.99,-6.08 -54.19,-29.67 -3.95,-12.98 -4.18,-26.46 2.81,-36.31 7.00,-9.84 12.45,6.7 13.70,14.38 1.24,7.69 6.03,24.54 8.44,30.02 6.46,14.72 17.57,23.59 29.23,21.56z" />
|
||||
</vector>
|
42
app/src/main/res/drawable/thumb_immo_scout24.xml
Normal file
42
app/src/main/res/drawable/thumb_immo_scout24.xml
Normal file
|
@ -0,0 +1,42 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="52.91dp"
|
||||
android:height="31.87dp"
|
||||
android:viewportWidth="52.91"
|
||||
android:viewportHeight="31.87">
|
||||
<path
|
||||
android:fillColor="#00fdce"
|
||||
android:pathData="m43.61,19.52c-2.75,-0.92 -5.54,-1.72 -8.32,-2.57 -3.71,0.18 -7.40,0.75 -11.11,1.00 -5.93,0.54 -11.86,1.11 -17.79,1.67 -0.19,-0.73 -0.17,-1.45 -0.17,-2.27 -0.52,-0.90 -0.17,-2.15 -0.43,-3.16 -0.51,-0.63 0.28,-1.30 -0.14,-1.91 0.06,-0.60 -0.48,-1.35 -0.08,-1.86 -1.00,-0.88 1.10,-0.75 0.46,-1.74 -0.36,-0.50 0.10,-1.51 -0.24,-2.02 -0.33,-0.47 0.25,-1.56 -0.05,-2.19 -0.23,-1.00 -0.17,-1.68 1.23,-1.49 6.20,-0.61 12.41,-1.25 18.61,-1.94 3.39,-0.25 6.77,-0.66 10.16,-0.99 1.58,0.14 2.96,1.11 4.45,1.60 2.86,1.15 5.70,2.39 8.54,3.61 0.01,0.63 -0.06,1.41 -0.29,2.02 -0.22,0.81 -0.98,1.58 -0.69,2.43 -0.70,0.41 -0.53,1.02 -0.62,1.76 -0.34,0.14 -0.12,0.89 -0.52,0.96 0.28,0.51 -0.77,0.96 -0.22,1.65 -0.21,0.17 -0.46,0.90 -0.66,1.26 0.12,0.53 -0.16,0.88 -0.71,1.57 -0.37,0.38 -0.20,1.29 -0.58,1.51 0.17,0.45 -0.00,1.67 -0.76,1.08z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m24.14,11.38c0,-1.33 0,-2.66 0,-3.99 0.38,0 0.77,0 1.16,0 0.06,0.27 0.13,0.55 0.19,0.83 0.39,-0.67 1.17,-1.05 1.95,-1.02 0.90,-0.03 1.77,0.55 2.08,1.40 0.40,-0.98 1.52,-1.46 2.54,-1.40 1.10,-0.00 2.16,0.80 2.34,1.91 0.09,1.02 0.03,2.06 0.05,3.09 0.00,1.05 0.00,2.11 0.00,3.17 -0.47,0 -0.95,0 -1.42,0 -0.00,-1.84 0.01,-3.68 -0.02,-5.53 0.01,-0.67 -0.54,-1.33 -1.24,-1.30 -0.74,-0.09 -1.46,0.44 -1.65,1.16 -0.17,0.63 -0.07,1.31 -0.10,1.96 -0.00,1.23 -0.00,2.47 -0.00,3.71 -0.47,0 -0.95,0 -1.42,0 -0.01,-1.88 0.00,-3.76 -0.02,-5.64 -0.04,-0.62 -0.55,-1.18 -1.19,-1.19 -0.69,-0.08 -1.40,0.33 -1.63,1.00 -0.22,0.46 -0.14,0.97 -0.15,1.46 -0.00,1.45 -0.00,2.91 -0.00,4.36 -0.47,0 -0.95,0 -1.42,0 0,-1.33 0.00,-2.66 0.00,-3.99z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m12.45,11.39c0,-1.33 0,-2.66 0,-3.99 0.38,0 0.77,0 1.16,0 0.06,0.27 0.13,0.55 0.19,0.83 0.39,-0.67 1.17,-1.05 1.95,-1.02 0.90,-0.03 1.77,0.55 2.08,1.40 0.40,-0.98 1.52,-1.46 2.54,-1.40 1.10,-0.00 2.16,0.80 2.34,1.91 0.09,1.02 0.03,2.06 0.05,3.09 0.00,1.05 0.00,2.11 0.00,3.17 -0.47,0 -0.95,0 -1.42,0 -0.00,-1.84 0.01,-3.68 -0.02,-5.53 0.01,-0.67 -0.54,-1.33 -1.24,-1.30 -0.74,-0.09 -1.46,0.44 -1.65,1.16 -0.17,0.63 -0.07,1.31 -0.10,1.96 -0.00,1.23 -0.00,2.47 -0.00,3.71 -0.47,0 -0.95,0 -1.42,0 -0.01,-1.88 0.00,-3.76 -0.02,-5.64 -0.04,-0.62 -0.55,-1.18 -1.19,-1.19 -0.69,-0.08 -1.40,0.33 -1.63,1.00 -0.22,0.46 -0.14,0.97 -0.15,1.46 -0.00,1.45 -0.00,2.91 -0.00,4.36 -0.47,0 -0.95,0 -1.42,0 0,-1.33 0.00,-2.66 0.00,-3.99z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m9.50,10.18c0,-4.94 0.00,-5.21 0.03,-5.22 0.13,-0.05 1.50,-0.57 1.51,-0.57 0.00,0 0.00,2.47 0.00,5.50v5.50h-0.77,-0.77z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m39.11,15.56c-1.22,-0.07 -2.38,-0.79 -2.98,-1.86 -0.47,-0.81 -0.63,-1.77 -0.56,-2.70 0.08,-1.43 0.91,-2.87 2.26,-3.46 1.41,-0.61 3.22,-0.38 4.33,0.72 1.17,1.11 1.47,2.92 1.06,4.44 -0.33,1.24 -1.28,2.32 -2.53,2.68 -0.50,0.15 -1.04,0.20 -1.57,0.16zM39.92,14.15c0.97,-0.17 1.74,-1.02 1.92,-1.98 0.22,-1.07 -0.01,-2.32 -0.89,-3.04 -0.92,-0.77 -2.44,-0.65 -3.23,0.26 -0.84,0.95 -0.92,2.45 -0.33,3.55 0.48,0.89 1.53,1.40 2.53,1.20z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m49.62,30.27c0,-0.44 0,-0.88 0,-1.32 -1.67,0 -3.35,0 -5.03,0 0.00,-0.36 -0.01,-0.74 0.01,-1.11 1.37,-2.34 2.75,-4.68 4.13,-7.03 0.53,-0.00 1.06,-0.01 1.59,0.00 -1.29,2.22 -2.60,4.44 -3.90,6.67 0.96,0.05 1.93,0.01 2.90,0.02 0.19,0.01 0.36,0.02 0.29,-0.21 0.00,-0.82 0.00,-1.64 0.00,-2.46 0.47,-0.18 0.95,-0.36 1.42,-0.55 0.00,1.07 0.00,2.15 0.00,3.23 0.61,0 1.23,0 1.84,0 0,0.48 0,0.96 0,1.44 -0.61,0 -1.23,0 -1.84,0 0,0.88 0,1.77 0,2.65 -0.48,0 -0.96,0 -1.44,0 0,-0.44 0,-0.88 0,-1.32z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m37.15,30.93c0,-0.22 0,-0.45 0,-0.67 1.45,-1.15 2.99,-2.22 4.32,-3.53 0.77,-0.79 1.48,-1.85 1.31,-3.01 -0.07,-0.86 -0.80,-1.58 -1.67,-1.67 -0.99,-0.16 -2.06,0.47 -2.30,1.47 -0.12,0.20 0.03,0.58 -0.19,0.68 -0.43,0.16 -0.86,0.33 -1.30,0.50 -0.16,-1.36 0.43,-2.86 1.67,-3.55 1.31,-0.75 3.13,-0.67 4.27,0.36 1.01,0.92 1.19,2.48 0.75,3.73 -0.54,1.51 -1.81,2.60 -3.03,3.59 -0.54,0.43 -1.10,0.86 -1.66,1.29 1.73,0.00 3.47,0.00 5.21,0.00 0,0.49 0,0.98 0,1.47 -2.46,0 -4.93,0 -7.39,0 -0,-0.22 -0,-0.44 -0,-0.67z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m34.71,31.78c-0.68,-0.06 -1.27,-0.56 -1.48,-1.21 -0.26,-0.72 -0.14,-1.51 -0.17,-2.27 -0.00,-1.11 -0.00,-2.23 -0.01,-3.34 -0.44,-0.00 -0.88,-0.00 -1.32,-0.01 0,-0.42 0,-0.85 0,-1.28 0.44,0 0.89,0 1.33,0 0.00,-0.57 0.00,-1.15 0.00,-1.73 0.45,-0.17 0.90,-0.35 1.36,-0.52 0.02,0.75 0.01,1.50 0.01,2.25 0.55,0 1.10,0 1.65,0 0,0.42 0,0.85 0,1.28 -0.54,0.00 -1.09,0.00 -1.64,0.01 0.00,1.55 -0.01,3.11 0.01,4.67 0.01,0.45 0.36,0.94 0.86,0.89 0.26,0.08 0.62,-0.26 0.76,-0.20 0.00,0.44 0.00,0.88 0.00,1.33 -0.44,0.12 -0.91,0.18 -1.38,0.14z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m26.62,31.77c-0.96,-0.10 -1.83,-0.80 -2.12,-1.73 -0.27,-0.72 -0.15,-1.50 -0.19,-2.26 -0.00,-1.37 -0.00,-2.75 -0.00,-4.13 0.46,0 0.93,0 1.40,0 0.00,1.82 0.00,3.65 0.00,5.48 0.10,0.51 0.39,1.03 0.90,1.22 0.92,0.37 2.06,-0.10 2.49,-0.99 0.34,-0.62 0.24,-1.35 0.26,-2.04 0.00,-1.22 0.00,-2.44 0.00,-3.66 0.46,0 0.93,0 1.40,0 0,2.65 0,5.30 0,7.95 -0.38,0 -0.76,0 -1.15,0 -0.08,-0.35 -0.17,-0.70 -0.26,-1.06 -0.47,0.76 -1.33,1.22 -2.22,1.25 -0.17,0.00 -0.35,0.00 -0.52,-0.02z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m19.13,31.79c-1.23,-0.09 -2.40,-0.81 -2.99,-1.90 -0.76,-1.37 -0.75,-3.15 0.01,-4.52 0.66,-1.21 2.04,-1.96 3.42,-1.88 1.41,-0.02 2.78,0.85 3.37,2.13 0.36,0.73 0.47,1.57 0.42,2.39 -0.05,1.44 -0.90,2.86 -2.23,3.46 -0.62,0.29 -1.31,0.36 -2.00,0.33zM19.75,30.42c1.00,-0.10 1.84,-0.91 2.07,-1.88 0.31,-1.15 0.02,-2.56 -0.99,-3.29 -0.98,-0.72 -2.51,-0.49 -3.23,0.49 -0.60,0.77 -0.71,1.82 -0.49,2.75 0.23,0.99 1.09,1.82 2.12,1.92 0.17,0.01 0.34,0.02 0.51,-0.00z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m11.37,31.78c-1.23,-0.11 -2.37,-0.90 -2.90,-2.02 -0.52,-1.06 -0.56,-2.32 -0.29,-3.46 0.27,-1.16 1.12,-2.20 2.26,-2.60 1.40,-0.52 3.16,-0.14 4.10,1.06 0.16,0.24 0.63,0.72 0.09,0.79 -0.33,0.12 -0.66,0.27 -1.01,0.37 -0.26,-0.36 -0.59,-0.74 -1.03,-0.91 -0.86,-0.37 -1.97,-0.12 -2.53,0.64 -0.67,0.90 -0.76,2.16 -0.40,3.22 0.30,0.86 1.13,1.52 2.06,1.55 0.85,0.05 1.69,-0.41 2.12,-1.15 0.29,-0.07 0.70,0.22 1.04,0.31 0.49,0.03 0.06,0.43 -0.05,0.65 -0.71,1.01 -1.95,1.62 -3.19,1.56 -0.08,-0.00 -0.17,-0.00 -0.25,-0.01z" />
|
||||
<path
|
||||
android:fillColor="#323232"
|
||||
android:pathData="m3.43,31.85c-1.31,-0.05 -2.58,-0.82 -3.15,-2.02 -0.11,-0.23 -0.07,-0.15 -0.27,-0.74 0.64,-0.25 0.94,-0.36 1.45,-0.55 0.27,1.14 1.11,1.83 2.11,1.88 0.79,0.08 1.74,-0.27 1.97,-1.10 0.21,-0.66 -0.06,-1.41 -0.65,-1.78 -1.21,-0.82 -2.83,-0.99 -3.82,-2.15 -0.72,-0.85 -0.78,-2.12 -0.39,-3.14 0.49,-1.24 1.90,-1.92 3.20,-1.81 1.22,0.07 2.46,0.78 2.90,1.97 -0.44,0.19 -0.90,0.35 -1.36,0.53 -0.49,-1.09 -2.14,-1.49 -3.01,-0.60 -0.63,0.64 -0.52,1.84 0.25,2.33 1.19,0.79 2.75,0.97 3.78,2.03 0.92,0.89 0.98,2.41 0.41,3.51 -0.65,1.21 -2.11,1.73 -3.42,1.65z" />
|
||||
</vector>
|
12
app/src/main/res/drawable/thumb_kde.xml
Normal file
12
app/src/main/res/drawable/thumb_kde.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="34dp"
|
||||
android:height="35.94dp"
|
||||
android:viewportWidth="34"
|
||||
android:viewportHeight="35.94">
|
||||
<path
|
||||
android:fillColor="#1d99f3"
|
||||
android:pathData="m6.26,5.99c-0.06,0.00 -0.13,0.03 -0.18,0.08l-2.34,2.34c-0.09,0.09 -0.11,0.25 -0.04,0.37l2.74,4.52c-0.48,0.81 -0.87,1.70 -1.15,2.63L0.24,17.00C0.10,17.03 0,17.16 0,17.30v3.31c0,0.14 0.09,0.26 0.23,0.29l4.89,1.19c0.26,1.07 0.66,2.10 1.2,3.04l-2.83,4.32c-0.07,0.12 -0.06,0.27 0.03,0.38l2.34,2.34c0.09,0.09 0.25,0.11 0.37,0.04L10.68,29.55c0.87,0.50 1.81,0.89 2.80,1.16l1.03,4.98c0.02,0.14 0.15,0.24 0.29,0.24h3.31c0.13,0 0.26,-0.09 0.29,-0.23l1.22,-4.99c1.02,-0.27 1.99,-0.68 2.88,-1.21l4.37,2.86c0.12,0.07 0.27,0.06 0.38,-0.03l2.34,-2.34c0.09,-0.09 0.11,-0.25 0.04,-0.37l-1.59,-2.63 -0.51,0.16c-0.07,0.02 -0.15,-0.00 -0.20,-0.06 0,0 -1.01,-1.49 -2.33,-3.41 -1.57,3.07 -4.77,5.18 -8.46,5.18 -5.24,0 -9.50,-4.25 -9.50,-9.50 0,-3.86 2.30,-7.18 5.61,-8.67V8.21c-0.60,0.21 -1.18,0.46 -1.73,0.76 -0.00,-0.00 -0.00,-0.00 -0.00,-0.00L6.46,6.04c-0.06,-0.03 -0.13,-0.05 -0.19,-0.04z" />
|
||||
<path
|
||||
android:fillColor="#1d99f3"
|
||||
android:pathData="M19.81,0 L13.83,0.57V25.18l5.91,-0.89V13.80l7.94,11.63 6.23,-1.97L25.79,12.27 34,1.71 27.64,0.25 19.75,10.81Z" />
|
||||
</vector>
|
112
app/src/main/res/drawable/thumb_keycloak.xml
Normal file
112
app/src/main/res/drawable/thumb_keycloak.xml
Normal file
|
@ -0,0 +1,112 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="166.98dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="166.98">
|
||||
<path
|
||||
android:fillColor="#4d4d4d"
|
||||
android:pathData="m169.34,41.75a1.52,1.52 0,0 1,-1.33 -0.76L144.81,0.80A1.60,1.60 0,0 0,143.45 0H48.84A1.52,1.52 0,0 0,47.51 0.76L23.42,42.51 0.20,82.74a1.55,1.55 0,0 0,0 1.53l23.20,40.18 24.08,41.75a1.52,1.52 0,0 0,1.33 0.76h94.62a1.60,1.60 0,0 0,1.34 -0.76l23.22,-40.14a1.52,1.52 0,0 1,1.33 -0.76h28.90a1.73,1.73 0,0 0,1.73 -1.73V43.49a1.73,1.73 0,0 0,-1.76 -1.74h-28.90z" />
|
||||
<path
|
||||
android:fillColor="#e1e1e1"
|
||||
android:pathData="m28.67,79.30 l-25.92,9.41 -2.54,-4.4a1.52,1.52 0,0 1,0 -1.54L11.94,62.44Z" />
|
||||
<path
|
||||
android:fillColor="#c8c8c8"
|
||||
android:pathData="M199.96,84.36l0,19.81l-17.07,-17.37z" />
|
||||
<path
|
||||
android:fillColor="#c2c2c2"
|
||||
android:pathData="m182.88,86.81 l17.07,17.37v19.35a1.71,1.71 0,0 1,-1.70 1.71h-19.88z" />
|
||||
<path
|
||||
android:fillColor="#c7c7c7"
|
||||
android:pathData="M147.23,107.81l35.65,-21.00l-4.50,38.44l-23.89,0z" />
|
||||
<path
|
||||
android:fillColor="#cecece"
|
||||
android:pathData="M199.96,66.01l0,18.35l-17.07,2.44z" />
|
||||
<path
|
||||
android:fillColor="#d3d3d3"
|
||||
android:pathData="M199.96,43.49V65.98L182.88,86.77 170.00,41.75h28.23a1.73,1.73 0,0 1,1.73 1.74z" />
|
||||
<path
|
||||
android:fillColor="#c6c6c6"
|
||||
android:pathData="M147.23,107.81l7.25,17.44l-12.61,0l-3.26,-4.68z" />
|
||||
<path
|
||||
android:fillColor="#d5d5d5"
|
||||
android:pathData="M170.00,41.77l12.88,45.03l-47.28,-19.98l24.86,-25.05z" />
|
||||
<path
|
||||
android:fillColor="#d0d0d0"
|
||||
android:pathData="m135.60,66.82 l11.63,40.99 35.65,-21.00z" />
|
||||
<path
|
||||
android:fillColor="#bfbfbf"
|
||||
android:pathData="M138.45,125.25l0.15,-4.68l3.26,4.68z" />
|
||||
<path
|
||||
android:fillColor="#d9d9d9"
|
||||
android:pathData="M140.71,41.77l19.75,0l-24.86,25.05l-4.48,-22.41z" />
|
||||
<path
|
||||
android:fillColor="#d4d4d4"
|
||||
android:pathData="M135.60,66.82 L78.20,80.05 138.63,120.57Z" />
|
||||
<path
|
||||
android:fillColor="#d0d0d0"
|
||||
android:pathData="m135.60,66.82 l3.03,53.75 8.63,-12.75z" />
|
||||
<path
|
||||
android:fillColor="#d9d9d9"
|
||||
android:pathData="M131.11,44.41 L78.20,80.05 135.60,66.82Z"
|
||||
android:strokeWidth="0.80" />
|
||||
<path
|
||||
android:fillColor="#d8d8d8"
|
||||
android:pathData="M28.67,79.30l49.52,0.75l-24.87,45.2l-14.17,0z" />
|
||||
<path
|
||||
android:fillColor="#e2e2e2"
|
||||
android:pathData="M52.71,41.75 L28.67,79.30 22.55,44.02 23.41,42.55c0,0 0,0 0,0a1.60,1.60 0,0 1,1.34 -0.80z" />
|
||||
<path
|
||||
android:fillColor="#d8d8d8"
|
||||
android:pathData="m39.15,125.26h-14.39a1.54,1.54 0,0 1,-1.34 -0.80L2.75,88.71 28.67,79.30Z" />
|
||||
<path
|
||||
android:fillColor="#e4e4e4"
|
||||
android:pathData="M11.94,62.42l10.61,-18.39l6.11,35.27z" />
|
||||
<path
|
||||
android:fillColor="#dedede"
|
||||
android:pathData="M87.87,41.77l-25.35,0l15.69,38.28l52.90,-35.64l-15.94,-2.64l-10.73,0z" />
|
||||
<path
|
||||
android:fillColor="#dedede"
|
||||
android:pathData="M28.67,79.30l49.52,0.75l-15.69,-38.28l-6.53,0l-3.27,0z" />
|
||||
<path
|
||||
android:fillColor="#c5c5c5"
|
||||
android:pathData="M138.60,120.57l-11.51,4.68l9.23,0l2.12,0z" />
|
||||
<path
|
||||
android:fillColor="#d0d0d0"
|
||||
android:pathData="M89.08,125.25l15.34,0l22.66,0l11.51,-4.68l-60.4,-40.51z" />
|
||||
<path
|
||||
android:fillColor="#d1d1d1"
|
||||
android:pathData="M87.87,125.25l1.21,0l-10.88,-45.2l-24.87,45.2l2.65,0z" />
|
||||
<path
|
||||
android:fillColor="#ddd"
|
||||
android:pathData="M136.32,41.77l-5.05,0l-0.16,2.64l9.60,-2.64z" />
|
||||
<path
|
||||
android:fillColor="#e3e3e3"
|
||||
android:pathData="M131.11,44.41l-1.47,-2.64l-14.47,0z" />
|
||||
<path
|
||||
android:fillColor="#e2e2e2"
|
||||
android:pathData="M131.11,44.41l0.16,-2.64l-1.63,0z" />
|
||||
<path
|
||||
android:fillColor="#00b8e3"
|
||||
android:pathData="M87.71,42.48 L64.37,82.9a1.35,1.35 0,0 0,-0.16 0.65H47.89L79.94,28.10a1.26,1.26 0,0 1,0.47 0.46l0.04,0.04 7.22,12.60a1.39,1.39 0,0 1,0.02 1.26z" />
|
||||
<path
|
||||
android:fillColor="#33c6e9"
|
||||
android:pathData="m87.68,126.06 l-7.22,12.55a1.40,1.40 0,0 1,-0.49 0.46L47.89,83.57v0h16.30a1.23,1.23 0,0 0,0.15 0.63,0.14 0.14,0 0,0 0,0.07l23.28,40.38a1.36,1.36 0,0 1,0.04 1.40z" />
|
||||
<path
|
||||
android:fillColor="#008aaa"
|
||||
android:pathData="M79.94,28.10 L47.89,83.55v0,0l-8.03,13.92 -7.66,-13.29a1.23,1.23 0,0 1,-0.15 -0.63,1.35 1.35,0 0,1 0.16,-0.65L39.98,69.44 63.58,28.60a1.36,1.36 0,0 1,1.17 -0.69h14.45a1.43,1.43 0,0 1,0.73 0.20z" />
|
||||
<path
|
||||
android:fillColor="#00b8e3"
|
||||
android:pathData="m79.94,139.04a1.43,1.43 0,0 1,-0.69 0.18H64.76a1.36,1.36 0,0 1,-1.19 -0.69l-21.53,-37.35 -2.16,-3.69 8.03,-13.91z" />
|
||||
<path
|
||||
android:fillColor="#008aaa"
|
||||
android:pathData="m144.33,83.55 l-32.03,55.48a1.50,1.50 0,0 1,-0.47 -0.46v-0.04l-7.22,-12.58a1.39,1.39 0,0 1,0 -1.29l23.28,-40.40a1.35,1.35 0,0 0,0.19 -0.69z" />
|
||||
<path
|
||||
android:fillColor="#00b8e3"
|
||||
android:pathData="m160.18,83.55a1.35,1.35 0,0 1,-0.19 0.69l-31.36,54.32a1.37,1.37 0,0 1,-1.16 0.64h-14.45a1.49,1.49 0,0 1,-0.69 -0.18l32.03,-55.48 8.03,-13.9 7.62,13.20a1.34,1.34 0,0 1,0.18 0.69z" />
|
||||
<path
|
||||
android:fillColor="#00b8e3"
|
||||
android:pathData="m144.33,83.55h-16.28a1.34,1.34 0,0 0,-0.19 -0.69L104.57,42.50a1.36,1.36 0,0 1,0 -1.38l7.22,-12.56a1.50,1.50 0,0 1,0.49 -0.44z" />
|
||||
<path
|
||||
android:fillColor="#33c6e9"
|
||||
android:pathData="m152.36,69.64v0L144.33,83.54 112.29,28.10a1.49,1.49 0,0 1,0.69 -0.18h14.45a1.37,1.37 0,0 1,1.16 0.64z" />
|
||||
</vector>
|
42
app/src/main/res/drawable/thumb_luadns.xml
Normal file
42
app/src/main/res/drawable/thumb_luadns.xml
Normal file
|
@ -0,0 +1,42 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="53.68dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="53.68">
|
||||
<path
|
||||
android:fillColor="#083338"
|
||||
android:pathData="M189.84,17.34l9.83,0l0,-15.37l-1.96,-1.96l-27.76,0l0,20.71l1.96,1.96l15.25,11.50l0,7.74l-4.76,0l0,-4.33l-1.96,-1.96l-10.83,0l0,16.09l1.96,1.96l28.43,0l0,-22.14l-1.96,-1.96l-15.27,-11.47l0,-6.26l5.12,0l0,3.54z" />
|
||||
<path
|
||||
android:fillColor="#083338"
|
||||
android:pathData="M0,51.72l1.96,1.96l26,0l0,-9.79l-1.96,-1.96l-13.20,0l0,-39.96l-1.96,-1.96l-10.83,0z" />
|
||||
<path
|
||||
android:fillColor="#083338"
|
||||
android:pathData="M39.85,-0l-10.83,0l0,51.72l1.96,1.96l30.58,0l0,-51.72l-1.96,-1.96l-10.87,0l0,41.92l-6.90,0l0,-39.96z" />
|
||||
<path
|
||||
android:fillColor="#083338"
|
||||
android:pathData="M93.74,-0L71.13,-0l-8.33,8.18l0,43.52l1.96,1.96L75.63,53.67L75.63,36.69l7.26,0l0,15.02l1.96,1.96L95.70,53.67L95.70,1.96ZM82.90,11.79L82.90,24.89L75.63,24.89L75.63,11.79Z" />
|
||||
<path
|
||||
android:fillColor="#083338"
|
||||
android:pathData="m132.09,8.18 l-8.33,-8.18l-22.24,0l0,51.72l1.96,1.96L126.79,53.68l7.25,-7.15l0,-36.38l-1.96,-1.93zM114.31,11.79l6.90,0l0,30.12l-6.90,0z" />
|
||||
<path
|
||||
android:fillColor="#083338"
|
||||
android:pathData="M135.11,-0l0,51.72l1.96,1.96l10.16,0l0,-26.14l8.62,24.18l1.96,1.96l10.73,0l0,-51.72l-1.96,-1.96l-10.23,0l0,26.11l-8.55,-24.15l-1.96,-1.96z" />
|
||||
<path
|
||||
android:fillColor="#D90C38"
|
||||
android:pathData="M0,51.72V-0H10.83V41.91h15.16v9.79H0Z" />
|
||||
<path
|
||||
android:fillColor="#D90C38"
|
||||
android:pathData="M59.60,51.72H29.02V-0H39.85V41.91h8.86V-0h10.87z" />
|
||||
<path
|
||||
android:fillColor="#D90C38"
|
||||
android:pathData="M73.67,51.72L62.79,51.72L62.79,8.18L71.13,-0L93.74,-0L93.74,51.72L82.90,51.72L82.90,34.72h-9.22zM82.90,24.90L82.90,9.83h-9.22L73.67,24.89h9.22z" />
|
||||
<path
|
||||
android:fillColor="#1097A3"
|
||||
android:pathData="m101.51,-0h22.24L132.09,8.18V44.56l-7.25,7.15H101.51ZM121.22,41.92V9.83h-8.86V41.91h8.86z" />
|
||||
<path
|
||||
android:fillColor="#1097A3"
|
||||
android:pathData="M156.35,29.68V-0h10.23V51.72h-10.73L145.27,22.03V51.72H135.11V-0h10.73z" />
|
||||
<path
|
||||
android:fillColor="#1097A3"
|
||||
android:pathData="M198.03,51.72H169.60V35.63h10.83v6.29h6.72V33.69L169.96,20.71V-0H197.72V15.37h-9.83V9.86h-7.08v6.75l17.24,12.94v22.15z" />
|
||||
</vector>
|
30
app/src/main/res/drawable/thumb_mail_de.xml
Normal file
30
app/src/main/res/drawable/thumb_mail_de.xml
Normal file
|
@ -0,0 +1,30 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="22.36dp"
|
||||
android:height="14.15dp"
|
||||
android:viewportWidth="22.36"
|
||||
android:viewportHeight="14.15">
|
||||
<path
|
||||
android:fillColor="#78bddc"
|
||||
android:pathData="m14.91,13.32c-0.13,0.33 -0.60,0.69 -0.88,0.69h-13.30c0.08,0 -0.88,0 -0.52,-0.69l3.72,-8.47c0.13,-0.27 0.49,-0.63 0.82,-0.63l14.70,-2.15c0.35,-0.05 0.41,0.22 0.27,0.63l-4.83,10.62" />
|
||||
<path
|
||||
android:fillColor="#0c87bf"
|
||||
android:pathData="m0.72,13.88h13.30c0.19,0 0.60,-0.35 0.74,-0.63l4.83,-10.62c0.08,-0.19 0.08,-0.33 0.08,-0.41 -0.08,0 -0.08,-0.05 -0.22,0l-14.70,2.15c-0.27,0 -0.60,0.27 -0.74,0.55l-3.69,8.41c-0.05,0.19 -0.05,0.27 0,0.33 0.08,0.13 0.27,0.22 0.41,0.22m0,0.27c0,0 -0.46,0 -0.66,-0.35 -0.08,-0.13 -0.08,-0.33 0,-0.55l3.72,-8.47c0.13,-0.33 0.55,-0.69 0.96,-0.69l14.65,-2.15c0.19,-0.05 0.41,0 0.46,0.13 0.08,0.13 0.08,0.41 0,0.69l-4.83,10.56c-0.19,0.41 -0.69,0.82 -1.02,0.82h-13.30" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m8.42,12.28 l-0.05,-0.08 -3.94,-7.47c-0.08,-0.08 -0.08,-0.13 0,-0.22h0.19l4.22,4.38 13.16,-8.69c0.05,0 0.05,-0.05 0.05,-0.05 0.08,0 0.13,0.05 0.13,0.05 0.08,0.08 0,0.13 -0.05,0.22l-13.57,11.78c0,0.08 -0.05,0.08 -0.05,0.08h-0.08" />
|
||||
<path
|
||||
android:fillColor="#0c87bf"
|
||||
android:pathData="m22.14,0c-0.08,0 -0.13,0.05 -0.22,0.05l-13.08,8.69 -4.22,-4.44c-0.05,-0.08 0,0.05 -0.05,0.05 -0.08,0 -0.13,0 -0.22,0.08 -0.13,0.05 -0.19,0.05 -0.13,0.13l4.02,7.70c0.05,0.05 0.13,0.13 0.19,0.13h0.08c0.05,0 0.13,-0.08 0.13,-0.08l13.63,-11.78c0.05,-0.13 0.13,-0.35 0.05,-0.41 -0.05,-0.08 -0.13,-0.13 -0.19,-0.13m-0.08,0.33 l-13.55,11.81 -4.02,-7.50 4.30,4.44 13.27,-8.74" />
|
||||
<path
|
||||
android:fillColor="#3a97c7"
|
||||
android:pathData="m18.52,2.34 l-13.77,2.01h-0.05l4.14,4.38zM18.52,2.34" />
|
||||
<path
|
||||
android:fillColor="#0c87bf"
|
||||
android:pathData="m18.80,2.15 l-14.18,2.20h0.13l13.77,-2.01 0.27,-0.19m-14.24,2.20h-0.22v0.08c0.08,-0.08 0.13,-0.08 0.22,-0.08" />
|
||||
<path
|
||||
android:fillColor="#78a8d1"
|
||||
android:pathData="m19.46,2.06 l-10.67,7.01 -4.22,-4.44 4.22,5.49" />
|
||||
<path
|
||||
android:fillColor="#0c87bf"
|
||||
android:pathData="m19.46,2.06 l-0.66,0.08 -0.27,0.19 -9.68,6.40 -4.14,-4.38h-0.13c-0.08,0 -0.13,0 -0.22,0.08l0.22,0.19 4.22,4.44 10.67,-7.01" />
|
||||
</vector>
|
12
app/src/main/res/drawable/thumb_malwaretips.xml
Normal file
12
app/src/main/res/drawable/thumb_malwaretips.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="183.95dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="183.95"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:fillColor="#1b967e"
|
||||
android:pathData="M181.74,0 L143.61,29.04L112.95,29.04L112.95,52.70L91.17,69.08 69.38,52.70L69.38,29.04L38.72,29.04L0.59,0ZM91.17,154.91 L112.95,138.61l0,50.54c-6.72,3.34 -14.52,7.69 -21.78,10.84C83.91,196.86 76.11,192.44 69.38,189.10l0,-50.54z" />
|
||||
<path
|
||||
android:fillColor="#1b967e"
|
||||
android:pathData="m142.00,117.28 l41.95,-31.62l0,23.54c0,18.05 -9.55,34.98 -24.75,49.60A142.56,142.56 45,0 1,142.00 172.79ZM183.96,19.68 L91.98,89.23 0,19.68l0,45.18l91.98,69.55 91.98,-69.55zM41.95,117.28l0,55.49A139.53,139.53 135,0 1,24.77 158.80C9.55,144.18 0,127.25 0,109.19l0,-23.54z" />
|
||||
</vector>
|
42
app/src/main/res/drawable/thumb_mangadex.xml
Normal file
42
app/src/main/res/drawable/thumb_mangadex.xml
Normal file
|
@ -0,0 +1,42 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="138.6dp"
|
||||
android:height="118.22dp"
|
||||
android:viewportWidth="138.6"
|
||||
android:viewportHeight="118.22">
|
||||
<path
|
||||
android:pathData="M124.42,75.20H23.76c-1.23,0 -2.23,-1.00 -2.23,-2.23 0,-1.23 1.00,-2.23 2.23,-2.23h100.66c1.23,0 2.23,1.00 2.23,2.23 0.00,1.23 -1.00,2.23 -2.23,2.23"
|
||||
android:fillColor="#f79421" />
|
||||
<path
|
||||
android:pathData="M124.42,83.68H23.76c-1.23,0 -2.23,-1 -2.23,-2.23 0,-1.23 1.00,-2.23 2.23,-2.23h100.66c1.23,0 2.23,1.00 2.23,2.23 0.00,1.23 -1.00,2.23 -2.23,2.23"
|
||||
android:fillColor="#f79421" />
|
||||
<path
|
||||
android:pathData="M107.95,96.12l6.40,-3.71l6.40,3.71l0,-14.96l-12.81,0z"
|
||||
android:fillColor="#f79421" />
|
||||
<path
|
||||
android:pathData="M112.07,33.9h16.83v9.33h-16.83z"
|
||||
android:fillColor="#272b30" />
|
||||
<path
|
||||
android:pathData="m137.95,45.60c-0.08,-0.07 -0.16,-0.14 -0.25,-0.21 -1.92,-1.67 -3.56,-3.65 -4.84,-5.87 -0.01,-0.02 -0.02,-0.04 -0.03,-0.06h-0.00c-1.40,-2.48 -2.36,-5.26 -2.75,-8.22 -0.01,-0.17 -0.03,-0.35 -0.05,-0.53 0,-0.01 -0.00,-0.02 -0.00,-0.03 -0.16,-1.04 -0.60,-1.99 -1.24,-2.77 -0.06,-0.06 -0.12,-0.14 -0.18,-0.20 -5.28,-5.93 -12.30,-10.27 -20.27,-12.22 -0.01,-0.38 -0.02,-0.76 -0.02,-1.15 0,-4.41 1.13,-8.56 3.12,-12.17 0.11,-0.20 0.17,-0.43 0.17,-0.68 0,-0.79 -0.64,-1.44 -1.44,-1.44 -0.03,0 -0.06,0 -0.10,0.00 -0.08,0.00 -0.16,0.02 -0.24,0.03 -10.04,1.67 -19.12,6.18 -26.38,12.69 -3.06,2.73 -5.79,5.83 -8.14,9.21 -0.98,1.41 -1.90,2.88 -2.74,4.39C72.01,26.07 71.49,25.81 70.97,25.55 69.34,24.75 67.66,24.04 65.93,23.42 60.73,21.56 55.14,20.55 49.30,20.55c-1.53,0 -3.05,0.07 -4.54,0.21 -5.63,0.50 -10.99,1.97 -15.92,4.22C12.92,32.25 1.54,47.75 0.15,66.03 0.05,67.29 0,68.57 0,69.86v12.36c0,2.13 0.31,4.19 0.90,6.13 1.59,5.28 5.20,9.68 9.92,12.33 2.90,1.63 6.23,2.6 9.78,2.68h31.40c0.15,-0.01 0.31,-0.01 0.46,-0.01 0.15,0 0.30,0.00 0.45,0.01 0.05,0.00 0.1,0.00 0.15,0.01 0.08,0.00 0.16,0.01 0.24,0.02 1.93,0.22 3.63,1.18 4.82,2.6 0.18,0.21 0.36,0.45 0.52,0.69 0.59,0.9 0.99,1.93 1.14,3.04 0.01,0.05 0.01,0.10 0.02,0.16 0.03,0.22 0.05,0.46 0.05,0.70 0.00,0.05 0.00,0.11 0.00,0.17 0,0.05 0,0.09 -0.00,0.14v0.01c0.01,0.92 0.20,1.79 0.53,2.61 0.59,1.47 1.64,2.71 2.97,3.54 1.13,0.70 2.47,1.10 3.9,1.10 3.61,0 6.63,-2.59 7.28,-6.02 0.06,-0.28 0.09,-0.57 0.11,-0.86 0.00,-0.1 0.01,-0.19 0.01,-0.29 0.00,-0.07 0.00,-0.15 0.00,-0.22v-0.18c0,-2.53 -0.42,-4.97 -1.20,-7.23 -1.12,-3.28 -3.00,-6.22 -5.43,-8.61 -2.58,-2.55 -5.79,-4.47 -9.37,-5.51 -1.97,-0.57 -4.08,-0.89 -6.24,-0.89H26.30c-0.06,0.00 -0.12,0.00 -0.19,0.00 -0.06,0 -0.12,0 -0.19,-0.00C20.09,88.26 15.35,83.70 14.97,77.95 14.96,77.70 14.95,77.45 14.95,77.2c0,-6.17 4.99,-11.16 11.16,-11.16h99.81c2.57,0 4.76,-1.68 5.51,-4.01 0.02,-0.09 0.05,-0.18 0.07,-0.27 0.34,-1.12 1.03,-2.10 1.93,-2.81 0.00,-0.00 0.00,-0.00 0.01,-0.00 0.07,-0.06 0.15,-0.11 0.22,-0.16 0.1,-0.07 0.20,-0.14 0.31,-0.21 2.47,-1.84 4.16,-4.67 4.51,-7.89 0.05,-0.41 0.07,-0.83 0.07,-1.26 -0.00,-1.32 -0.22,-2.59 -0.64,-3.77M124.62,41.15c-0.24,0 -0.47,-0.06 -0.67,-0.16 -0.97,-0.56 -2.09,-0.92 -3.27,-1.01 -0.21,-0.01 -0.42,-0.02 -0.64,-0.02 -0.52,0 -1.02,0.05 -1.52,0.15 -0.81,0.15 -1.57,0.43 -2.27,0.82 -0.01,0.00 -0.02,0.01 -0.03,0.02 -0.04,0.01 -0.08,0.04 -0.12,0.07 -0.18,0.09 -0.40,0.14 -0.62,0.14 -0.77,0 -1.40,-0.63 -1.40,-1.40 0,-0.48 0.24,-0.91 0.62,-1.16 0.04,-0.03 0.09,-0.05 0.14,-0.08 0.90,-0.50 1.89,-0.88 2.94,-1.11 0.73,-0.16 1.50,-0.24 2.28,-0.24 1.68,0 3.27,0.38 4.68,1.08 0.18,0.08 0.36,0.17 0.54,0.27 0.05,0.02 0.09,0.05 0.14,0.08 0.37,0.25 0.62,0.68 0.62,1.16 0,0.77 -0.63,1.40 -1.40,1.40"
|
||||
android:fillColor="#e6e6e6" />
|
||||
<path
|
||||
android:pathData="m72.66,26.09c2.68,12.92 13.89,22.61 27.32,22.61 7.90,0 15.03,-3.36 20.11,-8.76 -0.02,-0.00 -0.05,-0.00 -0.08,-0.00 -0.52,0 -1.02,0.05 -1.52,0.15 -0.81,0.15 -1.57,0.43 -2.27,0.82 -0.01,0.00 -0.02,0.01 -0.03,0.02 -0.04,0.01 -0.08,0.04 -0.12,0.07 -0.18,0.09 -0.40,0.14 -0.62,0.14 -0.77,0 -1.40,-0.63 -1.40,-1.40 0,-0.48 0.24,-0.91 0.62,-1.16 0.04,-0.03 0.09,-0.05 0.14,-0.08 0.90,-0.50 1.89,-0.88 2.94,-1.11 0.73,-0.16 1.50,-0.24 2.28,-0.24 0.76,0 1.51,0.08 2.23,0.23 2.39,-3.22 4.12,-6.98 5.00,-11.07 -5.11,-5.21 -11.63,-9.04 -18.96,-10.83 -0.01,-0.38 -0.02,-0.76 -0.02,-1.15 0,-4.41 1.13,-8.56 3.12,-12.17 0.11,-0.20 0.17,-0.43 0.17,-0.68 0,-0.79 -0.64,-1.44 -1.44,-1.44 -0.03,0 -0.06,0 -0.10,0.00 -0.08,0.00 -0.16,0.02 -0.24,0.03 -10.04,1.67 -19.12,6.18 -26.38,12.69 -3.05,2.73 -5.79,5.82 -8.14,9.21 -0.93,1.33 -1.79,2.72 -2.59,4.14"
|
||||
android:fillColor="#f79421" />
|
||||
<path
|
||||
android:pathData="m130.55,52.79c-1.21,-0.36 -2.42,-0.72 -3.65,-0.99 -1.21,-0.31 -2.44,-0.57 -3.67,-0.80 -2.46,-0.44 -4.94,-0.79 -7.43,-0.94 -2.49,-0.20 -4.99,-0.10 -7.47,0.08l-1.86,0.20c-0.62,0.08 -1.22,0.23 -1.84,0.34 -1.25,0.15 -2.43,0.60 -3.67,0.87 2.30,-1.03 4.75,-1.82 7.28,-2.18 2.52,-0.37 5.09,-0.51 7.63,-0.32 2.54,0.18 5.07,0.56 7.53,1.19 2.46,0.63 4.88,1.42 7.16,2.54"
|
||||
android:fillColor="#272b30" />
|
||||
<path
|
||||
android:pathData="m129.45,55.08c-1.25,-0.17 -2.5,-0.35 -3.75,-0.43 -1.25,-0.12 -2.50,-0.20 -3.75,-0.25 -2.50,-0.07 -5.00,-0.04 -7.49,0.16 -2.49,0.16 -4.95,0.63 -7.38,1.19l-1.81,0.48c-0.59,0.17 -1.17,0.41 -1.77,0.61 -1.21,0.33 -2.31,0.96 -3.50,1.40 2.12,-1.36 4.43,-2.50 6.88,-3.24 2.43,-0.75 4.96,-1.26 7.50,-1.45 2.54,-0.19 5.10,-0.19 7.63,0.06 2.52,0.26 5.04,0.68 7.46,1.45"
|
||||
android:fillColor="#272b30" />
|
||||
<path
|
||||
android:pathData="m129.28,57.75c-1.26,0.1 -2.51,0.19 -3.76,0.38 -1.24,0.14 -2.48,0.33 -3.72,0.56 -2.46,0.46 -4.9,1.03 -7.28,1.78 -2.40,0.69 -4.69,1.68 -6.94,2.76l-1.66,0.86c-0.54,0.30 -1.06,0.65 -1.59,0.98 -1.11,0.59 -2.05,1.43 -3.12,2.13 1.78,-1.79 3.78,-3.40 6.02,-4.65 2.21,-1.25 4.57,-2.30 7.01,-3.03 2.44,-0.74 4.93,-1.29 7.46,-1.58 2.52,-0.29 5.07,-0.42 7.60,-0.19"
|
||||
android:fillColor="#272b30" />
|
||||
<path
|
||||
android:pathData="m137.70,45.39c-0.42,-0.36 -0.82,-0.75 -1.22,-1.14 -1.07,0.64 -1.79,1.82 -1.79,3.16 0,2.04 1.65,3.70 3.70,3.70 0.02,0 0.03,-0.00 0.05,-0.00 0.02,-0.15 0.05,-0.30 0.07,-0.46 0.05,-0.41 0.07,-0.83 0.07,-1.26 0,-1.32 -0.22,-2.59 -0.64,-3.77 -0.08,-0.07 -0.16,-0.13 -0.24,-0.21"
|
||||
android:fillColor="#f27baa" />
|
||||
<path
|
||||
android:pathData="m107.03,17.36c0,0.17 0,0.35 0.00,0.52 -4.50,1.82 -8.60,4.46 -12.10,7.71 -0.14,-0.99 -0.21,-2.00 -0.21,-3.04 0,-10.21 7.21,-18.75 16.83,-20.77 -2.85,4.50 -4.51,9.84 -4.51,15.58"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="m68.11,94.76c-0.49,-0.48 -1.01,-0.93 -1.54,-1.37 -5.61,1.14 -10.22,5.01 -12.41,10.16 1.59,0.36 2.99,1.24 4.01,2.45 0.18,0.21 0.36,0.45 0.52,0.69 0.59,0.9 0.99,1.93 1.14,3.04 0.01,0.04 0.01,0.10 0.02,0.16 0.03,0.22 0.05,0.46 0.05,0.70 0.00,0.05 0.00,0.11 0.00,0.17 0,0.04 0,0.09 -0.00,0.13v0.01c0.01,0.92 0.20,1.80 0.53,2.60 0.59,1.47 1.64,2.71 2.97,3.55 1.13,0.70 2.47,1.10 3.90,1.10 3.61,0 6.63,-2.59 7.28,-6.03 0.06,-0.27 0.09,-0.56 0.11,-0.86 0.00,-0.10 0.01,-0.19 0.01,-0.29 0.00,-0.08 0.00,-0.15 0.00,-0.23v-0.18c0,-2.53 -0.42,-4.97 -1.20,-7.23 -1.13,-3.28 -3.00,-6.22 -5.43,-8.62"
|
||||
android:fillColor="#f79421" />
|
||||
</vector>
|
12
app/src/main/res/drawable/thumb_mattermost.xml
Normal file
12
app/src/main/res/drawable/thumb_mattermost.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200.00dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="666.66"
|
||||
android:viewportHeight="666.65">
|
||||
<path
|
||||
android:fillColor="#3957af"
|
||||
android:pathData="M529.21,63.61l3.50,70.75c57.36,63.36 79.99,153.10 51.44,237.44C541.54,497.71 401.00,563.9 270.26,519.63 139.51,475.37 68.07,337.43 110.69,211.53 139.34,126.90 212.22,69.26 296.64,54L342.24,0.11c-142.28,-3.85 -276.53,84.46 -324.56,226.35 -59.01,174.32 34.46,363.48 208.79,422.50C400.80,707.98 589.96,614.5 648.98,440.17c47.95,-141.65 -4.78,-293.10 -119.76,-376.56" />
|
||||
<path
|
||||
android:fillColor="#3957af"
|
||||
android:pathData="M447.49,272.37l-2.41,-98.90 -1.93,-56.91 -1.31,-49.30s0.27,-23.77 -0.55,-29.36a9.14,9.14 0,0 0,-0.98 -2.96l-0.16,-0.34 -0.18,-0.30c-0.91,-1.56 -2.34,-2.84 -4.2,-3.47 -1.89,-0.64 -3.85,-0.48 -5.56,0.25l-0.10,0.03a8.47,8.47 0,0 0,-0.59 0.30,9.11 9.11,0 0,0 -2.43,1.68c-4.05,3.93 -18.27,22.98 -18.27,22.98l-30.99,38.37 -36.11,44.03 -61.99,77.10s-28.45,35.50 -22.16,79.21c6.28,43.70 38.78,64.99 63.99,73.53 25.20,8.53 63.95,11.35 95.49,-19.54 31.54,-30.9 30.51,-76.38 30.51,-76.38" />
|
||||
</vector>
|
9
app/src/main/res/drawable/thumb_mercury.xml
Normal file
9
app/src/main/res/drawable/thumb_mercury.xml
Normal file
File diff suppressed because one or more lines are too long
48
app/src/main/res/drawable/thumb_my_gov_au.xml
Normal file
48
app/src/main/res/drawable/thumb_my_gov_au.xml
Normal file
|
@ -0,0 +1,48 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="200dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:fillColor="#6CB535"
|
||||
android:pathData="m0,18.73c0,-9.86 8.86,-18.6 18.86,-18.6h50.33c10,0 18.86,8.73 18.86,18.6v21.13c0,9.86 -8.86,18.6 -18.86,18.6H18.86C8.86,58.46 0,49.73 0,39.86Z" />
|
||||
<path
|
||||
android:fillColor="#00614B"
|
||||
android:pathData="M0,171.19C0,188.68 11.38,200 28.97,200H171.02C188.61,200 200,188.68 200,171.19V18.81C200,8.74 191.20,0 181.08,0H110.49C97.36,0 92.64,15.52 91.10,17.95c-2.13,3.35 -4.12,5.98 -13.25,5.98H0Z" />
|
||||
<path
|
||||
android:fillAlpha="0.28"
|
||||
android:pathData="M193,4.46C189.73,1.73 185.6,0 181.2,0h-70.6C97.46,0 92.53,15.93 91.2,18.2c-2.2,3.6 -4.13,6.06 -13.26,6.06H0V165.06Z"
|
||||
android:strokeAlpha="0.28">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="193.03"
|
||||
android:endY="82.50"
|
||||
android:startX="-0.00741"
|
||||
android:startY="82.50"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#00FFFFFF"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FFF0EC92"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M5.46,114.6H23.66V93.46c0,-3.4 0.6,-5.86 1.86,-7.33 1.26,-1.46 2.86,-2.26 4.8,-2.26 1.2,0 2.26,0.33 3.2,1.06 0.86,0.73 1.53,1.6 1.86,2.73 0.2,0.73 0.33,2.06 0.33,4V114.6h18.2V93.26c0,-3.2 0.6,-5.6 1.8,-7.06 1.2,-1.46 2.86,-2.2 4.86,-2.2 1.73,0 3.13,0.8 4.26,2.33 0.73,1 1.13,2.46 1.13,4.53V114.6h18.2V86.86c0,-6 -1.4,-10.4 -4.2,-13.2 -2.8,-2.8 -6.66,-4.26 -11.6,-4.26 -3.33,0 -6.2,0.53 -8.46,1.53 -2.26,1 -4.8,3 -7.6,5.86 -1.4,-2.46 -3.13,-4.33 -5.26,-5.53 -2.13,-1.2 -5.06,-1.86 -8.73,-1.86 -3.4,0 -6.4,0.6 -8.8,1.73 -2.4,1.13 -4.8,3 -7.2,5.66v-6H5.46Z" />
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="m96,117.73c-0.66,0.53 -1.26,0.73 -3.26,0.73 -1.8,0 -2.06,-0.26 -4.53,-1.13L88.06,130.8c5.06,0.66 6.46,1 8.86,1 6,0 10.13,-1.06 13.06,-3.8 2.06,-1.93 4.13,-6.93 6.13,-12.4L131.13,70.8H112.8l-6.33,28.2 -6.06,-28.2H81.26l15.93,44.13c0,0 0.06,1.73 -1.2,2.8" />
|
||||
<path
|
||||
android:fillColor="#F0EC92"
|
||||
android:pathData="m81.8,150.46c1.53,-1.86 3.46,-2.8 5.86,-2.8 2.2,0 4.06,0.93 5.6,2.73 1.53,1.8 2.26,4.6 2.26,8.26 0,4 -0.73,6.86 -2.26,8.73 -1.53,1.8 -3.4,3.2 -5.73,3.2 -2.33,0 -4.26,-1.4 -5.8,-3.26 -1.53,-1.86 -2.26,-4.66 -2.26,-8.46 0,-3.73 0.8,-6.53 2.33,-8.4m-12.2,27.86c4.53,3.8 10.46,5.66 17.8,5.66 8.2,0 14.66,-2.26 19.33,-6.86 4.66,-4.53 7,-10.4 7,-17.53 0,-6.33 -1.86,-11.66 -5.66,-16 -4.66,-5.4 -11.6,-8.6 -20.73,-8.6 -8,0 -14.4,2.86 -19.06,7.46 -4.66,4.6 -7.06,10.4 -7.06,17.46 0.06,7.53 2.86,13.73 8.4,18.4" />
|
||||
<path
|
||||
android:fillColor="#F0EC92"
|
||||
android:pathData="M106.13,136.6l15.46,45.2l18.86,0l16,-45.2l-19.86,0l-5.8,24.53l-5.53,-24.53z" />
|
||||
<path
|
||||
android:fillColor="#F0EC92"
|
||||
android:pathData="m45.2,162.8v4.66c-2.2,1.2 -5.73,3.26 -11.2,3.26 -3.93,0 -7,-1.26 -9.2,-3.86C22.6,164.33 21.53,160 21.53,154c0,-5.66 1.13,-9.8 3.4,-12.4 2.26,-2.6 5.33,-3.93 9.13,-3.93 2.53,0 4.66,0.46 6.33,1.33 1.66,0.93 2.8,2.2 3.53,3.93l17.13,-2.4c-1,-3.66 -2.6,-6.66 -4.6,-9.06 -2.06,-2.4 -4.6,-4.13 -7.66,-5.26 -3.06,-1.13 -7.73,-1.73 -14,-1.73 -6.46,0 -11.6,0.93 -15.4,2.8 -4.93,2.4 -8.6,5.93 -11.13,10.6 -2.53,4.66 -3.8,10.13 -3.8,16.4 0,6 1.13,11.26 3.46,15.86 2.33,4.6 5.66,8.06 9.93,10.4 4.26,2.33 9.8,3.46 16.53,3.46 5.46,0 10.26,-0.66 14.2,-2.06C52.6,180.6 57.2,178 62.4,174.26V149.6h-27.66v13.2z" />
|
||||
</vector>
|
231
app/src/main/res/drawable/thumb_netlify.xml
Normal file
231
app/src/main/res/drawable/thumb_netlify.xml
Normal file
|
@ -0,0 +1,231 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="38.30dp"
|
||||
android:height="38.34dp"
|
||||
android:viewportWidth="38.30"
|
||||
android:viewportHeight="38.34">
|
||||
<path android:pathData="m13.40,21.37 l12.28,-5.23c0,0 0.01,0 0.03,0.01 0.06,0.06 0.12,0.11 0.17,0.15l0.02,0.01c0.02,0.01 0.05,0.03 0.05,0.05 0,0.01 0,0.01 -0.00,0.02l-1.05,6.46 -0.00,0.02c-0.00,0.05 -0.01,0.10 -0.06,0.10a1.72,1.72 0,0 0,-1.37 0.84l-0.00,0.00c-0.01,0.02 -0.02,0.04 -0.05,0.05 -0.02,0.01 -0.04,0.00 -0.07,0.00l-9.79,-2.02c-0.01,-0.00 -0.15,-0.51 -0.16,-0.52z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m19.65,12.19 l5.45,2.31c0.03,0.01 0.06,0.02 0.07,0.05a0.10,0.10 0,0 1,0 0.05c-0.01,0.08 -0.03,0.17 -0.03,0.26v0.15c0,0.03 -0.03,0.05 -0.07,0.06l-0.01,0.00c-0.86,0.36 -12.13,5.17 -12.14,5.17 -0.01,0 -0.03,0 -0.05,-0.01 -0.03,-0.03 0,-0.07 0.02,-0.11a0.76,0.76 0,0 0,0.01 -0.02l4.48,-6.94 0.00,-0.01c0.02,-0.04 0.05,-0.08 0.10,-0.08l0.04,0.00c0.10,0.01 0.19,0.02 0.28,0.02 0.68,0 1.31,-0.33 1.69,-0.89a0.16,0.16 0,0 1,0.03 -0.04c0.02,-0.02 0.06,-0.01 0.09,0.00z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m23.58,3.58 l3.81,3.81 -0.92,5.69v0.01a0.13,0.13 0,0 1,-0.00 0.03c-0.01,0.02 -0.03,0.02 -0.05,0.03a1.83,1.83 0,0 0,-0.54 0.27,0.15 0.15,0 0,0 -0.02,0.01c-0.01,0.01 -0.02,0.02 -0.04,0.02a0.11,0.11 0,0 1,-0.04 -0.00l-5.81,-2.47 -0.01,-0.00c-0.03,-0.01 -0.08,-0.03 -0.08,-0.07a2.19,2.19 0,0 0,-0.31 -0.91c-0.02,-0.04 -0.05,-0.09 -0.03,-0.14z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m11.07,7.26 l5.81,-5.81C17.69,0.64 18.1,0.24 18.56,0.09a2,2 0,0 1,1.20 0c0.46,0.14 0.86,0.55 1.67,1.35l1.26,1.26 -4.13,6.40a0.15,0.15 0,0 1,-0.04 0.04c-0.02,0.01 -0.06,0.01 -0.09,0a2.09,2.09 0,0 0,-1.92 0.37c-0.02,0.02 -0.06,0.01 -0.10,-0.00 -0.54,-0.23 -4.74,-2.01 -5.34,-2.26z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m5.68,12.66 l4.49,-4.49c0.42,0.18 1.95,0.83 3.33,1.41 1.04,0.44 1.98,0.84 2.28,0.97 0.03,0.01 0.05,0.02 0.07,0.05 0.00,0.01 0.00,0.04 0,0.06a2.00,2.00 0,0 0,0.52 1.82c0.03,0.03 0,0.07 -0.02,0.11l-0.01,0.02 -4.56,7.06c-0.01,0.02 -0.02,0.03 -0.04,0.05 -0.02,0.01 -0.05,0.00 -0.08,0.00a2.27,2.27 0,0 0,-0.54 -0.07c-0.16,0 -0.34,0.03 -0.52,0.06h-0.00c-0.02,0.00 -0.03,0.00 -0.05,-0.00a0.21,0.21 0,0 1,-0.04 -0.05z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m0,19.06a2,2 0,0 1,0.09 -0.49c0.14,-0.46 0.55,-0.86 1.35,-1.67l3.34,-3.34a2175.52,2175.52 0,0 0,4.62 6.68c0.02,0.03 0.05,0.07 0.02,0.10 -0.14,0.16 -0.29,0.33 -0.39,0.52a0.16,0.16 0,0 1,-0.05 0.06c-0.01,0.00 -0.02,0.00 -0.04,0.00H8.94L0,19.06Z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m4.05,24.05 l-2.61,-2.61c-0.44,-0.44 -0.76,-0.76 -0.99,-1.04l7.93,1.64a0.84,0.84 0,0 0,0.03 0.00c0.04,0.00 0.10,0.01 0.10,0.06 0,0.05 -0.05,0.07 -0.10,0.09l-0.02,0.01z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m7.03,27.03 l-2.06,-2.06 4.07,-1.73a0.08,0.08 0,0 1,0.03 -0.00c0.03,0 0.05,0.03 0.07,0.06a2.91,2.91 0,0 0,0.13 0.18l0.01,0.01c0.01,0.01 0.00,0.03 -0.00,0.05l-2.25,3.49z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m21.11,37.22c-0.59,0.59 -0.94,0.90 -1.34,1.03a2,2 0,0 1,-1.20 0c-0.46,-0.14 -0.86,-0.55 -1.67,-1.35l-8.99,-8.99 2.34,-3.64c0.01,-0.01 0.02,-0.03 0.04,-0.04 0.02,-0.01 0.06,-0.01 0.09,0a2.43,2.43 0,0 0,1.63 -0.08c0.02,-0.01 0.05,-0.01 0.07,0.00a0.19,0.19 0,0 1,0.02 0.03l8.99,13.05z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m22.81,35.52 l-0.81,0.81 -8.95,-12.94a0.42,0.42 0,0 0,-0.01 -0.01c-0.01,-0.01 -0.02,-0.03 -0.02,-0.06 0.00,-0.01 0.01,-0.03 0.02,-0.04l0.01,-0.01c0.02,-0.04 0.05,-0.08 0.07,-0.12l0.02,-0.03 0.00,-0.00c0.01,-0.02 0.02,-0.04 0.05,-0.06 0.02,-0.01 0.05,-0.00 0.07,-0.00l9.92,2.04a0.16,0.16 0,0 1,0.07 0.03c0.01,0.01 0.01,0.02 0.01,0.04a1.75,1.75 0,0 0,1.02 1.17c0.02,0.01 0.01,0.04 0.00,0.07a0.23,0.23 0,0 0,-0.01 0.04c-0.12,0.76 -1.19,7.29 -1.48,9.06z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m31.51,26.82 l-7.18,7.18 1.23,-7.56 0.00,-0.01c0.00,-0.01 0.00,-0.02 0.00,-0.02 0.01,-0.02 0.03,-0.03 0.06,-0.04l0.01,-0.00a1.85,1.85 0,0 0,0.69 -0.51c0.02,-0.02 0.05,-0.05 0.09,-0.06a0.09,0.09 0,0 1,0.02 0l5.06,1.04z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m38.14,20.02c-0.2,0.37 -0.59,0.76 -1.25,1.42l-4.37,4.36 -5.65,-1.17 -0.03,-0.00c-0.05,-0.00 -0.10,-0.01 -0.10,-0.06a1.70,1.70 0,0 0,-0.65 -1.19c-0.02,-0.02 -0.01,-0.05 -0.01,-0.09 0,-0.00 0,-0.01 0.00,-0.01l1.06,-6.52 0.00,-0.02c0.00,-0.05 0.01,-0.10 0.06,-0.10a1.73,1.73 0,0 0,1.16 -0.66c0.00,-0.01 0.01,-0.02 0.02,-0.02 0.03,-0.01 0.07,0 0.10,0.01l9.65,4.08z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m33.01,13.01 l3.87,3.87c0.80,0.80 1.20,1.20 1.35,1.67 0.02,0.06 0.04,0.13 0.05,0.20l-9.26,-3.92a0.72,0.72 0,0 0,-0.01 -0.00c-0.03,-0.01 -0.08,-0.03 -0.08,-0.07 0,-0.03 0.04,-0.05 0.08,-0.07l0.01,-0.00z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m27.75,13.30 l-0.01,-0.00c-0.00,-0.00 -0.01,-0.00 -0.02,-0.01a0.11,0.11 0,0 1,-0.02 -0.09l0.77,-4.72 3.62,3.62 -3.77,1.60a0.08,0.08 0,0 1,-0.03 0.00h-0.01c-0.00,-0.00 -0.01,-0.00 -0.02,-0.01a1.71,1.71 0,0 0,-0.49 -0.38z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:gradientRadius="38.34"
|
||||
android:centerX="19.15"
|
||||
android:centerY="1.471E-8"
|
||||
android:type="radial">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF20C6B7" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF4D9ABF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</vector>
|
61
app/src/main/res/drawable/thumb_nextdns.xml
Normal file
61
app/src/main/res/drawable/thumb_nextdns.xml
Normal file
|
@ -0,0 +1,61 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="172.86dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="172.86"
|
||||
android:viewportHeight="200.00">
|
||||
<path
|
||||
android:pathData="m82.73,7.64 l-18.55,12.50 -23.13,9.17 -27.09,8.96 -9.17,8.12 4.16,40.85 11.46,33.76 16.25,29.38c0,0 20.21,21.25 20.42,21.88 0.20,0.62 18.96,15.98 18.96,15.98l12.08,4.44 34.18,-27.09 33.97,-53.03 5.90,-29.08 4.52,-25.42 -1.66,-15.84L135.25,29.52 106.28,18.89 89.19,7.64Z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path android:pathData="m22.97,54.30c-0.97,31.26 8.20,56.24 19.86,75.14L125.76,46.51C113.28,41.72 98.23,34.73 86.43,25.49 61.79,44.78 22.97,54.30 22.97,54.30Z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startY="27.06"
|
||||
android:startX="34.71"
|
||||
android:endY="148.78"
|
||||
android:endX="133.79"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF009EFF" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF0063FF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m86.43,174.33c0,0 65.99,-38.78 63.46,-120.03 0,0 -4.68,-1.15 -11.83,-3.46L49.54,139.36c17.39,23.51 36.89,34.97 36.89,34.97z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startY="23.09"
|
||||
android:startX="39.59"
|
||||
android:endY="144.81"
|
||||
android:endX="138.67"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF009EFF" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF0063FF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path android:pathData="m172.43,44.52c-0.89,-7.44 -5.36,-8.33 -5.36,-8.33C136.99,30.23 97.67,7.14 94.25,4.02 90.82,0.89 87.96,-0 86.43,-0c-1.52,0 -4.39,0.89 -7.81,4.02 -3.42,3.12 -42.74,26.21 -72.82,32.16 0,0 -4.46,0.89 -5.36,8.33 -0.89,7.44 -6.99,88.60 78.78,151.89 0,0 5.21,3.57 7.22,3.57 2.01,0 7.22,-3.57 7.22,-3.57 85.77,-63.29 79.67,-144.45 78.77,-151.89zM86.43,188.28c0,0 -76.63,-49.18 -75.76,-142.61 0,0 33.97,-4.80 75.76,-33.37 41.79,28.57 75.76,33.37 75.76,33.37 0.86,93.43 -75.76,142.61 -75.76,142.61z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startY="21.26"
|
||||
android:startX="41.84"
|
||||
android:endY="142.97"
|
||||
android:endX="140.92"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:offset="0"
|
||||
android:color="#FF009EFF" />
|
||||
<item
|
||||
android:offset="1"
|
||||
android:color="#FF0063FF" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</vector>
|
90
app/src/main/res/drawable/thumb_peeringdb.xml
Normal file
90
app/src/main/res/drawable/thumb_peeringdb.xml
Normal file
|
@ -0,0 +1,90 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="78.50dp"
|
||||
android:height="100dp"
|
||||
android:viewportWidth="78.50"
|
||||
android:viewportHeight="100">
|
||||
<path android:pathData="M13.72,7.42L38.99,0.24c1.21,-0.34 2.51,-0.31 3.71,0.07L73.92,10.59c2.6,0.85 4.35,3.28 4.35,6.02l0,11.08c0,3.5 -2.83,6.33 -6.33,6.33 -0.46,0 -0.92,-0.05 -1.37,-0.15L42.36,27.60c-0.98,-0.22 -2.01,-0.20 -2.98,0.05L17.07,33.51C13.68,34.40 10.22,32.38 9.33,28.99 9.19,28.47 9.12,27.93 9.12,27.38L9.12,13.51C9.12,10.68 11.00,8.19 13.72,7.42Z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="43.69"
|
||||
android:endY="34.03"
|
||||
android:startX="43.69"
|
||||
android:startY="-3.57E-7"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FFA1B5B8"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF687F82"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<group>
|
||||
<clip-path android:pathData="M13.72,7.42L38.99,0.24c1.21,-0.34 2.51,-0.31 3.71,0.07L73.92,10.59c2.6,0.85 4.35,3.28 4.35,6.02l0,11.08c0,3.5 -2.83,6.33 -6.33,6.33 -0.46,0 -0.92,-0.05 -1.37,-0.15L42.36,27.60c-0.98,-0.22 -2.01,-0.20 -2.98,0.05L17.07,33.51C13.68,34.40 10.22,32.38 9.33,28.99 9.19,28.47 9.12,27.93 9.12,27.38L9.12,13.51C9.12,10.68 11.00,8.19 13.72,7.42Z" />
|
||||
<path
|
||||
android:fillColor="#4b6063"
|
||||
android:pathData="M0.91,-0.34l40.27,0l0,40.21l-40.27,0z" />
|
||||
</group>
|
||||
<path android:pathData="M68.31,43.37L42.71,36.1C41.70,35.81 40.64,35.78 39.62,36.00L4.98,43.59c-2.91,0.63 -4.98,3.21 -4.98,6.19l-0,9.94c-0,3.35 2.61,6.12 5.96,6.32l34.78,2.06c0.28,0.01 0.57,0.01 0.86,-0.00L67.07,66.15C70.37,65.89 72.92,63.14 72.92,59.83L72.92,49.47C72.92,46.63 71.04,44.14 68.31,43.37Z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="2.005"
|
||||
android:endY="67.24"
|
||||
android:startX="36.46"
|
||||
android:startY="1.712"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF656D78"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF040405"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<group>
|
||||
<clip-path android:pathData="M68.31,43.37L42.71,36.1C41.70,35.81 40.64,35.78 39.62,36.00L4.98,43.59c-2.91,0.63 -4.98,3.21 -4.98,6.19l-0,9.94c-0,3.35 2.61,6.12 5.96,6.32l34.78,2.06c0.28,0.01 0.57,0.01 0.86,-0.00L67.07,66.15C70.37,65.89 72.92,63.14 72.92,59.83L72.92,49.47C72.92,46.63 71.04,44.14 68.31,43.37Z" />
|
||||
<path android:pathData="M81.13,35.61l-40.27,0l-0,40.21l40.27,0z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="41.73"
|
||||
android:endY="67.24"
|
||||
android:startX="71.71"
|
||||
android:startY="37.07"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF656D78"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF2F3640"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</group>
|
||||
<path android:pathData="M16.12,74.11L40.26,76.63c0.40,0.04 0.81,0.04 1.21,0.01L71.61,73.99c3.48,-0.30 6.56,2.27 6.87,5.75 0.01,0.18 0.02,0.37 0.02,0.55l0,6.76c0,2.99 -2.09,5.58 -5.02,6.20l-31.18,6.58c-0.94,0.2 -1.91,0.18 -2.85,-0.05L13.92,93.41C11.1,92.70 9.12,90.17 9.12,87.26L9.12,80.42C9.12,76.91 11.96,74.08 15.46,74.08c0.22,0 0.44,0.01 0.65,0.03z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="43.81"
|
||||
android:endY="100"
|
||||
android:startX="43.81"
|
||||
android:startY="73.96"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#FF62AC81"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#FF33744A"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<group>
|
||||
<clip-path android:pathData="M16.12,74.11L40.26,76.63c0.40,0.04 0.81,0.04 1.21,0.01L71.61,73.99c3.48,-0.30 6.56,2.27 6.87,5.75 0.01,0.18 0.02,0.37 0.02,0.55l0,6.76c0,2.99 -2.09,5.58 -5.02,6.20l-31.18,6.58c-0.94,0.2 -1.91,0.18 -2.85,-0.05L13.92,93.41C11.1,92.70 9.12,90.17 9.12,87.26L9.12,80.42C9.12,76.91 11.96,74.08 15.46,74.08c0.22,0 0.44,0.01 0.65,0.03z" />
|
||||
<path
|
||||
android:fillColor="#1c3f28"
|
||||
android:pathData="M-0.28,69.92l40.27,0l0,40.21l-40.27,0z" />
|
||||
</group>
|
||||
</vector>
|
15
app/src/main/res/drawable/thumb_playstation.xml
Normal file
15
app/src/main/res/drawable/thumb_playstation.xml
Normal file
|
@ -0,0 +1,15 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="198dp"
|
||||
android:height="152.81dp"
|
||||
android:viewportWidth="198"
|
||||
android:viewportHeight="152.81">
|
||||
<path
|
||||
android:fillColor="#0072ce"
|
||||
android:pathData="M14.86,130.01C-0.75,125.61 -3.35,116.45 3.76,111.17c6.58,-4.87 17.76,-8.54 17.76,-8.54 0,0 46.24,-16.44 46.24,-16.44 0,0 0,18.74 0,18.74 0,0 -33.27,11.90 -33.27,11.90 -5.87,2.10 -6.78,5.09 -2.00,6.66 4.78,1.56 13.43,1.12 19.32,-0.99 0,0 15.96,-5.79 15.96,-5.79 0,0 0,16.77 0,16.77 -1.01,0.18 -2.14,0.36 -3.18,0.53 -15.96,2.60 -32.97,1.52 -49.72,-4.00z" />
|
||||
<path
|
||||
android:fillColor="#0072ce"
|
||||
android:pathData="m119.11,85.16c0,0 0,-47.75 0,-47.75 0,-5.60 -1.03,-10.77 -6.29,-12.23 -4.03,-1.29 -6.53,2.45 -6.53,8.05 0,0 0,119.58 0,119.58 0,0 -32.25,-10.23 -32.25,-10.23 0,0 0,-142.58 0,-142.58 13.71,2.54 33.68,8.56 44.42,12.18 27.31,9.37 36.57,21.04 36.57,47.34 0,25.63 -15.82,35.34 -35.92,25.63z" />
|
||||
<path
|
||||
android:fillColor="#0072ce"
|
||||
android:pathData="m196.23,116.96c-3.86,4.88 -13.34,8.36 -13.34,8.36 0,0 -70.49,25.32 -70.49,25.32 0,0 0,-18.67 0,-18.67 0,0 51.87,-18.48 51.87,-18.48 5.88,-2.10 6.79,-5.09 2.00,-6.65 -4.77,-1.57 -13.42,-1.12 -19.31,0.99 0,0 -34.56,12.17 -34.56,12.17 0,0 0,-19.37 0,-19.37 0,0 1.99,-0.67 1.99,-0.67 0,0 9.98,-3.53 24.03,-5.09 14.04,-1.54 31.24,0.21 44.74,5.32 15.21,4.80 16.92,11.89 13.06,16.77z" />
|
||||
</vector>
|
12
app/src/main/res/drawable/thumb_plex.xml
Normal file
12
app/src/main/res/drawable/thumb_plex.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:fillColor="#282a2d"
|
||||
android:pathData="M5.85,0L194.14,0A5.85,5.85 0,0 1,200 5.85L200,194.14A5.85,5.85 0,0 1,194.14 200L5.85,200A5.85,5.85 0,0 1,0 194.14L0,5.85A5.85,5.85 0,0 1,5.85 0z" />
|
||||
<path
|
||||
android:fillColor="#e5a00d"
|
||||
android:pathData="M100,27.34H57.81L100,100 57.81,172.65H100L142.18,100Z" />
|
||||
</vector>
|
54
app/src/main/res/drawable/thumb_saxobank.xml
Normal file
54
app/src/main/res/drawable/thumb_saxobank.xml
Normal file
|
@ -0,0 +1,54 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="158.60dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="158.60">
|
||||
<path
|
||||
android:pathData="M68.51,53.93l11.95,0l-6.12,-17.20z"
|
||||
android:fillColor="#031329" />
|
||||
<path
|
||||
android:pathData="m155.97,64.14c8.45,0 11.66,-7.58 11.66,-15.16 0,-7.28 -3.49,-14.86 -11.66,-14.86 -8.16,0 -11.66,7.58 -11.66,14.86 0,7.58 2.91,15.16 11.66,15.16z"
|
||||
android:fillColor="#031329" />
|
||||
<path
|
||||
android:pathData="m73.46,111.95 l-10.49,26.82h5.53l2.33,-6.12h10.78l2.33,6.12h6.12L79.59,111.95ZM72.30,128.57 L76.09,117.49v0l3.79,11.07z"
|
||||
android:fillColor="#031329" />
|
||||
<path
|
||||
android:pathData="M150.14,139.06l5.24,0l0,-12.82l9.62,12.53l7.28,0l-11.66,-14.28l11.07,-12.53l-6.70,0l-9.62,11.66l0,-11.66l-5.24,0z"
|
||||
android:fillColor="#031329" />
|
||||
<path
|
||||
android:pathData="M5.53,93.29H194.75V5.53H5.53Z"
|
||||
android:fillColor="#031329" />
|
||||
<path
|
||||
android:pathData="M112.82,139.06l0,-20.40l0,0l10.20,20.40l6.70,0l0,-27.11l-5.24,0l0,20.11l-10.20,-20.11l-6.70,0l0,27.11z"
|
||||
android:fillColor="#031329" />
|
||||
<path
|
||||
android:pathData="m40.52,125.07v0c3.20,-0.58 5.24,-2.91 5.24,-6.12 0,-5.83 -5.24,-6.99 -8.74,-6.99h-9.32v26.82h9.32c3.49,0 9.32,-1.16 9.32,-7.87 0.29,-3.20 -2.04,-5.53 -5.83,-5.83zM33.23,116.32h2.04c2.33,0 5.24,0.29 5.24,3.49 0,2.91 -2.91,3.20 -5.24,3.20h-2.04zM35.56,134.69h-2.62v-7.87h2.62c2.62,0 5.53,0.58 5.53,4.08 0,3.20 -2.91,3.79 -5.53,3.79z"
|
||||
android:fillColor="#031329" />
|
||||
<path
|
||||
android:pathData="m35.56,126.82h-2.62v7.87h2.62c2.62,0 5.53,-0.58 5.53,-3.79 0,-3.49 -2.62,-4.08 -5.53,-4.08z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path
|
||||
android:pathData="M72.30,128.57l7.87,0l-3.79,-11.07l-0.29,0z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path
|
||||
android:pathData="M0.87,0.87L0.87,157.72L199.12,157.72L199.12,0.87ZM37.02,139.06L27.69,139.06L27.69,112.24h9.32c3.49,0 8.74,1.16 8.74,6.99 0,3.20 -2.04,5.53 -5.24,6.12v0c3.79,0.29 6.12,2.91 6.12,6.12 0,6.41 -6.12,7.58 -9.62,7.58zM83.96,139.06 L81.63,132.65L70.84,132.65l-2.33,6.12h-5.53l10.49,-26.82h6.12l10.49,26.82h-6.12zM129.73,139.06h-6.70l-10.20,-20.11v0,20.11h-5.24L107.58,112.24h6.70l10.20,20.11v0,-20.11h5.24zM165.01,138.77 L155.39,126.23v12.53h-5.24v-26.82h5.24v11.66l9.62,-11.66h6.70l-11.07,12.53 11.66,14.28zM194.46,93.29L5.53,93.29L5.53,5.53L194.75,5.53v87.75z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path
|
||||
android:pathData="m40.52,119.53c0,-3.20 -2.91,-3.49 -5.24,-3.49h-2.04v6.70h2.04c2.33,0 5.24,-0.29 5.24,-3.20z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path
|
||||
android:pathData="m41.98,58.89c0,3.79 -4.37,5.24 -7.28,5.24 -2.62,0 -5.24,-0.58 -7.58,-1.74l-2.62,6.70c4.08,1.16 6.12,1.45 10.78,1.45 8.45,0 15.74,-3.49 15.74,-12.53 0,-13.99 -18.36,-11.07 -18.36,-18.07 0,-4.37 3.79,-5.83 6.41,-5.83 2.33,0 4.66,0.29 6.70,1.16l2.33,-6.12c-2.91,-1.16 -6.41,-1.45 -9.91,-1.45 -7.28,0 -14.57,3.49 -14.57,12.53 0,13.99 18.36,10.78 18.36,18.65z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path
|
||||
android:pathData="M132.07,28.57l-8.74,0l-9.03,14.86l-8.45,-14.86l-9.62,0l12.24,19.82l-13.70,21.57l9.62,0l9.62,-16.03l9.62,16.03l9.62,0l-13.41,-21.57z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path
|
||||
android:pathData="m155.97,70.84c13.12,0 20.40,-9.03 20.40,-21.57 0,-12.53 -7.28,-21.28 -20.40,-21.28 -13.12,0 -20.40,8.45 -20.40,21.28 0,12.82 6.99,21.57 20.40,21.57zM155.97,34.40c8.16,0 11.66,7.58 11.66,14.86 0,7.58 -3.20,15.16 -11.66,15.16 -8.45,0 -11.66,-7.58 -11.66,-15.16 0,-7.28 3.20,-14.86 11.66,-14.86z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path
|
||||
android:pathData="m65.88,60.35h16.91l3.49,9.62 5.53,-9.03 -12.53,-32.36h-9.32l-16.32,41.39h8.45zM74.34,36.73v0l6.12,17.20L68.51,53.93Z"
|
||||
android:fillColor="#FFFFFF" />
|
||||
<path
|
||||
android:pathData="M199.12,0.87L199.12,157.72L0.87,157.72L0.87,0.87l198.25,0M200,0L199.12,0 0.87,0 0,0l0,0.87 0,156.85 0,0.87l0.87,0 198.25,0 0.87,0L200,157.72 200,0.87Z"
|
||||
android:fillColor="#031329" />
|
||||
</vector>
|
12
app/src/main/res/drawable/thumb_selfwealth.xml
Normal file
12
app/src/main/res/drawable/thumb_selfwealth.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="100dp"
|
||||
android:height="48.32dp"
|
||||
android:viewportWidth="99.99"
|
||||
android:viewportHeight="48.32">
|
||||
<path
|
||||
android:pathData="m33.33,23.19c-2.59,-1.69 -5.19,-2.39 -8.09,-3.12 -2.91,-0.75 -5.17,-1.29 -7.01,-1.83 -2.28,-0.58 -4.66,-1.27 -6.25,-2.91 -0.79,-1.59 -0.54,-3.15 0.10,-4.63 0.43,-0.64 0.97,-1.18 1.61,-1.61 2.65,-1.28 5.55,-1.27 8.19,-0.75 2.01,0.43 3.95,1.51 4.74,3.23 0.53,0.86 0.75,2.04 0.86,3.45h9.81c0,-2.69 -0.53,-4.96 -1.51,-6.79C34.84,6.36 33.44,4.74 31.71,3.55 27.72,1.09 23.23,0.01 18.87,0 16.82,0 14.77,0.32 12.62,0.86 8.59,2.05 5.07,4.37 3.12,7.76 2.04,9.49 1.51,11.65 1.51,14.02c0.08,3.72 1.56,6.96 4.31,9.06 2.92,2.07 6.28,3.18 9.49,3.99 1.72,0.43 3.34,0.86 4.96,1.29 2.67,0.80 5.60,1.43 7.55,3.34 0.75,0.75 1.18,1.83 1.18,3.02 -0.03,2.32 -1.43,3.67 -3.12,4.74 -1.90,0.89 -3.84,1.00 -5.82,1.07 -2.58,-0.05 -5.10,-0.45 -7.11,-1.94 -0.86,-0.64 -1.61,-1.51 -2.26,-2.58 -0.64,-1.07 -0.86,-2.37 -0.86,-3.99H0c0,2.80 0.43,5.28 1.51,7.33 1.07,2.04 2.48,3.77 4.31,5.07 1.83,1.29 3.99,2.26 6.36,2.91 2.37,0.64 4.85,0.97 7.44,0.97 3.12,0 5.93,-0.32 8.30,-1.07 2.37,-0.75 4.42,-1.72 6.04,-3.02 1.61,-1.29 2.80,-2.91 3.66,-4.63 0.86,-1.83 1.18,-3.77 1.18,-5.93 0,-2.58 -0.53,-4.74 -1.61,-6.36 -1.07,-1.72 -2.37,-3.02 -3.88,-4.09z"
|
||||
android:fillColor="#434c4d" />
|
||||
<path
|
||||
android:pathData="M89.96,1.07 L82.41,32.90H82.30L74.43,1.07H64.83L56.85,32.57H56.74L49.40,1.07H39.26l12.18,46.27h10.35l7.65,-31.49h0.10l7.87,31.49H87.48L100,1.07Z"
|
||||
android:fillColor="#7ab800" />
|
||||
</vector>
|
43
app/src/main/res/drawable/thumb_simple_login.xml
Normal file
43
app/src/main/res/drawable/thumb_simple_login.xml
Normal file
|
@ -0,0 +1,43 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="164.43dp"
|
||||
android:height="121.48dp"
|
||||
android:viewportWidth="164.43"
|
||||
android:viewportHeight="121.48">
|
||||
<path android:pathData="m75.28,51.62a70.21,70.21 0,0 1,-30.58 -17.43,70.25 70.25,0 0,1 -30.74,17.48 49.77,49.77 0,0 0,-0.88 9.35,49.74 49.74,0 0,0 30.93,45.84 49.54,49.54 0,0 0,32.08 -46.3,49.91 49.91,0 0,0 -0.80,-8.94zM42.38,88.22h-0.01l-18.85,-18.85 5.8,-5.81 13.07,13.07 20.44,-20.44 5.80,5.8zM75.28,51.62a70.21,70.21 0,0 1,-30.58 -17.43,70.25 70.25,0 0,1 -30.74,17.48 49.77,49.77 0,0 0,-0.88 9.35,49.74 49.74,0 0,0 30.93,45.84 49.54,49.54 0,0 0,32.08 -46.3,49.91 49.91,0 0,0 -0.80,-8.94zM42.38,88.22h-0.01l-18.85,-18.85 5.8,-5.81 13.07,13.07 20.44,-20.44 5.80,5.8zM44.7,34.18a70.25,70.25 0,0 1,-30.74 17.48,49.77 49.77,0 0,0 -0.88,9.35 49.74,49.74 0,0 0,30.93 45.84,49.54 49.54,0 0,0 32.08,-46.3 49.91,49.91 0,0 0,-0.80 -8.94,70.21 70.21,0 0,1 -30.58,-17.44zM42.38,88.22h-0.01l-18.85,-18.85 5.8,-5.81 13.07,13.07 20.44,-20.44 5.80,5.8zM75.28,51.62a70.21,70.21 0,0 1,-30.58 -17.43,70.25 70.25,0 0,1 -30.74,17.48 49.77,49.77 0,0 0,-0.88 9.35,49.74 49.74,0 0,0 30.93,45.84 49.54,49.54 0,0 0,32.08 -46.3,49.91 49.91,0 0,0 -0.80,-8.94zM42.38,88.22h-0.01l-18.85,-18.85 5.8,-5.81 13.07,13.07 20.44,-20.44 5.80,5.8zM75.28,51.62a70.21,70.21 0,0 1,-30.58 -17.43,70.25 70.25,0 0,1 -30.74,17.48 49.77,49.77 0,0 0,-0.88 9.35,49.74 49.74,0 0,0 30.93,45.84 49.54,49.54 0,0 0,32.08 -46.3,49.91 49.91,0 0,0 -0.80,-8.94zM42.38,88.22h-0.01l-18.85,-18.85 5.8,-5.81 13.07,13.07 20.44,-20.44 5.80,5.8z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="76"
|
||||
android:endY="82.50"
|
||||
android:startX="13"
|
||||
android:startY="82.50"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#e3156a"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#91187f"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
|
||||
</path>
|
||||
<path android:pathData="m162.57,6.06a13.03,13.03 0,0 0,-1.9 -2.38c-0.22,-0.22 -0.45,-0.43 -0.7,-0.64a12.57,12.57 0,0 0,-7.48 -3.04h-95.88a12.57,12.57 0,0 0,-7.48 3.04,6.58 6.58,0 0,0 -0.68,0.64 12.31,12.31 0,0 0,-1.9 2.37,12.68 12.68,0 0,0 -1.87,6.66v5l-1.58,1.63 -0.27,0.29a82.04,82.04 0,0 1,-38.15 22.35c-0.36,0.1 -0.73,0.2 -1.11,0.29l-1.61,0.4 -0.35,1.62c-0.12,0.58 -0.24,1.18 -0.36,1.77a67.17,67.17 0,0 0,-1.19 12.61,66.47 66.47,0 0,0 12.03,38.27 66.73,66.73 0,0 0,27.90 22.95c0.96,0.42 1.92,0.82 2.91,1.20l0.92,0.35 0.93,-0.34c1.26,-0.44 2.51,-0.94 3.75,-1.46a66.93,66.93 0,0 0,31.87 -28.44h71.36a12.62,12.62 0,0 0,8.22 -3.03c0.25,-0.21 0.48,-0.42 0.72,-0.66a13.24,13.24 0,0 0,1.9 -2.38,12.65 12.65,0 0,0 1.87,-6.65v-65.8a12.74,12.74 0,0 0,-1.86 -6.64zM56.71,6.07c0.22,-0.01 0.44,-0.02 0.67,-0.02h94.33c0.22,0 0.45,0.00 0.67,0.02h1l-0.16,0.14 -46.69,41.31a2.98,2.98 0,0 1,-3.94 0l-46.69,-41.31 -0.16,-0.14zM50.74,12.71a6.50,6.50 0,0 1,0.49 -2.51l40.03,35.43 -2.85,2.52q-0.21,-1.47 -0.51,-2.93c-0.05,-0.31 -0.10,-0.61 -0.17,-0.93l-0.34,-1.63 -1.62,-0.4c-0.39,-0.1 -0.78,-0.2 -1.17,-0.3a82.21,82.21 0,0 1,-33.83 -18.36zM43.86,115.76a61.95,61.95 0,0 1,-38.5 -57.07,61.87 61.87,0 0,1 1.10,-11.63 87.3,87.3 0,0 0,38.25 -21.76,87.31 87.31,0 0,0 38.06,21.71 61.8,61.8 0,0 1,1.01 11.13,61.67 61.67,0 0,1 -39.93,57.62zM83.42,85.16a66.55,66.55 0,0 0,5.73 -27.02c0,-0.83 -0.01,-1.65 -0.05,-2.49l6.73,-5.96 6.74,5.96a2.98,2.98 0,0 0,3.94 0l6.74,-5.96 39.92,35.31 0.18,0.17zM158.37,78.51a6.52,6.52 0,0 1,-0.49 2.50l-40,-35.38 40.01,-35.40a6.56,6.56 0,0 1,0.48 2.49z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="164.43"
|
||||
android:endY="82.50"
|
||||
android:startX="-0.00"
|
||||
android:startY="82.50"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#e3156a"
|
||||
android:offset="0" />
|
||||
<item
|
||||
android:color="#91187f"
|
||||
android:offset="1" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
|
||||
</path>
|
||||
</vector>
|
21
app/src/main/res/drawable/thumb_sogo.xml
Normal file
21
app/src/main/res/drawable/thumb_sogo.xml
Normal file
|
@ -0,0 +1,21 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="109.37dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="109.37">
|
||||
<path
|
||||
android:fillColor="#50bd37"
|
||||
android:pathData="M125.22,17.44C111.01,17.44 100.92,27.73 100.92,41.55C100.92,50.89 105.53,58.61 112.91,62.64C112.81,62.73 112.71,62.84 112.62,62.94C110.72,65.03 109.74,67.70 109.74,70.41C109.73,71.61 109.93,72.83 110.35,74.00C109.40,74.61 108.26,75.45 107.09,76.55C104.26,79.18 101.23,83.59 101.14,89.70C101.14,89.85 101.14,89.96 101.14,90.05C101.14,93.20 101.88,96.04 103.16,98.42C105.07,102.00 108.06,104.50 111.14,106.16C114.24,107.83 117.47,108.71 120.29,109.06C121.97,109.26 123.67,109.37 125.37,109.37C130.10,109.36 134.83,108.56 138.93,106.55C143.02,104.57 146.54,101.16 148.06,96.37C148.51,94.95 148.75,93.34 148.76,91.55C148.75,87.93 147.71,83.50 144.45,79.85C141.20,76.18 135.81,73.73 128.43,73.77C126.82,73.77 125.11,73.88 123.29,74.10C122.71,74.18 122.17,74.21 121.68,74.21C119.42,74.2 118.28,73.57 117.60,72.93C116.94,72.28 116.60,71.42 116.6,70.41C116.59,69.39 117.00,68.31 117.68,67.58C118.38,66.85 119.24,66.35 120.76,66.33C120.89,66.33 121.04,66.34 121.18,66.35C122.15,66.42 123.1,66.45 124.01,66.45C131.57,66.47 137.25,64.12 141.12,60.90C145.00,57.68 147.05,53.76 148.02,50.67L148.01,50.66C149.06,47.88 149.63,44.81 149.63,41.55C149.63,27.73 139.53,17.44 125.22,17.44zM125.22,23.32C135.91,23.32 142.57,31.26 142.57,41.55C142.57,46.92 140.75,51.65 137.5,54.94C137.25,55.17 137.01,55.40 136.75,55.62C136.40,55.94 136.00,56.28 135.54,56.62C132.78,58.62 129.30,59.77 125.22,59.77C114.64,59.77 107.97,51.84 107.97,41.55C107.97,31.26 114.64,23.32 125.22,23.32zM114.78,79.34C116.68,80.47 119.05,81.08 121.68,81.07C122.47,81.07 123.29,81.02 124.13,80.91C125.70,80.72 127.13,80.63 128.43,80.63C134.44,80.66 137.50,82.41 139.35,84.43C141.19,86.46 141.90,89.21 141.89,91.55C141.90,92.67 141.72,93.68 141.53,94.28C140.61,97.07 138.75,98.97 135.90,100.4C133.08,101.80 129.31,102.51 125.37,102.51C123.96,102.51 122.52,102.42 121.11,102.25C118.43,101.94 114.89,100.79 112.32,98.78C111.02,97.78 109.96,96.60 109.21,95.19C108.47,93.78 108.00,92.15 108.00,90.05L108.00,89.82C108.08,85.96 109.85,83.40 111.79,81.54C112.75,80.63 113.74,79.96 114.46,79.53C114.57,79.46 114.68,79.40 114.78,79.34z" />
|
||||
<path
|
||||
android:fillColor="#50bd37"
|
||||
android:pathData="m68.67,17.60c-14.21,0 -24.30,10.28 -24.30,24.10 0,13.81 10.09,24.10 24.30,24.10 14.30,0 24.40,-10.29 24.40,-24.10 0,-13.82 -10.09,-24.10 -24.40,-24.10zM68.67,23.48c10.68,0 17.34,7.93 17.34,18.23 0,10.29 -6.66,18.22 -17.34,18.22 -10.58,0 -17.25,-7.93 -17.25,-18.22 0,-10.29 6.66,-18.23 17.25,-18.23z" />
|
||||
<path
|
||||
android:fillColor="#50bd37"
|
||||
android:pathData="M24.82,39.19 L18.26,37.62c-5.97,-1.37 -9.01,-2.94 -9.01,-7.25 0,-4.90 4.99,-6.86 9.50,-6.86 4.58,0 7.93,2.29 9.90,5.85 0.00,0.01 0.01,0.03 0.02,0.04 0.04,0.07 0.08,0.15 0.12,0.22l0.00,-0.00c0.62,0.93 1.66,1.56 2.78,1.56 1.91,0 3.29,-1.38 3.29,-3.29 0,-0.73 -0.15,-1.50 -0.5,-2.09 -3.36,-5.71 -8.91,-8.18 -15.26,-8.18 -8.62,0 -16.95,4.31 -16.95,13.81 0,8.72 8.62,11.27 11.76,12.05l6.27,1.47c4.80,1.17 8.72,2.74 8.72,7.34 0,5.29 -5.48,7.64 -10.78,7.64 -5.38,0 -9.38,-2.75 -12.13,-6.82h-0.00c-0.61,-0.89 -1.55,-1.51 -2.71,-1.51 -1.87,0 -3.37,1.53 -3.30,3.40 0.03,0.76 0.28,1.40 0.67,1.96 4.30,6.44 10.54,8.85 17.48,8.85 8.92,0 17.83,-4.11 17.83,-14.11 0,-6.46 -4.80,-11.07 -11.17,-12.54z" />
|
||||
<path
|
||||
android:fillColor="#50bd37"
|
||||
android:pathData="M178.04,0C165.25,0 156.16,9.35 156.16,21.92C156.16,34.47 165.25,43.83 178.04,43.83C190.91,43.83 200,34.47 200,21.92C200,9.35 190.91,0 178.04,0zM178.05,5.91C187.45,5.91 194.08,12.74 194.08,21.92C194.08,31.09 187.45,37.92 178.05,37.92C168.71,37.92 162.07,31.09 162.07,21.92C162.07,12.74 168.71,5.91 178.05,5.91z" />
|
||||
<path
|
||||
android:fillColor="#50bd37"
|
||||
android:pathData="M178.06,11.37C171.90,11.37 167.53,15.87 167.53,21.92C167.53,27.96 171.90,32.45 178.06,32.45C184.25,32.45 188.62,27.96 188.62,21.92C188.62,15.87 184.25,11.37 178.06,11.37zM178.07,16.59C181.20,16.59 183.41,18.86 183.41,21.92C183.41,24.97 181.20,27.24 178.07,27.24C174.96,27.24 172.75,24.97 172.75,21.92C172.75,18.86 174.96,16.59 178.07,16.59z" />
|
||||
</vector>
|
36
app/src/main/res/drawable/thumb_sumologic.xml
Normal file
36
app/src/main/res/drawable/thumb_sumologic.xml
Normal file
|
@ -0,0 +1,36 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="37.24dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="37.24">
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="m155.13,7.55c-3.95,0 -7.14,2.42 -8.53,6.27v8.63c1.35,3.84 4.54,6.24 8.53,6.24 2.67,0 4.68,-0.90 6.10,-2.67v1.66c0,3.46 -2.01,5.09 -5.13,5.09 -2.32,0 -4.23,-0.69 -7.28,-2.49l-2.60,3.84c2.94,1.97 6.41,3.05 9.95,3.08 5.89,0 10.22,-3.15 10.22,-9.05L166.40,8.25h-4.88L161.51,10.57C160.16,8.56 158.04,7.55 155.13,7.55ZM156.31,12.06c2.11,0 3.74,1.21 4.54,3.19v5.72c-0.79,1.97 -2.46,3.22 -4.54,3.22 -2.08,0 -3.74,-1.21 -4.54,-3.22v-5.72c0.79,-1.97 2.42,-3.19 4.54,-3.19z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="m132.83,7.52c-4.82,0 -8.59,2.60 -10.15,6.76v8.80c1.56,4.16 5.33,6.76 10.15,6.76 4.82,0 8.56,-2.60 10.09,-6.72v-8.87c-1.52,-4.12 -5.30,-6.72 -10.09,-6.72zM132.83,12.03c2.39,0 4.09,1.35 4.92,3.57v6.17c-0.83,2.21 -2.60,3.53 -4.92,3.53 -2.32,0 -4.16,-1.31 -4.99,-3.53v-6.17c0.83,-2.21 2.60,-3.57 4.99,-3.57z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="m89.70,7.52c-4.82,0 -8.59,2.60 -10.15,6.76v8.80c1.52,4.16 5.33,6.76 10.15,6.76 4.82,0 8.56,-2.60 10.09,-6.72L99.79,14.25C98.23,10.12 94.45,7.52 89.70,7.52ZM89.66,12.03c2.35,0 4.09,1.35 4.92,3.57l0.03,6.17c-0.83,2.21 -2.60,3.53 -4.95,3.53 -2.32,0 -4.16,-1.31 -4.99,-3.53v-6.17c0.83,-2.21 2.60,-3.57 4.99,-3.57z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="M10.99,16.29C9.53,15.98 8.49,15.70 7.90,15.56 7.17,15.36 6.62,15.08 6.34,14.70v-1.59c0.48,-0.76 1.66,-1.24 3.29,-1.24 2.25,0 3.81,0.52 6.27,2.46l2.87,-3.46C15.88,8.42 13.38,7.55 9.77,7.55c-4.16,0 -7.03,1.69 -8.18,4.12v5.27c0.90,1.76 2.98,2.77 7.14,3.67 1.49,0.34 2.49,0.58 3.08,0.69 0.76,0.24 1.45,0.55 1.83,1.11v1.83c-0.52,0.83 -1.76,1.28 -3.39,1.28C9.08,25.58 7.94,25.34 6.86,24.89 5.82,24.48 4.61,23.68 3.08,22.43L0,25.86c3.32,2.94 6.13,3.95 10.12,3.95 4.26,0 7.28,-1.63 8.42,-4.23V20.28C17.58,18.30 15.25,17.26 10.99,16.29Z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="m196.46,22.05c-2.18,2.32 -3.67,3.22 -5.68,3.22 -2.39,0 -4.09,-1.38 -4.85,-3.53v-6.10c0.79,-2.18 2.49,-3.57 4.92,-3.57 1.76,0 3.19,0.62 5.44,2.73l3.32,-3.29c-2.67,-2.91 -5.27,-3.98 -8.77,-3.98 -4.88,0 -8.66,2.56 -10.16,6.86v8.59c1.45,4.3 5.16,6.83 10.02,6.83 3.77,0 6.38,-1.24 9.29,-4.85z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="m171.01,5.09h5.51V0h-5.51z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="M176.45,29.19H171.11V8.25h5.34z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="m118.55,29.19h-5.34V0.06h5.34z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="m75.69,14.56v14.63h-5.34V16.15c0,-2.49 -1.00,-4.02 -3.32,-4.02 -2.32,0 -3.67,1.73 -3.67,4.16v12.89h-5.34V16.15c0,-2.67 -1.11,-4.02 -3.32,-4.02 -2.35,0 -3.67,1.73 -3.67,4.16V29.19H45.66V8.25h4.95v2.32c1.21,-2.01 3.22,-3.01 5.96,-3.01 2.67,0 4.68,1.11 5.82,3.08 1.42,-2.04 3.53,-3.08 6.27,-3.08 4.47,0 7.00,2.67 7.00,7.00z" />
|
||||
<path
|
||||
android:fillColor="#000099"
|
||||
android:pathData="m41.01,8.25v20.94h-4.88v-2.21c-1.11,1.80 -3.15,2.84 -6.13,2.84 -4.95,0 -7.42,-2.56 -7.42,-6.65V8.25h5.34v13.48c0,2.18 1.17,3.46 3.46,3.46 2.67,0 4.3,-1.52 4.3,-4.33V8.25Z" />
|
||||
</vector>
|
15
app/src/main/res/drawable/thumb_t_mobile.xml
Normal file
15
app/src/main/res/drawable/thumb_t_mobile.xml
Normal file
|
@ -0,0 +1,15 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="23.16dp"
|
||||
android:height="28.23dp"
|
||||
android:viewportWidth="23.16"
|
||||
android:viewportHeight="28.23">
|
||||
<path
|
||||
android:fillColor="#e20074"
|
||||
android:pathData="m0.28,0 l-0.28,9.96 1.50,0.26q0.41,-4.40 2.31,-6.53c1.32,-1.48 3.15,-2.26 5.51,-2.33v20.84c0,1.82 -0.26,3.00 -0.79,3.55 -0.45,0.46 -1.21,0.74 -2.29,0.85q-0.47,0.03 -1.63,0.03v1.58h13.94v-1.58c-0.77,0 -1.32,0 -1.63,-0.03C15.83,26.50 15.05,26.22 14.62,25.75 14.09,25.21 13.82,24.02 13.82,22.20L13.82,1.35c2.35,0.06 4.18,0.84 5.51,2.33q1.89,2.13 2.31,6.53L23.15,9.95 22.87,0Z" />
|
||||
<path
|
||||
android:fillColor="#e20074"
|
||||
android:pathData="M20.20,12.99l-2.75,0l0,5.72l5.71,0l0,-5.72z" />
|
||||
<path
|
||||
android:fillColor="#e20074"
|
||||
android:pathData="M5.72,18.71l0,-5.72l-2.82,0l-2.89,0l0,5.72z" />
|
||||
</vector>
|
66
app/src/main/res/drawable/thumb_tesla_motors.xml
Normal file
66
app/src/main/res/drawable/thumb_tesla_motors.xml
Normal file
|
@ -0,0 +1,66 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="154.62dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="154.62"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m132.10,187.81v12.15h3.89v-8.09h14.19v8.09h3.89v-12.13l-21.98,-0.02" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m135.56,183.88h14.99c2.08,-0.41 3.63,-2.25 4.06,-4.03h-23.12c0.43,1.77 2.00,3.61 4.06,4.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m120.29,199.98c1.96,-0.83 3.02,-2.27 3.42,-3.96l-17.48,0l0.01,-16.15 -3.92,0.01l0,20.10l17.96,0" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m73.17,183.83l13.84,0c2.08,-0.60 3.84,-2.19 4.26,-3.96l-21.99,0l0,11.88l18.00,0l0,4.17l-14.12,0.01c-2.21,0.61 -4.08,2.10 -5.02,4.06l1.14,-0.02l21.87,0l0,-12.17l-17.98,0l0,-3.97" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m38.99,183.86h14.98c2.08,-0.41 3.63,-2.25 4.06,-4.03H34.92c0.43,1.78 2.00,3.61 4.06,4.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m38.99,191.81h14.98c2.08,-0.41 3.63,-2.24 4.06,-4.03H34.92c0.43,1.78 2.00,3.61 4.06,4.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m38.99,199.98h14.98c2.08,-0.41 3.63,-2.25 4.06,-4.03H34.92c0.43,1.77 2.00,3.61 4.06,4.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m0,179.88c0.45,1.75 1.97,3.55 4.06,4.00l6.30,0l0.32,0.12l0,15.92l3.94,0L14.63,184.01l0.35,-0.12l6.31,0c2.11,-0.54 3.6,-2.24 4.04,-4.00l0,-0.03L0,179.84l0,0.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="M77.32,140.10 L97.00,29.39c18.76,0 24.68,2.05 25.53,10.45 0,0 12.58,-4.69 18.93,-14.22C116.70,14.15 91.81,13.63 91.81,13.63l-14.52,17.69 0.03,-0.00 -14.52,-17.69c0,0 -24.89,0.51 -49.66,11.99 6.34,9.53 18.93,14.22 18.93,14.22 0.86,-8.39 6.77,-10.45 25.40,-10.46l19.84,110.72" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m77.31,8.52c20.02,-0.15 42.94,3.09 66.41,13.32 3.13,-5.64 3.94,-8.14 3.94,-8.14C122.01,3.56 97.99,0.08 77.31,0 56.62,0.08 32.60,3.56 6.96,13.70c0,0 1.14,3.07 3.94,8.14C34.36,11.62 57.28,8.37 77.31,8.52h0.00" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m132.10,187.81v12.15h3.89v-8.09h14.19v8.09h3.89v-12.13l-21.98,-0.02" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m135.56,183.88h14.99c2.08,-0.41 3.63,-2.25 4.06,-4.03h-23.12c0.43,1.77 2.00,3.61 4.06,4.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m120.29,199.98c1.96,-0.83 3.02,-2.27 3.42,-3.96l-17.48,0l0.01,-16.15 -3.92,0.01l0,20.10l17.96,0" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m73.17,183.83l13.84,0c2.08,-0.60 3.84,-2.19 4.26,-3.96l-21.99,0l0,11.88l18.00,0l0,4.17l-14.12,0.01c-2.21,0.61 -4.08,2.10 -5.02,4.06l1.14,-0.02l21.87,0l0,-12.17l-17.98,0l0,-3.97" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m38.99,183.86h14.98c2.08,-0.41 3.63,-2.25 4.06,-4.03H34.92c0.43,1.78 2.00,3.61 4.06,4.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m38.99,191.81h14.98c2.08,-0.41 3.63,-2.24 4.06,-4.03H34.92c0.43,1.78 2.00,3.61 4.06,4.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m38.99,199.98h14.98c2.08,-0.41 3.63,-2.25 4.06,-4.03H34.92c0.43,1.77 2.00,3.61 4.06,4.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m0,179.88c0.45,1.75 1.97,3.55 4.06,4.00l6.30,0l0.32,0.12l0,15.92l3.94,0L14.63,184.01l0.35,-0.12l6.31,0c2.11,-0.54 3.6,-2.24 4.04,-4.00l0,-0.03L0,179.84l0,0.03" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="M77.32,140.10 L97.00,29.39c18.76,0 24.68,2.05 25.53,10.45 0,0 12.58,-4.69 18.93,-14.22C116.70,14.15 91.81,13.63 91.81,13.63l-14.52,17.69 0.03,-0.00 -14.52,-17.69c0,0 -24.89,0.51 -49.66,11.99 6.34,9.53 18.93,14.22 18.93,14.22 0.86,-8.39 6.77,-10.45 25.40,-10.46l19.84,110.72" />
|
||||
<path
|
||||
android:fillColor="#e82127"
|
||||
android:pathData="m77.31,8.52c20.02,-0.15 42.94,3.09 66.41,13.32 3.13,-5.64 3.94,-8.14 3.94,-8.14C122.01,3.56 97.99,0.08 77.31,0 56.62,0.08 32.60,3.56 6.96,13.70c0,0 1.14,3.07 3.94,8.14C34.36,11.62 57.28,8.37 77.31,8.52h0.00" />
|
||||
</vector>
|
33
app/src/main/res/drawable/thumb_tu_berlin.xml
Normal file
33
app/src/main/res/drawable/thumb_tu_berlin.xml
Normal file
|
@ -0,0 +1,33 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="148.71dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="148.71">
|
||||
<path
|
||||
android:fillColor="#c50e1f"
|
||||
android:pathData="m142.65,148.71c11.94,0 20.52,-3.54 27.19,-8.01 6.21,-4.16 11.03,-9.09 14.73,-15.45 4.77,-8.21 6.24,-15.85 6.65,-20.28C191.22,104.92 200,12.60 200,12.60l-44.28,-0.00c0,0 -13.08,136.11 -13.06,136.11" />
|
||||
<path
|
||||
android:fillColor="#c50e1f"
|
||||
android:pathData="m100.75,43.54 l-5.99,62.27c-1.10,14.90 4.48,22.56 7.96,26.59 6.35,7.36 18.02,13.16 31.51,15.57C134.60,144.03 146.22,23.48 146.22,23.46 146.62,17.27 144.82,11.86 140.69,7.14 135.88,1.64 128.76,0 125.81,0L19.94,0.01C11.97,0.01 0,8.09 0,21.42c0,16.47 14.63,22.11 19.67,22.11 2.57,0 81.08,-0.00 81.08,-0.00" />
|
||||
<path
|
||||
android:fillColor="#c50e1f"
|
||||
android:pathData="m39.09,136.19 l39.42,-0.00 8.06,-83.78 -39.42,0.00c0,0 -7.04,72.93 -8.06,83.78v0" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m171.16,86.98c-0.23,2.47 2.48,3.80 5.05,3.80l4.71,0.00c0.28,-0.68 0.44,-1.45 0.54,-2.41 0.25,-2.62 -1.16,-4.42 -5.27,-4.42 -3.06,-0.00 -4.84,0.95 -5.03,3.02zM184.05,88.62c-0.20,2.16 -0.57,3.80 -1.17,5.47l-21.96,-0.01 0.32,-3.30 7.01,0.00c0.88,0.00 2.10,0.09 2.88,0.28l0.00,-0.06c-1.82,-0.80 -2.84,-2.63 -2.62,-4.88 0.35,-3.64 3.11,-5.65 7.71,-5.65 5.27,0.00 8.31,3.06 7.82,8.17" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m172.43,70.92c-0.17,1.85 1.07,3.15 3.16,3.43l0.62,-6.52c-2.14,-0.06 -3.60,1.14 -3.79,3.08zM178.8,64.65 L177.86,74.42c3.45,0.09 5.12,-1.38 5.43,-4.54 0.14,-1.48 -0.01,-3.03 -0.46,-4.42l2.58,-0.42c0.45,1.60 0.64,3.52 0.45,5.44 -0.45,4.73 -3.15,7.35 -8.51,7.35 -4.56,-0.00 -7.77,-2.63 -7.34,-7.08 0.42,-4.39 3.47,-6.21 6.93,-6.21 0.49,0 1.22,0.03 1.85,0.12" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m174.96,52.97c-0.87,3.06 1.09,4.54 5.65,4.55l6.19,0.00 -0.32,3.30 -15.22,-0.01 0.30,-3.15c0.85,0.00 2.19,0.09 3.34,0.31l0.00,-0.06c-1.98,-0.68 -3.73,-2.23 -3.15,-5.10l3.2,0.15" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m187.53,49.99 l-22.36,-0.01 0.31,-3.30 22.36,0.01 -0.31,3.30" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m188.28,42.15 l-15.22,-0.01 0.31,-3.30 15.22,0.01zM170.52,40.47c-0.11,1.17 -1.09,2.13 -2.25,2.13 -1.13,0 -1.95,-0.95 -1.84,-2.13 0.11,-1.14 1.12,-2.1 2.25,-2.1 1.13,0.00 1.95,0.96 1.84,2.10" />
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="m189.96,24.72 l-9.77,-0.00c-1.89,-0.00 -3.08,0.52 -3.25,2.28 -0.22,2.32 2.03,4.02 5.09,4.02l7.32,0.00 -0.31,3.30 -15.22,-0.01 0.30,-3.15c0.82,0.00 2.13,0.06 2.97,0.21l0.00,-0.03c-1.87,-0.89 -3.04,-2.75 -2.79,-5.35 0.33,-3.49 2.64,-4.57 5.31,-4.57l10.66,0.00 -0.31,3.27" />
|
||||
</vector>
|
21
app/src/main/res/drawable/thumb_wildduck.xml
Normal file
21
app/src/main/res/drawable/thumb_wildduck.xml
Normal file
|
@ -0,0 +1,21 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200.15dp"
|
||||
android:height="196.73dp"
|
||||
android:viewportWidth="200.15"
|
||||
android:viewportHeight="196.73">
|
||||
<path
|
||||
android:fillColor="#FF0000"
|
||||
android:pathData="M2.78,78.82C35.86,52 67.81,26.09 99.99,0c32.18,26.09 64.12,51.99 97.22,78.82 -65.19,0 -128.91,0 -194.43,0z" />
|
||||
<path
|
||||
android:fillColor="#FF0000"
|
||||
android:pathData="m2.7,196.73c33.16,-26.88 65.1,-52.78 97.29,-78.88 32.19,26.09 64.13,51.99 97.3,78.88 -65.32,0 -128.95,0 -194.59,0z" />
|
||||
<path
|
||||
android:fillColor="#FF0000"
|
||||
android:pathData="m2.65,82.56c65.58,0 129.16,0 194.66,0 -23.35,18.94 -45.4,36.83 -67.99,55.15 -8.23,-6.67 -16.58,-13.1 -24.5,-20.02 -3.66,-3.19 -6.08,-3.09 -9.68,0.05 -7.78,6.78 -15.97,13.08 -24.44,19.94C48.37,119.6 26.25,101.68 2.65,82.56Z" />
|
||||
<path
|
||||
android:fillColor="#FF0000"
|
||||
android:pathData="m200.15,195.13c-23.17,-18.78 -45.38,-36.78 -68.42,-55.46 22.75,-18.45 45.13,-36.59 68.42,-55.49 0,37.45 0,73.52 0,110.95z" />
|
||||
<path
|
||||
android:fillColor="#FF0000"
|
||||
android:pathData="M68.28,139.65C45.19,158.36 23,176.35 0,194.99 0,158.03 0,121.98 0,84.35c22.94,18.57 45.28,36.67 68.28,55.3z" />
|
||||
</vector>
|
|
@ -66,7 +66,19 @@
|
|||
android:paddingTop="@dimen/activity_margin_xsmall"
|
||||
android:paddingBottom="@dimen/fab_recyclerview_padding"
|
||||
android:clipToPadding="false" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingStart="@dimen/activity_margin_large"
|
||||
android:paddingEnd="@dimen/activity_margin_large"
|
||||
android:clipToPadding="false"
|
||||
android:text="@string/empty_list_view_text"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold"
|
||||
android:gravity="center"
|
||||
tools:visibility="visible"
|
||||
android:visibility="gone"
|
||||
android:id="@+id/emptyListView"/>
|
||||
<include layout="@layout/component_tags" />
|
||||
|
||||
</androidx.drawerlayout.widget.DrawerLayout>
|
||||
|
|
39
app/src/main/res/layout/component_intro_android_sync.xml
Normal file
39
app/src/main/res/layout/component_intro_android_sync.xml
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false">
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top"
|
||||
android:gravity="top"
|
||||
android:padding="@dimen/activity_margin_large" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/settings_title_enable_android_backup_service" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/activity_margin"
|
||||
android:text="@string/intro_slide_android_backup_desc"/>
|
||||
|
||||
<Switch
|
||||
android:id="@+id/introAndroidSync"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/activity_margin"
|
||||
android:checked="true"
|
||||
android:text="@string/settings_toast_android_sync_enabled" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
|
@ -34,12 +34,27 @@
|
|||
<requestFocus/>
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonUnlock"
|
||||
<RelativeLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:text="@string/auth_button_unlock" />
|
||||
android:layout_gravity="end">
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonUnlock"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:text="@string/auth_button_unlock" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/unlockProgress"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
style="?android:attr/progressBarStyle"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignEnd="@id/buttonUnlock"
|
||||
android:visibility="gone"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
|
|
@ -2,222 +2,78 @@
|
|||
<androidx.core.widget.NestedScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/scroll_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:overScrollMode="never"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" >
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/activity_margin"
|
||||
android:paddingEnd="@dimen/activity_margin"
|
||||
android:paddingTop="@dimen/activity_margin"
|
||||
android:textColor="@color/colorAccent"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/backup_category_plain" />
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/activity_margin"
|
||||
android:layout_marginTop="@dimen/activity_margin_large"
|
||||
android:gravity="center_horizontal">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_backup_plain"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:background="?android:attr/selectableItemBackground" >
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
android:text="@string/backup_title_export_plain" />
|
||||
android:textColor="@color/colorAccent"
|
||||
android:textStyle="bold"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Widget.TextView.SpinnerItem"
|
||||
android:text="@string/backup_label_type"/>
|
||||
|
||||
<TextView
|
||||
<Spinner
|
||||
android:id="@+id/backupType"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/backup_desc_export_plain"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_restore_plain"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:background="?android:attr/selectableItemBackground" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
android:text="@string/backup_title_import_plain" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/backup_desc_import_plain"/>
|
||||
android:entries="@array/backup_list_type_names" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:id="@+id/backupLabel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/activity_margin"
|
||||
android:paddingEnd="@dimen/activity_margin"
|
||||
android:paddingTop="@dimen/activity_margin"
|
||||
android:textColor="@color/colorAccent"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/backup_category_crypt" />
|
||||
android:layout_marginTop="@dimen/activity_margin"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:text="@string/backup_label_warning_plain"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/msg_crypt_setup"
|
||||
android:layout_width="match_parent"
|
||||
android:id="@+id/backupErrorLabel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:visibility="gone"
|
||||
android:text="@string/backup_desc_crypt_setup"/>
|
||||
android:textColor="?attr/colorExpiring"
|
||||
android:text="@string/backup_desc_openpgp_provider"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_backup_crypt"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
<Button
|
||||
android:id="@+id/buttonBackup"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:background="?android:attr/selectableItemBackground" >
|
||||
android:text="@string/backup_button_backup"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
android:text="@string/backup_title_export_crypt" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/backup_desc_export_crypt"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_restore_crypt"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
<ProgressBar
|
||||
android:id="@+id/progressBarBackup"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:background="?android:attr/selectableItemBackground" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
android:text="@string/backup_title_import_crypt" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/backup_desc_import_crypt"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_restore_crypt_old"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:background="?android:attr/selectableItemBackground" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
android:text="@string/backup_title_import_crypt_old" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/backup_desc_import_crypt_old"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/activity_margin"
|
||||
android:paddingEnd="@dimen/activity_margin"
|
||||
android:paddingTop="@dimen/activity_margin"
|
||||
android:textColor="@color/colorAccent"
|
||||
android:textStyle="bold"
|
||||
android:text="@string/backup_category_openpgp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/msg_openpgp_setup"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:visibility="gone"
|
||||
android:text="@string/backup_desc_openpgp_provider"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_backup_openpgp"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:background="?android:attr/selectableItemBackground" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
android:text="@string/backup_title_export_openpgp" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/backup_desc_export_openpgp"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_restore_openpgp"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:background="?android:attr/selectableItemBackground" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
android:text="@string/backup_title_import_openpgp" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/backup_desc_import_openpgp"/>
|
||||
|
||||
</LinearLayout>
|
||||
android:layout_marginTop="@dimen/activity_margin"
|
||||
android:indeterminate="true"
|
||||
style="?android:attr/progressBarStyle"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<RelativeLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/activity_margin"
|
||||
android:layout_marginTop="@dimen/activity_margin_large"
|
||||
android:layout_marginBottom="@dimen/activity_margin"
|
||||
android:padding="@dimen/activity_margin"
|
||||
android:background="?android:attr/selectableItemBackground" >
|
||||
|
||||
|
@ -242,7 +98,7 @@
|
|||
|
||||
</LinearLayout>
|
||||
|
||||
<Switch
|
||||
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||
android:id="@+id/backup_replace"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -252,5 +108,30 @@
|
|||
|
||||
</RelativeLayout>
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/restoreOldCrypt"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/activity_margin"
|
||||
android:layout_marginBottom="@dimen/activity_margin"
|
||||
android:text="@string/backup_check_restore_old"
|
||||
android:visibility="gone" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonRestore"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/backup_button_restore" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progressBarRestore"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/activity_margin"
|
||||
android:indeterminate="true"
|
||||
style="?android:attr/progressBarStyle"
|
||||
android:visibility="gone"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
|
@ -8,38 +8,37 @@
|
|||
<string name="about_label_changelog">سِجل التغييرات</string>
|
||||
<string name="about_label_license">الرخصة</string>
|
||||
<string name="about_label_MIT">رخصة MIT</string>
|
||||
<string name="about_label_source">مصدر الرمز</string>
|
||||
<string name="about_label_source">الكود المصدري</string>
|
||||
<string name="about_label_version">الإصدار</string>
|
||||
<string name="about_label_faq">الأسئلة الشائعة</string>
|
||||
<string name="about_label_faq_long">الأسئلة المتداولة</string>
|
||||
<string name="about_label_faq_long">الأسئلة الشائعة</string>
|
||||
<!-- Authors -->
|
||||
<string name="about_title_authors">المؤلفون</string>
|
||||
<string name="about_label_main_developer">المطور الرئيسي</string>
|
||||
<string name="about_label_developer">المطور</string>
|
||||
<string name="about_label_original_author">مؤلف التطبيق الأصلي</string>
|
||||
<string name="about_label_original_app">التطبيق الأصلي</string>
|
||||
<string name="about_label_website">الموقع الإلكتروني</string>
|
||||
<string name="about_label_website">موقع الويب</string>
|
||||
<string name="about_label_donate">التبرع</string>
|
||||
<string name="about_label_contributors">المساهمون</string>
|
||||
<string name="about_label_translators">المترجمون</string>
|
||||
<!-- Thumbnail disclaimer -->
|
||||
<string name="about_title_thumbnail_disclaimer">تحذير على الصور المصغرة</string>
|
||||
<string name="about_thumbnails_disclaimer_no1"><b/>١.<b> جميع الصور المصغرة علامات تجارية
|
||||
تعود لمالكيها الشرعيين.</string>
|
||||
<string name="about_thumbnails_disclaimer_no2"><b/>٢.<b> إستخدام هذه العلامات التجارية لا تشير
|
||||
إلى تسويق andOTP لمالكين هذه العلامات التجارية.</string>
|
||||
<string name="about_thumbnails_disclaimer_no1"><b>١.</b> جميع الصور المصغرة علامات تجارية تعود لمالكيها الشرعيين.</string>
|
||||
<string name="about_thumbnails_disclaimer_no2"><b>٢.</b> إستخدام هذه العلامات التجارية لا تشير
|
||||
إلى تسويق andOTP لمالكين هذه العلامات التجارية، أو العكس.</string>
|
||||
<string name="about_thumbnails_disclaimer_no3"><b/>٣.<b> الصور المصغرة يجب أن تستعمل فقط
|
||||
لتمثيل الشركة أو المنتج التي تشير إليها.</string>
|
||||
<string name="about_thumbnails_disclaimer_no4"><b/>٤. الرجاء عدم استخدام الصور المصغرة لأي سبب عدا تمثيل علامات تجارية معينة.<b></string>
|
||||
<string name="about_thumbnails_disclaimer_no4"><b>٤. الرجاء عدم استخدام الصور المصغرة لأي سبب عدا تمثيل علامات تجارية معينة.</b></string>
|
||||
<!-- Support -->
|
||||
<string name="about_title_support">للمساهمة في تطوير التطبيق</string>
|
||||
<string name="about_desc_support">Find out how you can support the development of andOTP</string>
|
||||
<string name="about_desc_support">اعرف كيف يمكنك دعم تطوير andOTP</string>
|
||||
<string name="about_title_special_features">الميزات الخاصة</string>
|
||||
<string name="about_dialog_special_features">هل أنت متأكد إنك تريد تمكين الميزات الخاصة؟
|
||||
معظمهم خوارزميات OTP غير معتمدة طبقوا على طلب خاص.
|
||||
إنهم ليس <b/>معتمدون رسميا<b> ويمكن أن يأتوا مع <b/>قيود معينة<b>.
|
||||
الرجاء قراءة وفهم صفحة \"Special features\" في GitHub لمزيد من المعلومات.</string>
|
||||
<string name="about_toast_special_features">تم تمكين الميزات الخاصة</string>
|
||||
<string name="about_toast_special_features_enabled">تم تمكين الميزات الخاصة من قبل</string>
|
||||
<string name="about_dialog_special_features">هل أنت متأكد إنك تريد تفعيل الميزات الخاصة؟
|
||||
معظمهم خوارزميات OTP غير معتمدة طُبّقوا بناء على طلب خاص.
|
||||
إنهم <b>ليسوا معتمدين رسميا</b> ويمكن أن يأتوا مع <b>قيود معينة</b>.
|
||||
الرجاء قراءة (وفهم) صفحة \"Special features\" في GitHub لمزيد من المعلومات قبل استخدامهم.</string>
|
||||
<string name="about_toast_special_features">تم تفعيل الميزات الخاصة</string>
|
||||
<string name="about_toast_special_features_enabled">تم تفعيل الميزات الخاصة من قبل</string>
|
||||
<string name="about_toast_copied_to_clipboard">تم نسخ رابط التبرع إلى الحافظة</string>
|
||||
</resources>
|
||||
|
|
|
@ -5,14 +5,14 @@
|
|||
<string name="auth_hint_password">كلمة المرور</string>
|
||||
<string name="auth_hint_pin">رمز PIN</string>
|
||||
<!-- Messages -->
|
||||
<string name="auth_msg_authenticate">الرجاء قم بالمصادقة قبل تشغيل التطبيق!</string>
|
||||
<string name="auth_msg_confirm_encryption">يرجى تأكيد المصادقة لخلق
|
||||
مفتاح التشفير الجديد!</string>
|
||||
<string name="auth_msg_authenticate">الرجاء المصادقة لبدء andOTP!</string>
|
||||
<string name="auth_msg_confirm_encryption">يرجى تأكيد المصادقة لتوليد
|
||||
مفتاح تشفيرك!</string>
|
||||
<!-- Buttons -->
|
||||
<string name="auth_button_unlock">فتح</string>
|
||||
<string name="auth_button_unlock">فتح القفل</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="auth_toast_password_missing">الرجاء تعيين كلمة مرور في <b>الإعدادات</b>!</string>
|
||||
<string name="auth_toast_pin_missing">الرجاء تعيين PIN في <b>الإعدادات</b>!</string>
|
||||
<string name="auth_toast_password_again">كلمة المرور خاطئة، حاول مُجددًا من فضلك!</string>
|
||||
<string name="auth_toast_pin_again">رمز الـ PIN خاطئ، الرجاء إعادة المحاولة من مُجددًا!</string>
|
||||
<string name="auth_toast_password_again">كلمة المرور خاطئة، الرجاء المحاولة مُجددًا!</string>
|
||||
<string name="auth_toast_pin_again">رمز PIN خاطئ، الرجاء المحاولة مُجددًا!</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,63 +1,63 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="backup_activity_title">النُّسَخ الإحتياطية</string>
|
||||
<string name="backup_category_plain">النُّسَخ الإحتياطية نص مجرّد</string>
|
||||
<string name="backup_category_crypt">النُّسَخ الإحتياطية المشفرة</string>
|
||||
<string name="backup_category_openpgp">النُّسَخ الإحتياطية بأوبن بي جي بي</string>
|
||||
<string name="backup_title_export_plain">النسخ الإحتياطي (نص مجرّد)</string>
|
||||
<string name="backup_title_export_crypt">النسخ الاحتياطي (مشفر)</string>
|
||||
<string name="backup_title_export_openpgp">النسخ الاحتياطي (أوبن بي جي بي)</string>
|
||||
<string name="backup_title_import_plain">إسترجاع (نص مجرّد)</string>
|
||||
<string name="backup_title_import_crypt">إسترجاع (مشفّر)</string>
|
||||
<string name="backup_title_import_crypt_old">Restore (encrypted, old encryption)</string>
|
||||
<string name="backup_category_plain">النُسَخ الاحتياطية نص مجرّد</string>
|
||||
<string name="backup_category_crypt">النُسَخ الاحتياطية المشفّرة</string>
|
||||
<string name="backup_category_openpgp">النُسَخ الاحتياطية بأوبن بي جي بي</string>
|
||||
<string name="backup_title_export_plain">نسخ احتياطي (نص مجرّد)</string>
|
||||
<string name="backup_title_export_crypt">نسخ احتياطي (مشفّر)</string>
|
||||
<string name="backup_title_export_openpgp">نسخ احتياطي (أوبن بي جي بي)</string>
|
||||
<string name="backup_title_import_plain">استعادة (نص مجرّد)</string>
|
||||
<string name="backup_title_import_crypt">استعادة (مشفّر)</string>
|
||||
<string name="backup_title_import_crypt_old">استعادة (مشفّر، التشفير القديم)</string>
|
||||
<string name="backup_title_import_openpgp">إسترجاع (أوبن بي جي بي)</string>
|
||||
<string name="backup_title_replace">إستبدال البيانات الموجودة</string>
|
||||
<string name="backup_desc_export_plain">أنسخ إحتياطيا لكافة الحسابات في ملف JSON نص مُجرَّد </string>
|
||||
<string name="backup_desc_export_crypt">أنسخ إحتياطيا كافة الحسابات على شكل نص مُجرَّد مُؤمَّن بكلمة سرية في ملف JSON</string>
|
||||
<string name="backup_desc_export_openpgp">أنسخ إحتياطيا لكافة الحسابات في ملف JSON مشفّر بواسطة أوبن بي جي بي</string>
|
||||
<string name="backup_desc_import_plain">استعادة حسابات من ملف JSON نص مجرّد</string>
|
||||
<string name="backup_desc_import_crypt">استعادة حسابات من ملف JSON محمي بكلمة مرور</string>
|
||||
<string name="backup_desc_import_crypt_old">Restore accounts from a password-protected JSON file
|
||||
created with an <b>andOTP version lower than 0.6.3</b></string>
|
||||
<string name="backup_desc_import_openpgp">استعادة حسابات من ملف JSON (مشفر بتقنية اوبن بي جي بي)</string>
|
||||
<string name="backup_desc_crypt_setup">فشل في تحميل كلمة مرور النسخ الاحتياطي من الإعدادات، هذا أما يعني إنه لم يتم تعيين أية كلمة مرور أو حدث خطأ ما. سيطلب منك إدخال كلمة المرور يدوياً عند إنشاء أو استيراد نسخة احتياطية.
|
||||
</string>
|
||||
<string name="backup_desc_openpgp_provider">تحتاج الى تثبيت مزود اوبن بي جي بي وتمكينها في الإعدادات لتمكين هذه الخاصية. </string>
|
||||
<string name="backup_desc_openpgp_keyid">تحتاج إلى تحديد مفتاح أوبن بي جي بي في الإعدادات قبل أن يمكنك إنشاء نسخ احتياطية مشفرة.
|
||||
</string>
|
||||
<string name="backup_desc_replace">عند المكن, جميع الإدخالات القديمة سوف تستبدل بالنسخة التي تم إستيرادها. عند التعطيل, الإدخلات القديمة سوف تدمج مع مكونات النسخة.</string>
|
||||
<string name="backup_title_replace">استبدال العناصر الموجودة</string>
|
||||
<string name="backup_desc_export_plain">انسخ احتياطيًا كافة الحسابات في ملف JSON نص مُجرَّد</string>
|
||||
<string name="backup_desc_export_crypt">انسخ احتياطيًا كافة الحسابات في ملف JSON محمي بكلمة مرور</string>
|
||||
<string name="backup_desc_export_openpgp">انسخ احتياطيًا كافة الحسابات في ملف JSON مشفّر بواسطة أوبن بي جي بي</string>
|
||||
<string name="backup_desc_import_plain">استعادة الحسابات من ملف JSON نص مجرّد</string>
|
||||
<string name="backup_desc_import_crypt">استعادة الحسابات من ملف JSON محمي بكلمة مرور</string>
|
||||
<string name="backup_desc_import_crypt_old">استعادة الحسابات من ملف JSON محمي بكلمة مرور
|
||||
الذي تم إنشاؤه بواسطة إصدار andOTP <b>أقل من 0.6.3</b></string>
|
||||
<string name="backup_desc_import_openpgp">استعادة الحسابات من ملف JSON مشفر بأوبن بي جي بي</string>
|
||||
<string name="backup_desc_crypt_setup">فشل في تحميل كلمة مرور النسخ الاحتياطي من <b>الإعدادات</b>،
|
||||
هذا يعني إما أنه لم يتم تعيين كلمة مرور أو حدث خطأ ما. سيطلب منك إدخال
|
||||
كلمة المرور يدويًا عند إنشاء أو استيراد نسخة احتياطية.</string>
|
||||
<string name="backup_desc_openpgp_provider">تحتاج إلى تثبيت مزود أوبن بي جي بي وتفعيله
|
||||
في <b>الإعدادات</b> لاستعمال هذه الخاصية.</string>
|
||||
<string name="backup_desc_openpgp_keyid">تحتاج إلى تحديد مفتاح أوبن بي جي بي في <b>الإعدادات</b>
|
||||
قبل أن يمكنك إنشاء نسخ احتياطية مشفرة.</string>
|
||||
<string name="backup_desc_replace">عند التفعيل, سوف تستبدل النسخة التي تم استيرادها بجميع الإدخالات القديمة. عند التعطيل, الإدخالات القديمة ستدمج مع محتويات النسخة.</string>
|
||||
<!-- Dialogs -->
|
||||
<string name="backup_dialog_title_security_warning">تحذير الأمان</string>
|
||||
<string name="backup_dialog_msg_export_warning">هل حقا تريد تصدير قاعدة البيانات كملف JSON نص مجرّد؟ الملف يحتوي جميع المفاتيح السرية. الرجاء الإحتفاظ عليها! </string>
|
||||
<string name="backup_dialog_msg_export_warning">هل حقا تريد تصدير قاعدة البيانات كملف JSON نص مجرّد؟ الملف يحتوي جميع المفاتيح السرية. الرجاء <b>الحفاظ عليها آمنة</b>! </string>
|
||||
<string name="backup_receiver_title_backup_failed">فشل النسخ الاحتياطي</string>
|
||||
<string name="backup_receiver_title_backup_success">نجحت عملية النسخ الإحتياطي</string>
|
||||
<string name="backup_receiver_plain_disabled">التنسيخ المشفر غير مسموح حاليا. الرجاء تمكينهم من الإعدادات</string>
|
||||
<string name="backup_receiver_encrypted_disabled">التنسيخ المشفر غير مسموح حاليا. الرجاء تمكينها في الإعدادات</string>
|
||||
<string name="backup_receiver_read_permission_failed">الإذن للقراءة لم يمنح. الرجاء تمكينها قبل محاولة النسخ</string>
|
||||
<string name="backup_receiver_write_permission_failed">الإذن للكتابة لم يمنح. الرجاء تمكينها قبل محاولة النسخ</string>
|
||||
<string name="backup_receiver_custom_encryption_failed">التشفير عبر كلمة المرور / PIN غير مدعومة مع البث الإحتياطي</string>
|
||||
<string name="backup_new_format_dialog_title">طريقة تشفير جديدة</string>
|
||||
<string name="backup_new_format_dialog_msg">Since version 0.6.3 of andOTP, a <b>new and improved
|
||||
encryption method</b> is used for password-protected backups. The old backups can still be
|
||||
imported, but it is <b>highly recommended to create new backups with the improved
|
||||
encryption</b>.\n\nThis message will not be shown again.</string>
|
||||
<string name="backup_receiver_title_backup_success">نجحت عملية النسخ الاحتياطي</string>
|
||||
<string name="backup_receiver_plain_disabled">النسخ الاحتياطية نص-مجرّد غير مسموح بها حاليًا. الرجاء الذهاب إلى الإعدادات لتفعيلها</string>
|
||||
<string name="backup_receiver_encrypted_disabled">النسخ الاحتياطية المشفرة غير مسموح بها حاليًا. الرجاء الذهاب إلى الإعدادات لتفعيلها</string>
|
||||
<string name="backup_receiver_read_permission_failed">إذن القراءة لم يمنح. الرجاء منحه قبل محاولة النسخ الاحتياطي</string>
|
||||
<string name="backup_receiver_write_permission_failed">إذن الكتابة لم يمنح. الرجاء منحه قبل محاولة النسخ الاحتياطي</string>
|
||||
<string name="backup_receiver_custom_encryption_failed">التشفير القائم على كلمة المرور/PIN غير مدعوم
|
||||
مع النسخ الإحتياطي المبث</string>
|
||||
<!-- Notification channels -->
|
||||
<string name="notification_channel_name_backup_failed">فشل النسخ التلقائي</string>
|
||||
<string name="notification_channel_name_backup_success">نجح النسخ التلقائي</string>
|
||||
<string name="notification_channel_desc_backup_failed">هذه الإعلامات تظهر عندما يفشل النسخ التلقائي لسبب ما</string>
|
||||
<string name="notification_channel_desc_backup_success">هذه الإعلامات تظهر عندما ينجح النسخ التلقائي</string>
|
||||
<string name="notification_channel_name_backup_failed">فشل النسخ الاحتياطي التلقائي</string>
|
||||
<string name="notification_channel_name_backup_success">تم النسخ الاحتياطي التلقائي بنجاح</string>
|
||||
<string name="notification_channel_desc_backup_failed">هذه الإشعارات تظهر عندما يفشل
|
||||
النسخ الاحتياطي التلقائي لسبب ما</string>
|
||||
<string name="notification_channel_desc_backup_success">هذه الإشعارات تظهر عندما ينجح النسخ الاحتياطي التلقائي</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="backup_toast_mkdir_failed">فشلت عملية إنشاء دليل للنسخ الإحتياطي</string>
|
||||
<string name="backup_toast_no_location">الرجاء تعيين موقع النسخ الاحتياطي الافتراضي في الإعدادات!</string>
|
||||
<string name="backup_toast_location_access_failed">فشل الوصول إلى موقع النسخ الاحتياطي!</string>
|
||||
<string name="backup_toast_file_creation_failed">فشل في إنشاء ملف النسخة الاحتياطية!</string>
|
||||
<string name="backup_toast_export_success">نجحت عملية التصدير إلى ذاكرة التخزين الخارجية</string>
|
||||
<string name="backup_toast_export_failed">فشلت عملية التصدير إلى ذاكرة التخزين الخارجية</string>
|
||||
<string name="backup_toast_import_success">نجحت عملية الإستعادة مِن ذاكرة التخزين الخارجية</string>
|
||||
<string name="backup_toast_import_success">نجحت عملية الاستيراد من ذاكرة التخزين الخارجية</string>
|
||||
<string name="backup_toast_import_save_failed">فشلت عملية الإحتفاظ بالبيانات المسترجَعة</string>
|
||||
<string name="backup_toast_import_decryption_failed">فشلت عملية فك تشفير النسخة الإحتياطية</string>
|
||||
<string name="backup_toast_import_no_entries">لم يتم العثور على أي عنصر في البيانات التي تم إستعادتها</string>
|
||||
<string name="backup_toast_storage_not_accessible">لا يمكن الوصول إلى الذاكرة الخارجية حاليا</string>
|
||||
<string name="backup_toast_storage_permissions">لا يوجد إذن للوصول إلى ذاكرة التخزين</string>
|
||||
<string name="backup_toast_storage_not_accessible">لا يمكن الوصول إلى ذاكرة التخزين الخارجية حاليًا</string>
|
||||
<string name="backup_toast_openpgp_error">خلل في أوبن بي جي بي : %s</string>
|
||||
<string name="backup_toast_openpgp_not_verified">لم يتم العثور على أي توقيع مُصادَق عليه</string>
|
||||
<string name="backup_toast_crypt_password_not_set">لم يتم إدخال أية كلمة سرية، الرجاء التحقق من ذلك في الإعدادات</string>
|
||||
<string name="backup_toast_file_selection_failed">Can\'t open file selection dialog!</string>
|
||||
<string name="backup_toast_crypt_password_not_set">لم يتم تعيين كلمة المرور، الرجاء التحقق من <b>الإعدادات</b></string>
|
||||
<string name="backup_toast_file_selection_failed">لا يمكن فتح مربع حوار اختيار الملف!</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,24 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="intro_slide1_title">دعنا نبدأ</string>
|
||||
<string name="intro_slide1_desc">مرحبا بكم. التالي سوف يساعدكم في الإعداد الأولي.
|
||||
يرجى الإنتباه والقراءة جيدا وإلا من الممكن خسر معلومات!
|
||||
لا داع للقلق, يمكنك تغيير أي من الخيارات في الإعدادات لاحقا.</string>
|
||||
<string name="intro_slide2_desc">لضمان أمن حساباتك, هذا التطبيق يحفظهم فقط في ملفات مشفرة. هنا يمكنك إختيار طريقة التشفير المتبعة.</string>
|
||||
<string name="intro_slide2_desc_keystore">مخزنة المفاتيح نظام عضوي لأندرويد من أجل
|
||||
الحفظ الآمن على مفاتيح التشفير. هذه الطريقة سوف
|
||||
تحفظ المفاتيح خارجة الملفات المعلوماتية ويمكن تنسيخ إحتياطي عبر التشفير عبر الأجهزة (إذا جهازك يدعمها)
|
||||
لكن لأن المفاتيح ليست محفوظة في معلومات التطبيق, هذه الطريقة تمنع حلول النسخ الخارجي (مثل تطبيق Titanium).
|
||||
إذا إخترت هذه الطريقة, ستعتمد على وسائل النسخ المتاحة في التطبيق. إنتبه, مخزنة المفاتيح تسبب مشاكل عديدة.
|
||||
الرجاء إستعمالها فقط في حالة اللزوم. إذا لا تمانع إدخال كلمة المرور / كل مرة تدخل الى التطبيق, من المحبذ إستعمال
|
||||
التشفير عبر كلمة المرور.
|
||||
</string>
|
||||
<string name="intro_slide2_desc_password">هذا الأسلوب سيتم تشفير البيانات الخاصة بك مع مفتاح
|
||||
متولدة من كلمة المرور أو رقم التعريف الشخصي (PIN). الميزة الرئيسية هنا هو أن هذا سوف يعمل مع حلول النسخ الاحتياطي الخارجي
|
||||
(مثل تطبيق \"Titanium\") وهو أقل عرضة للفشل من مخزن المفاتيح.
|
||||
مع ذلك، سيوجب عليك إدخال بيانات الاعتماد الخاصة بك كل مرة تشغل <b>التطبيق</b>.</string>
|
||||
<string name="intro_slide3_desc_keystore">هنا من الممكن إقامة مطابقة لقفل التطبيق. لأنك حددت مخزن المفاتيح لأندرويد
|
||||
كنوع التشفير, التالي إختياري.</string>
|
||||
<string name="intro_slide1_desc">مرحبا بكم في <b>andOTP</b>. المساعد التالي سوف يساعدكم في الإعداد الأوّلي.
|
||||
يرجى الانتباه والقراءة جيدًا لتجنب خسارة البيانات!
|
||||
\n\nلا داعٍ للقلق، يمكنك تغيير أي من الخيارات لاحقًا في <b>الإعدادات</b>.</string>
|
||||
<string name="intro_slide2_desc">لضمان أمان حساباتك، يستعمل <b>andOTP</b> التشفير في تخزين بيانات الحساب. يمكنك هنا اختيار أية طريقة تشفير ستستعمل.</string>
|
||||
<string name="intro_slide2_desc_keystore">KeyStore هو مكون في نظام أندرويد يستعمل في حفظ مفاتيح التشفير بشكل آمن. ميزة استعمال KeyStore هي أن المفاتيح تحفظ بشكل منفصل عن بيانات <b>andOTP</b>، ويمكن دعمه بالتشفير المعتمد-على-العتاد (إن كان جهازك يدعمه).
|
||||
مع ذلك، لأن المفاتيح لن تحفظ ضمن بيانات <b>andOTP</b>، <b>هذه الطريقة تمنع حلول النسخ الاحتياطي الخارجي (مثل تطبيق Titanium Backup) من العمل</b>.
|
||||
إذا تم اختيار هذه الطريقة، سيتوجب الاعتماد على وسائل النسخ الاحتياطي المتاحة في<b>andOTP</b>.
|
||||
\n\n<b>تحذير</b>، KeyStore يسبب مشاكل عديدة، يرجى استعماله فقط في حالة اللزوم.
|
||||
إذا لا تمانع إدخال كلمة المرور/PIN كل مرة تدخل <b>andOTP</b>، <b>يُنصح بشدّة استعمال التشفير عبر-كلمة-المرور بدلًا من ذلك</b>.</string>
|
||||
<string name="intro_slide2_desc_password">تلك الطريقة ستشفّر بياناتك بمفتاح تم توليده من كلمة مرور أو PIN. الميزة الرئيسية لاستخدام هذه الطريقة هي أن حلول النسخ الاحتياطي الخارجية (مثل تطبيق Titanium Backup) ستعمل كما يجب، وهي أقل عرضة للفشل من KeyStore. ولكن سيوجب عليك إدخال بيانات الإعتماد الخاصة بك كل مرة تفتح <b>andOTP</b>.</string>
|
||||
<string name="intro_slide3_desc_keystore">هنا من الممكن تعيين طريقة مصادقة لقَفل <b>andOTP</b>. لأنك اخترت <b>أندرويد KeyStore</b>
|
||||
كطريقة التشفير, هذه الخطوة اختيارية.</string>
|
||||
<string name="intro_slide3_desc_password">هنا من الممكن إقامة عملية المطابقة لإقفال التطبيق.
|
||||
لأنك حددت كلمة المرور / PIN كنوع التشفير, عليك تحديد
|
||||
إما كلمة مرور أو PIN للمتابعة. </string>
|
||||
|
|
|
@ -41,10 +41,17 @@
|
|||
<string name="menu_sort_label">تسمية</string>
|
||||
<string name="menu_sort_last_used">آخر استخدام</string>
|
||||
<string name="menu_sort_most_used">الأكثر استخداما</string>
|
||||
<string name="menu_popup_edit">Edit</string>
|
||||
<string name="menu_popup_edit">تعديل</string>
|
||||
<string name="menu_popup_change_image">تغيير الصورة</string>
|
||||
<string name="menu_popup_remove">حذف</string>
|
||||
<string name="menu_popup_show_qr_code">Show QR Code</string>
|
||||
<string name="menu_popup_show_qr_code">إظهار رمز QR</string>
|
||||
<!-- Buttons -->
|
||||
<string name="button_card_options">More options</string>
|
||||
<string name="button_card_options_format">More options for %1$s</string>
|
||||
<string name="button_card_copy">Copy token</string>
|
||||
<string name="button_card_copy_format">Copy %1$s token</string>
|
||||
<string name="button_add">Add new account</string>
|
||||
<string name="button_close_menu">Close menu</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="toast_auth_failed">أخفقت المصادقة، الرجاء إعادة المحاولة !</string>
|
||||
<string name="toast_auth_failed_fatal">أخفقت عملية المصادقة، جارٍ إغلاق التطبيق!</string>
|
||||
|
@ -52,44 +59,38 @@
|
|||
<string name="toast_entry_exists">هذا العنصر موجود من قبل</string>
|
||||
<string name="toast_invalid_qr_code">رمز الكيو آر غير صالح</string>
|
||||
<string name="toast_encryption_key_empty">تعذرت عملية تحميل مفتاح التشفير</string>
|
||||
<string name="toast_intent_creation_failed">Invalid intent-provided code</string>
|
||||
<string name="toast_intent_creation_succeeded">Intent-provided code added</string>
|
||||
<string name="toast_intent_creation_failed">الرمز المقدم غير صالح</string>
|
||||
<string name="toast_intent_creation_succeeded">تم إضافة الرمز المقدم</string>
|
||||
<string name="toast_file_load_error">لا يمكن فتح الملف</string>
|
||||
<string name="toast_qr_error">تعذر العثور على/تأكيد رمز كيو آر</string>
|
||||
<string name="toast_qr_checksum_exception">Checksum verification failed while decoding QR code</string>
|
||||
<string name="toast_qr_checksum_exception">فشل تدقيق المجموع أثناء فك ترميز رمز QR</string>
|
||||
<string name="toast_qr_format_error">نسق خاطئ في رمز الكيو آر</string>
|
||||
<string name="toast_qr_unsuported">QR Code not supported</string>
|
||||
<string name="toast_qr_failed_to_generate">Failed to generate QR Code</string>
|
||||
<string name="toast_qr_unsuported">رمز QR غير مدعوم</string>
|
||||
<string name="toast_qr_failed_to_generate">فشل في إنشاء رمز QR</string>
|
||||
<!-- Errors -->
|
||||
<string name="error_invalid_secret">Invalid secret</string>
|
||||
<string name="error_invalid_secret">سر غير صالح</string>
|
||||
<!-- Dialogs -->
|
||||
<string name="dialog_title_auth">مصادقة</string>
|
||||
<string name="dialog_title_manual_entry">أدخل التفاصيل</string>
|
||||
<string name="dialog_title_remove">حذف</string>
|
||||
<string name="dialog_title_rename">تعديل التسمية</string>
|
||||
<string name="dialog_title_counter">عداد</string>
|
||||
<string name="dialog_title_used_tokens">Tokens usage</string>
|
||||
<string name="dialog_title_used_tokens">استخدام الرموز</string>
|
||||
<string name="dialog_title_keystore_error">خطأ في مخزن المفاتيح</string>
|
||||
<string name="dialog_title_qr_code">QR Code</string>
|
||||
<string name="dialog_title_android21_depreaction">Deprecation notice</string>
|
||||
<string name="dialog_title_qr_code">رمز QR</string>
|
||||
<string name="dialog_title_enter_password">أدخل كلمة المرور</string>
|
||||
<string name="dialog_label_enter_password">أدخل كلمة المرور</string>
|
||||
<string name="dialog_label_confirm_password">تأكيد كلمة المرور</string>
|
||||
<string name="dialog_msg_auth">الرجاء إدخال بيانات الإعتماد الخاصة بجهازك لتشغيل التطبيق.</string>
|
||||
<string name="dialog_msg_confirm_delete">هل أنت متأكد من أنك تريد إزالة الحساب ؟</string>
|
||||
<string name="dialog_msg_used_tokens">andOTP will track when you use your tokens (using the \"Tap
|
||||
to reveal\" feature or copying to clipboard) to be able to sort them by \"Most used\" or
|
||||
\"Last used\".\n\nThis message will not be shown again.</string>
|
||||
<string name="dialog_msg_used_tokens">سوف يتتبع andOTP استخدام الرموز المميزة الخاصة بك (باستخدام خاصية \"اضغط
|
||||
للكشف\" أو نسخ إلى الحافظة) لتتمكن من فرزها بواسطة \"الأكثر استخداما\" أو
|
||||
\"آخر مستخدم\".\n\nلن تظهر هذه الرسالة مرة أخرى.</string>
|
||||
<string name="dialog_msg_keystore_error">فشل تحميل مفتاح التشفير من مخزن المفاتيح.
|
||||
الإدخالات المضافة سوف تحذف. لمزاولة التطبيق,
|
||||
أبدل تشفيرة قاعدة البيانات الى كلمة مرور أو PIN في الإعدادات.</string>
|
||||
<string name="dialog_msg_android21_deprecation">This will be the last version of andOTP to
|
||||
support Android versions below 5.1 (Lollipop). The increased effort required to maintain a
|
||||
separate storage implementation just for those older versions as well as their low market
|
||||
shares make a continued support infeasible for our small team.\n\nThis message will not be
|
||||
shown again.</string>
|
||||
<!-- Shortcuts -->
|
||||
<string name="shortcut_name_scan_qr">مسح رمز الكيو آر</string>
|
||||
<string name="shortcut_name_scan_qr">مسح رمز QR</string>
|
||||
<string name="shortcut_name_import_qr">استيراد رمز كيو آر</string>
|
||||
<string name="shortcut_name_enter_details">أدخل التفاصيل</string>
|
||||
</resources>
|
||||
|
|
|
@ -14,17 +14,18 @@
|
|||
<string name="settings_title_encryption">تشفير قاعدة البيانات</string>
|
||||
<string name="settings_title_panic">زر الذعر</string>
|
||||
<string name="settings_title_relock_screen_off">الإقفال عند إغلاق الجهاز</string>
|
||||
<string name="settings_title_relock_background">Re-lock when going into the background</string>
|
||||
<string name="settings_title_auth_inactivity">Re-lock on inactivity</string>
|
||||
<string name="settings_title_auth_inactivity_delay">Delay for inactivity re-lock</string>
|
||||
<string name="settings_title_block_accessibility">Block accessibility services</string>
|
||||
<string name="settings_title_relock_background">إعادة قفل عند الذهاب إلى الخلفية</string>
|
||||
<string name="settings_title_auth_inactivity">إعادة قفل عند عدم النشاط</string>
|
||||
<string name="settings_title_auth_inactivity_delay">تأخير إعادة قفل عدم النشاط</string>
|
||||
<string name="settings_title_block_accessibility">حظر إمكانية الوصول</string>
|
||||
<string name="settings_title_block_autofill">حظر التعبئة التلقائية</string>
|
||||
<string name="settings_title_lang">اللغة</string>
|
||||
<string name="settings_title_theme">المظهر</string>
|
||||
<string name="settings_title_card_layout">تصميم البطاقة</string>
|
||||
<string name="settings_title_label_size">حجم خط إسم العلامات</string>
|
||||
<string name="settings_title_label_scroll">تسمية التمرير</string>
|
||||
<string name="settings_title_tap_single">Single-tap</string>
|
||||
<string name="settings_title_tap_double">Double-tap</string>
|
||||
<string name="settings_title_tap_single">نقرة</string>
|
||||
<string name="settings_title_tap_double">نقر مزدوج</string>
|
||||
<string name="settings_title_thumbnail_size_ask">حجم الصور المصغرة</string>
|
||||
<string name="settings_title_split_group_size">تقسيم تذكرة أمان النفاذ بمسافة بيضاء</string>
|
||||
<string name="settings_title_tag_functionality">سلوك إختيار العلامة</string>
|
||||
|
@ -35,7 +36,7 @@
|
|||
<string name="settings_title_show_individual_timeouts">Show individual timeouts</string>
|
||||
<string name="settings_title_backup_append_date">إلحاق تاريخ اليوم باسم الملف</string>
|
||||
<string name="settings_title_backup_ask">إسأل عن إسم الملف</string>
|
||||
<string name="settings_title_backup_directory">مجلد النسخ الإحتياطي</string>
|
||||
<string name="settings_title_backup_location">Default backup location</string>
|
||||
<string name="settings_title_backup_password">كلمة المرور للنسخة الإحتياطية</string>
|
||||
<string name="settings_title_auto_backup_password_enc">نسخ احتياطي تلقائي للإدخالات الجديدة</string>
|
||||
<string name="settings_title_backup_broadcasts">النسخ الاحتياطي المبث</string>
|
||||
|
@ -60,6 +61,10 @@
|
|||
require reauthentication</string>
|
||||
<string name="settings_desc_block_accessibility">Hide sensitive fields from the accessibility
|
||||
services. <b>DO NOT enable this if you rely on the accessibility services!</b></string>
|
||||
<string name="settings_desc_block_autofill">Block autofill services from accessing password
|
||||
fields inside the app</string>
|
||||
<string name="settings_desc_block_autofill_android">This feature requires an Android version
|
||||
above 8.0 (Oreo)</string>
|
||||
<string name="settings_desc_label_scroll">قم بتمرير علامات متجاورة بدلاً من اقتطاعها</string>
|
||||
<string name="settings_desc_minimize_on_copy">App will be minimized when you copy the OTP to clipboard</string>
|
||||
<string name="settings_desc_search_includes">Specify which values should be included when searching</string>
|
||||
|
@ -69,9 +74,13 @@
|
|||
This can slow down the app, only enable if really necessary.</string>
|
||||
<string name="settings_desc_backup_append_date">إلحاق بالتاريخ الحالي والوقت إلى اسم الملف النسخ الاحتياطي المقترح</string>
|
||||
<string name="settings_desc_backup_ask">اسأل عن اسم الملف كل مرة يتم إنشاء نسخة احتياطية أو نسخة مستعادة</string>
|
||||
<string name="settings_desc_backup_location">Choose a default backup location</string>
|
||||
<string name="settings_desc_backup_location_set">Backup location has been chosen</string>
|
||||
<string name="settings_desc_backup_password">إختر كلمة المرور التي سوف تستخدم لتشفير النسخ الإحتياطية</string>
|
||||
<string name="settings_desc_auto_backup_password_enc">Creates a new encrypted backup when new
|
||||
entries are added, or edited, if settings conditions are met</string>
|
||||
<string name="settings_desc_auto_backup_requirements">Set a default backup location and a
|
||||
backup password to enable this option</string>
|
||||
<string name="settings_desc_backup_broadcasts">حدد أنواع النسخ الإحتياطي التي يمكن تشغيلها بواسطة تطبيقات البث</string>
|
||||
<string name="settings_desc_openpgp_key_encrypt">عنوان البريد الإلكتروني للمفتاح المستخدَم لتشفير النسخ الإحتياطية</string>
|
||||
<string name="settings_desc_openpgp_verify">النسخ المشفرة تسترد فقط إذا وقعوا بمفتاح صالح</string>
|
||||
|
@ -81,7 +90,7 @@
|
|||
<string name="settings_desc_enable_android_backup_service">تمكين التطبيق أن يستعمل خدمة النسخ الموجودة في أندرويد لنسخ المفاتيح والتفضيلات</string>
|
||||
<string name="settings_desc_clear_keystore">حذف مفتاح التعمية من مخزن المفاتيح</string>
|
||||
<!-- Toasts -->
|
||||
<string name="settings_toast_auth_device_not_secure">هذه الخاصة تتطلب ضبط القفل الآمن
|
||||
<string name="settings_toast_auth_device_not_secure">هذه الخاصة تتطلب ضبط القفل الآمن
|
||||
(الإعدادت -> شاشة القفل والحماية -> ضبط القفل الآمن) </string>
|
||||
<string name="settings_toast_password_empty">كلمة مرور فارغة مرفوضة. إختر نوع المصادقة كفارغة لتعطيلها!</string>
|
||||
<string name="settings_toast_encryption_changing">محاولة تغيير تشفيرة قاعدة البيانات،
|
||||
|
|
47
app/src/main/res/values-ast/strings_about.xml
Normal file
47
app/src/main/res/values-ast/strings_about.xml
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="about_activity_title">Tocante a </string>
|
||||
<string name="about_description">Autenticación en dos pasos de códigu llibre p\'Android</string>
|
||||
<string name="about_tab_about">Tocante a</string>
|
||||
<string name="about_tab_libraries">Biblioteques</string>
|
||||
<!-- Misc -->
|
||||
<string name="about_label_changelog">Rexistru de cambeos</string>
|
||||
<string name="about_label_license">Llicencia</string>
|
||||
<string name="about_label_MIT">Llicencia MIT</string>
|
||||
<string name="about_label_source">Códigu fonte</string>
|
||||
<string name="about_label_version">Versión</string>
|
||||
<string name="about_label_faq">FAQ</string>
|
||||
<string name="about_label_faq_long">Entrugues frecuentes</string>
|
||||
<!-- Authors -->
|
||||
<string name="about_title_authors">Autores</string>
|
||||
<string name="about_label_main_developer">Densendolcador principal</string>
|
||||
<string name="about_label_developer">Desendolcador</string>
|
||||
<string name="about_label_original_author">Autor de l\'aplicación orixinal</string>
|
||||
<string name="about_label_original_app">Aplicación orixinal</string>
|
||||
<string name="about_label_website">Sitiu web</string>
|
||||
<string name="about_label_donate">Donar</string>
|
||||
<string name="about_label_contributors">Collaboradores</string>
|
||||
<string name="about_label_translators">Traductores</string>
|
||||
<!-- Thumbnail disclaimer -->
|
||||
<string name="about_title_thumbnail_disclaimer">Avisu de renuncia de les miniatures</string>
|
||||
<string name="about_thumbnails_disclaimer_no1"><b>1.</b> Toles miniatures son marques rexistraes
|
||||
de los sos respeutivos miembros.</string>
|
||||
<string name="about_thumbnails_disclaimer_no2"><b>2.</b> L\'usu d\'estes marques rexistraes nun
|
||||
indiquen rellación col dueñu de los drechos d\'autor y andOTP o viceversa.</string>
|
||||
<string name="about_thumbnails_disclaimer_no3"><b>3.</b> Les miniatures namás deberíen usase
|
||||
pa representar la compaña o serviciu qu\'indiquen.</string>
|
||||
<string name="about_thumbnails_disclaimer_no4"><b>4. Nun uses les miniatures pa otru
|
||||
propósitu que nun seya\'l de representar una marca o serviciu en particular.</b></string>
|
||||
<!-- Support -->
|
||||
<string name="about_title_support">Sofita\'l desendolcu</string>
|
||||
<string name="about_desc_support">Descubri cómo pues sofitar el desendolcu d\'andOTP</string>
|
||||
<string name="about_title_special_features">Carauterístiques especiales</string>
|
||||
<string name="about_dialog_special_features">¿De xuru que quies activar les carauterístiques
|
||||
especiales? La mayoría d\'elles son algoritmos OTP que nun son estándares y
|
||||
s\'implementaron so petición. Nun tán <b>sofitaes oficialmente</b> y puen venir con
|
||||
<b>ciertes llendes</b>, llei (y entiendi) la páxina «Carauterístiques especiales» na wiki de
|
||||
GitHub pa deprender más enantes d\'usales.</string>
|
||||
<string name="about_toast_special_features">Activáronse les carauterístiques especial</string>
|
||||
<string name="about_toast_special_features_enabled">Les carauterístiques especiales yá s\'activaron</string>
|
||||
<string name="about_toast_copied_to_clipboard">L\'enllaz de donación copióse al cartafueyu</string>
|
||||
</resources>
|
18
app/src/main/res/values-ast/strings_auth.xml
Normal file
18
app/src/main/res/values-ast/strings_auth.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="auth_activity_title">Autenticación</string>
|
||||
<!-- Hints -->
|
||||
<string name="auth_hint_password">Contraseña</string>
|
||||
<string name="auth_hint_pin">PIN</string>
|
||||
<!-- Messages -->
|
||||
<string name="auth_msg_authenticate">¡Autentícate p\'aniciar andOTP!</string>
|
||||
<string name="auth_msg_confirm_encryption">¡Confirma l\'autenticación pa xenerar la clave
|
||||
de cifráu!</string>
|
||||
<!-- Buttons -->
|
||||
<string name="auth_button_unlock">Desbloquiar</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="auth_toast_password_missing">¡Afita una contraseña n\'<b>Axustes</b>!</string>
|
||||
<string name="auth_toast_pin_missing">¡Afita un PIN n\'<b>Axustes</b>!</string>
|
||||
<string name="auth_toast_password_again">Contraseña incorreuta, ¡volvi tentalo!</string>
|
||||
<string name="auth_toast_pin_again">PIN incorreutu, ¡volvi tentalo!</string>
|
||||
</resources>
|
78
app/src/main/res/values-ast/strings_backup.xml
Normal file
78
app/src/main/res/values-ast/strings_backup.xml
Normal file
|
@ -0,0 +1,78 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="backup_activity_title">Copies de seguranza</string>
|
||||
<string name="backup_category_plain">Copies de seguranza en testu planu</string>
|
||||
<string name="backup_category_crypt">Copies de seguranza cifraes</string>
|
||||
<string name="backup_category_openpgp">Copies de seguranza n\'OpenPGP</string>
|
||||
<string name="backup_title_export_plain">Copia de seguranza (testu planu)</string>
|
||||
<string name="backup_title_export_crypt">Copia de seguranza (cifrada)</string>
|
||||
<string name="backup_title_export_openpgp">Copia de seguranza (OpenPGP)</string>
|
||||
<string name="backup_title_import_plain">Restauración (testu planu)</string>
|
||||
<string name="backup_title_import_crypt">Restauración (cifrada)</string>
|
||||
<string name="backup_title_import_crypt_old">Restauración (cifrada, cifráu vieyu)</string>
|
||||
<string name="backup_title_import_openpgp">Restauración (OpenPGP)</string>
|
||||
<string name="backup_title_replace">Trocar les entraes esistentes</string>
|
||||
<string name="backup_desc_export_plain">Fai una copia de seguranza de toles cuentes nun ficheru JSON</string>
|
||||
<string name="backup_desc_export_crypt">Fai una copia de seguranza de toles cuentes nun ficheru JSON protexíu por contraseña</string>
|
||||
<string name="backup_desc_export_openpgp">Fai una copia de seguranza de toles cuentes nun ficheru JSON cifráu con OpenPGP</string>
|
||||
<string name="backup_desc_import_plain">Restaura les cuentes d\'un ficheru JSON</string>
|
||||
<string name="backup_desc_import_crypt">Restaura les cuentes d\'un ficheru JSON protexíu por contraseña</string>
|
||||
<string name="backup_desc_import_crypt_old">Restaura cuentes dende un ficheru JSON protexíu con contraseña
|
||||
y creáu con una <b>versión d\'andOTP menor a la 0.6.3</b></string>
|
||||
<string name="backup_desc_import_openpgp">Restaura les cuentes d\'un ficheru JSON cifráu con OpenPGP</string>
|
||||
<string name="backup_desc_crypt_setup">Fallu al cargar la contraseña de la copia de seguranza dende <b>Axustes</b>,
|
||||
esto significa que nun s\'afitó nenguna contraseña o asocedió daqué malo. Va pidísete qu\'introduzas
|
||||
la contraseña a mano al crear o importar una copia de seguranza.
|
||||
</string>
|
||||
<string name="backup_desc_openpgp_provider">Precises instalar un fornidor OpenPGP y activalu
|
||||
n\'<b>Axustes</b> pa usar esta carauterística.
|
||||
</string>
|
||||
<string name="backup_desc_openpgp_keyid">Precises esbillar una clave OpenPGP n\'<b>Axustes</b>
|
||||
enantes que pueas crear copies de seguranza cifraes.
|
||||
</string>
|
||||
<string name="backup_desc_replace">Si s\'activa, toles entraes vieyes van trocase al importar
|
||||
una copia de seguranza y namás si esta ta presente. Si se desactiva, les entraes vieyes y el
|
||||
conteníu de les copies de seguranza mécense.</string>
|
||||
<!-- Dialogs -->
|
||||
<string name="backup_dialog_title_security_warning">Alvertencia de seguranza</string>
|
||||
<string name="backup_dialog_msg_export_warning">¿De xuru que quies esportar la base de datos
|
||||
como ficheru JSON en testu planu? Esti ficheru contién toles claves
|
||||
secretes polo que <b>guárdalu con curiáu</b></string>
|
||||
<string name="backup_receiver_title_backup_failed">Falló la copia de seguranza</string>
|
||||
<string name="backup_receiver_title_backup_success">La copia de seguranza tuvo ésitu</string>
|
||||
<string name="backup_receiver_plain_disabled">Anguaño nun se permiten les copies de
|
||||
seguranza en testu planu, vete a Axustes
|
||||
p\'activales</string>
|
||||
<string name="backup_receiver_encrypted_disabled">Anguaño les copies de seguranza cifraes nun
|
||||
tán permitíes, vete a axustes p\'activales</string>
|
||||
<string name="backup_receiver_read_permission_failed">Nun se concedió\'l permisu de llectura,
|
||||
concédelu enantes de crear esta
|
||||
copia de seguranza</string>
|
||||
<string name="backup_receiver_write_permission_failed">Nun se concedió\'l permisu d\'escritura,
|
||||
concédelu enantes de crear una
|
||||
copia de seguranza</string>
|
||||
<string name="backup_receiver_custom_encryption_failed">El cifráu según contraseña/PIN nun
|
||||
sofita cola copia de seguranza remota</string>
|
||||
<!-- Notification channels -->
|
||||
<string name="notification_channel_name_backup_failed">Falló la copia de seguranza automática</string>
|
||||
<string name="notification_channel_name_backup_success">La copia de seguranza automática tuvo ésitu</string>
|
||||
<string name="notification_channel_desc_backup_failed">Estos avisos amuésense cuando una
|
||||
copia de seguranza falló por dalguna razón</string>
|
||||
<string name="notification_channel_desc_backup_success">Estos avisos amuésense cuando una
|
||||
copia de seguranza tuvo ésitu</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="backup_toast_no_location">¡Afita un allugamientu predetermináu nos axustes!</string>
|
||||
<string name="backup_toast_location_access_failed">¡Fallu al acceder al allugamientu de les copies de seguranza!</string>
|
||||
<string name="backup_toast_file_creation_failed">¡Fallu al crear el ficheru del copia de seguranza!</string>
|
||||
<string name="backup_toast_export_success">La esportación al almacenamientu esternu tuvo ésitu</string>
|
||||
<string name="backup_toast_export_failed">Falló la esportación al almacenamientu esternu</string>
|
||||
<string name="backup_toast_import_success">La importación al almacenamientu esternu tuvo ésitu</string>
|
||||
<string name="backup_toast_import_save_failed">Fallu al guardar les entraes restauraes</string>
|
||||
<string name="backup_toast_import_decryption_failed">Falló\'l descifráu de la copia de seguranza</string>
|
||||
<string name="backup_toast_import_no_entries">Nun s\'alcontraron entraes nos datos importaos</string>
|
||||
<string name="backup_toast_storage_not_accessible">Anguaño nun pue accedese al almacenamientu esternu</string>
|
||||
<string name="backup_toast_openpgp_error">Fallu d\'OpenPGP: %s</string>
|
||||
<string name="backup_toast_openpgp_not_verified">Nun se deteutó nenguna robla verificada</string>
|
||||
<string name="backup_toast_crypt_password_not_set">Nun s\'afitó la contraseña, comprueba los axustes</string>
|
||||
<string name="backup_toast_file_selection_failed">¡Nun pue abrise\'l diálogu d\'esbilla de ficheros!</string>
|
||||
</resources>
|
37
app/src/main/res/values-ast/strings_intro.xml
Normal file
37
app/src/main/res/values-ast/strings_intro.xml
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="intro_slide1_title">Vamos entamar</string>
|
||||
<string name="intro_slide1_desc">Afáyate n\'<b>andOTP</b>, esti encontu va guiate pente la
|
||||
configuración inicial. ¡Llei con procuru darréu que podríes perder datos!
|
||||
\n\nNun t\'esmolezas, entá pues camudar cualesquier opción más sero n\'<b>Axustes</b>.</string>
|
||||
<string name="intro_slide2_desc">P\'asegurar la seguranza de les cuentes, <b>andOTP</b>
|
||||
namás les atroxa en ficheros cifraos. Equí pues escoyer el métodu de cifráu que va usase.</string>
|
||||
<string name="intro_slide2_desc_keystore">L\'almacenamientu de claves ye un componente del sistema Android
|
||||
p\'atroxar de mou seguru les claves criptográfiques. La ventaya d\'esti métodu ye que les claves
|
||||
atróxense separtaes de los ficheros de datos y la criptografía del hardware pue facer copies
|
||||
de seguranza (si\'l preséu lo sofita). Por embargu y darréu que les claves nun s\'atroxen colos
|
||||
datos de les aplicaciones, <b>esti métodu evita que funcionen les soluciones de copies de
|
||||
seguranza (como Titanum)</b>. Si escueyes esti métodu vas tener d\'encontate nes funciones
|
||||
de copies de seguranza internes d\'<b>andOTP</b>.\n\n<b>Alvertencia:</b> L\'almacenamientu
|
||||
de claves tien l\'enclín a causar munchos problemes, úsalu namás si lu precises daveres. Si nun
|
||||
t\'importa introducir una contraseña / PIN cada vegada qu\'anicies <b>andOTP</b>, <b>aconséyase
|
||||
muncho usar el cifráu basáu en contraseña.</b></string>
|
||||
<string name="intro_slide2_desc_password">Esti métodu va cifrar los datos con una clave
|
||||
xenerada de magar una contraseña o PIN. La ventaya principal equí ye qu\'esto va
|
||||
funcionar con soluciones esternes de copies de seguranza (como Titanium), y nun falla
|
||||
tanto como l\'almacén de claves. Por embargu, vas tener d\'introducir les credenciales
|
||||
cada vegada qu\'anicies <b>andOTP</b>.</string>
|
||||
<string name="intro_slide3_desc_keystore">Equí pues configurar una autenticación pa bloquiar
|
||||
<b>andOTP</b>. Darréu qu\'escoyesti <b>Almacén de claves d\'Android</b> como métodu de
|
||||
cifráu, esto ye opcional.</string>
|
||||
<string name="intro_slide3_desc_password">Equí pues configurar una autenticación pa bloquiar
|
||||
<b>andOTP</b>. Darréu qu\'escoyesti <b>Contraseña / PIN</b> como métodu de cifráu, precises
|
||||
afitar una contraseña o un PIN pa siguir.</string>
|
||||
<string name="intro_slide3_warn_no_password">¡Afita una contraseña pa siguir!</string>
|
||||
<string name="intro_slide3_warn_no_pin">¡Afita un PIN pa siguir!</string>
|
||||
<string name="intro_slide3_warn_confirm_password">¡Confirma la contraseña pa siguir!</string>
|
||||
<string name="intro_slide3_warn_confirm_pin">¡Confirma\'l PIN pa siguir!</string>
|
||||
<string name="intro_slide4_title">Finesti</string>
|
||||
<string name="intro_slide4_desc">Guardáronse los axutes, ¡yá tas preparáu pa
|
||||
usar <b>andOTP</b>!</string>
|
||||
</resources>
|
96
app/src/main/res/values-ast/strings_main.xml
Normal file
96
app/src/main/res/values-ast/strings_main.xml
Normal file
|
@ -0,0 +1,96 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Buttons -->
|
||||
<string name="button_cancel">Encaboxar</string>
|
||||
<string name="button_enter_details">Amestar a mano</string>
|
||||
<string name="button_scan_qr">Escaniar códigu QR</string>
|
||||
<string name="button_save">Guardar</string>
|
||||
<string name="button_new_tag">Etiqueta nueva</string>
|
||||
<string name="button_settings">Axustes</string>
|
||||
<string name="button_all_tags">Toles etiquetes</string>
|
||||
<string name="button_no_tags">Ensin etiquetes</string>
|
||||
<string name="button_qr_from_image">Códigu QR a partir d\'una imaxe</string>
|
||||
<!-- Custom formatting -->
|
||||
<string name="format_custom_period">%d s</string>
|
||||
<!-- Hints -->
|
||||
<string name="hint_label">Etiqueta</string>
|
||||
<string name="hint_secret">Secretu</string>
|
||||
<!-- Labels -->
|
||||
<string name="label_hidden">Anubrióse</string>
|
||||
<string name="label_type">Triba</string>
|
||||
<string name="label_secret">Secretu</string>
|
||||
<string name="label_period">Periodu</string>
|
||||
<string name="label_digits">Díxitos</string>
|
||||
<string name="label_counter">Contador</string>
|
||||
<string name="label_issuer">Emisor</string>
|
||||
<string name="label_label">Etiqueta</string>
|
||||
<string name="label_algorithm">Algoritmu</string>
|
||||
<string name="label_tags">Etiquetes</string>
|
||||
<string name="label_advanced">Opciones avanzaes</string>
|
||||
<!-- Drawer -->
|
||||
<string name="drawer_open">Amosar etiquetes</string>
|
||||
<string name="drawer_close">Anubrir etiquetes</string>
|
||||
<!-- Menu -->
|
||||
<string name="menu_main_about">Tocante a</string>
|
||||
<string name="menu_main_backup">Copia seguranza</string>
|
||||
<string name="menu_main_search">Guetar</string>
|
||||
<string name="menu_main_settings">Axustes</string>
|
||||
<string name="menu_main_sort">Ordenar</string>
|
||||
<string name="menu_sort_none">Ensin ordenar</string>
|
||||
<string name="menu_sort_issuer">Emisor</string>
|
||||
<string name="menu_sort_label">Etiqueta</string>
|
||||
<string name="menu_sort_last_used">Últimu usu</string>
|
||||
<string name="menu_sort_most_used">Lo más usao</string>
|
||||
<string name="menu_popup_edit">Editar</string>
|
||||
<string name="menu_popup_change_image">Camudar imaxe</string>
|
||||
<string name="menu_popup_remove">Desaniciar</string>
|
||||
<string name="menu_popup_show_qr_code">Amosar el códigu QR</string>
|
||||
<!-- Buttons -->
|
||||
<string name="button_card_options">Más opciones</string>
|
||||
<string name="button_card_options_format">Más opciones de %1$s</string>
|
||||
<string name="button_card_copy">Copiar el pase</string>
|
||||
<string name="button_card_copy_format">Copiar el pase de %1$s</string>
|
||||
<string name="button_add">Amestar una cuenta</string>
|
||||
<string name="button_close_menu">Zarrar el menú</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="toast_auth_failed">Falló l\'autenticación, ¡volvi tentalo!</string>
|
||||
<string name="toast_auth_failed_fatal">Falló l\'autenticación, ¡zarrando andOTP!</string>
|
||||
<string name="toast_copied_to_clipboard">Copióse al cartafueyu</string>
|
||||
<string name="toast_entry_exists">Esta entrada yá esiste</string>
|
||||
<string name="toast_invalid_qr_code">El códigu QR nun ye válidu</string>
|
||||
<string name="toast_encryption_key_empty">Nun se cargó la clave de cifráu</string>
|
||||
<string name="toast_intent_creation_failed">El códigu propuestu nun ye válidu</string>
|
||||
<string name="toast_intent_creation_succeeded">Amestóse\'l códigu propuestu</string>
|
||||
<string name="toast_file_load_error">Nun pudo abrise\'l ficheru</string>
|
||||
<string name="toast_qr_error">Nun pudo alcontrase/confirmase\'l códigu QR</string>
|
||||
<string name="toast_qr_checksum_exception">Falló la verificación de la suma de comprobación mentanso se descifraba\'l códigu QR</string>
|
||||
<string name="toast_qr_format_error">Fallu de formatu nel códigu QR</string>
|
||||
<string name="toast_qr_unsuported">El códigu QR nun se sofita</string>
|
||||
<string name="toast_qr_failed_to_generate">Fallu al xenerar el códigu QR</string>
|
||||
<!-- Errors -->
|
||||
<string name="error_invalid_secret">El secretu nun ye válidu</string>
|
||||
<!-- Dialogs -->
|
||||
<string name="dialog_title_auth">Autenticación</string>
|
||||
<string name="dialog_title_manual_entry">Amestar a mano</string>
|
||||
<string name="dialog_title_remove">Desaniciar</string>
|
||||
<string name="dialog_title_rename">Renomáu</string>
|
||||
<string name="dialog_title_counter">Contador</string>
|
||||
<string name="dialog_title_used_tokens">Usu de pases</string>
|
||||
<string name="dialog_title_keystore_error">Fallu del almacén de claves</string>
|
||||
<string name="dialog_title_qr_code">Códigu QR</string>
|
||||
<string name="dialog_title_enter_password">Introducción de contraseña</string>
|
||||
<string name="dialog_label_enter_password">Introduz la contraseña</string>
|
||||
<string name="dialog_label_confirm_password">Confirma la contraseña</string>
|
||||
<string name="dialog_msg_auth">Introduz les credenciales del preséu p\'aniciar andOTP, por favor.</string>
|
||||
<string name="dialog_msg_confirm_delete">¿De xuru que quies desaniciar la cuenta «%1$s»?</string>
|
||||
<string name="dialog_msg_used_tokens">andOTP va saber cuándo uses los pases (col usu de la
|
||||
carauterística «Tocar p\'amosar» o copiar al cartafueyu) pa ser a ordenalos por «Más
|
||||
usu» o «Últimu usu».\n\nEsti mensaxe nun va amosase de nueves.</string>
|
||||
<string name="dialog_msg_keystore_error">Falló la carga de la clave de cifráu del almacén de claves.
|
||||
<b>Va perdese cualesquier entrada que s\'amieste.</b>\n\nPa ser entá a usar andOTP, pues
|
||||
dir a <b>Axustes</b> y cambiar el <b>cifráu de labase de datos</b> o la <b>Contraseña / PIN</b>.</string>
|
||||
<!-- Shortcuts -->
|
||||
<string name="shortcut_name_scan_qr">Escaniar códigu QR</string>
|
||||
<string name="shortcut_name_import_qr">Importar un códigu QR</string>
|
||||
<string name="shortcut_name_enter_details">Amestar a mano</string>
|
||||
</resources>
|
228
app/src/main/res/values-ast/strings_settings.xml
Normal file
228
app/src/main/res/values-ast/strings_settings.xml
Normal file
|
@ -0,0 +1,228 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="settings_activity_title">Axustes</string>
|
||||
<!-- Categories -->
|
||||
<string name="settings_category_title_security">Seguranza</string>
|
||||
<string name="settings_category_title_ui">Interfaz d\'usuariu</string>
|
||||
<string name="settings_category_title_backup">Copies de seguranza</string>
|
||||
<!-- Titles -->
|
||||
<string name="settings_title_tap_to_reveal">Tocar pa descubrir</string>
|
||||
<string name="settings_title_tap_to_reveal_timeout">Escosa del tiempu d\'espera del toque pa descubrir</string>
|
||||
<string name="settings_title_auth">Autenticación</string>
|
||||
<string name="settings_title_auth_password">Contraseña</string>
|
||||
<string name="settings_title_auth_pin">PIN</string>
|
||||
<string name="settings_title_encryption">Cifráu de la base de datos</string>
|
||||
<string name="settings_title_panic">Botón de pánicu</string>
|
||||
<string name="settings_title_relock_screen_off">Volver bloquiar al apagar la pantalla</string>
|
||||
<string name="settings_title_relock_background">Volver a bloquiar al tar en segundu planu</string>
|
||||
<string name="settings_title_auth_inactivity">Volver bloquiar na inactividá</string>
|
||||
<string name="settings_title_auth_inactivity_delay">Retrasu pal bloquéu por inactividá</string>
|
||||
<string name="settings_title_block_accessibility">Bloquiar tolos servicios d\'accesibilidá</string>
|
||||
<string name="settings_title_block_autofill">Bloquiar el rellenu automáticu</string>
|
||||
<string name="settings_title_lang">Llingua</string>
|
||||
<string name="settings_title_theme">Estilu</string>
|
||||
<string name="settings_title_card_layout">Diseñu de les tarxetes</string>
|
||||
<string name="settings_title_label_size">Tamañu de la fonte de les etiquetes</string>
|
||||
<string name="settings_title_label_scroll">Desplazar nes etiquetes</string>
|
||||
<string name="settings_title_tap_single">Un toque</string>
|
||||
<string name="settings_title_tap_double">Dos toques</string>
|
||||
<string name="settings_title_thumbnail_size_ask">Tamañu de miniatures</string>
|
||||
<string name="settings_title_split_group_size">Dixebra de los códigos</string>
|
||||
<string name="settings_title_tag_functionality">Comportamientu de la esbilla d\'etiquetes</string>
|
||||
<string name="settings_title_minimize_on_copy">Minimizar l\'aplicación dempués de compiar el códigu OTP</string>
|
||||
<string name="settings_title_search_includes">Comportamientu de la gueta</string>
|
||||
<string name="settings_title_label_highlight_token">Rescamplar los pases que caduquen</string>
|
||||
<string name="settings_title_hide_global_timeout">Anubrir la barra d\'escosa de tiempu</string>
|
||||
<string name="settings_title_show_individual_timeouts">Amosar les escoses de tiempu individuales</string>
|
||||
<string name="settings_title_backup_append_date">Amestar la data al nome del ficheru</string>
|
||||
<string name="settings_title_backup_ask">Pidir un nome de ficheru</string>
|
||||
<string name="settings_title_backup_location">Allugamientu predetermináu de les copies</string>
|
||||
<string name="settings_title_backup_password">Contraseña pa les copies de seguranza</string>
|
||||
<string name="settings_title_auto_backup_password_enc">Facer copies de seguranza al amestar entraes</string>
|
||||
<string name="settings_title_backup_broadcasts">Espardimientu de copies de seguranza</string>
|
||||
<string name="settings_title_openpgp_provider">Fornidor OpenPGP</string>
|
||||
<string name="settings_title_openpgp_key_encrypt">Clave de cifráu OpenPGP</string>
|
||||
<string name="settings_title_openpgp_key_sign">Clave de cifráu OpenPGP (opcional)</string>
|
||||
<string name="settings_title_openpgp_verify">Verificar les copies de seguranza cifraes</string>
|
||||
<string name="settings_title_special_features">Activar les carauterístiques especiales</string>
|
||||
<string name="settings_title_enable_screenshot">Activar captures de pantalla</string>
|
||||
<string name="settings_title_enable_android_backup_service">Activar la sincronización d\'Android</string>
|
||||
<string name="settings_title_clear_keystore">Llimpiar l\'almacén de claves</string>
|
||||
<!-- Descriptions -->
|
||||
<string name="settings_desc_tap_to_reveal">Anubre por defeutu los pases OTP riquiendo que se
|
||||
descubran a mano</string>
|
||||
<string name="settings_desc_tap_to_reveal_timeout">Esbilla\'l tiempu (en segundos) tres el que
|
||||
van volver anubrise les entraes
|
||||
revelaes</string>
|
||||
<string name="settings_desc_panic">Decidi lo qu\'asocede cuando s\'activa\'l botón de pánicu</string>
|
||||
<string name="settings_desc_relock_screen_off">Rique l\'autenticación dempués de que la
|
||||
pantalla del preséu s\'apague</string>
|
||||
<string name="settings_desc_relock_background">Rique l\'autenticación dempués de que l\'aplicación se
|
||||
mandare al segundu planu (por exemplu, primiendo\'l
|
||||
botón d\'Aniciu)</string>
|
||||
<string name="settings_desc_auth_inactivity">Rique l\'autenticación dempués de que\'l preséu tea
|
||||
inactivu</string>
|
||||
<string name="settings_desc_auth_inactivity_delay">Esbilla\'l tiempu (en segundos) tres el
|
||||
que va volver riquise l\'autenticación</string>
|
||||
<string name="settings_desc_block_accessibility">Anubre los campos sensibles a los
|
||||
servicios d\'accesibilidá. <b>¡NUN actives esto si uses los servicios
|
||||
d\'accesibilidá!</b></string>
|
||||
<string name="settings_desc_block_autofill">Bloquia que los servicios de rellenu automáticu
|
||||
accedan a los campos de contraseña de
|
||||
dientro de l\'aplicación</string>
|
||||
<string name="settings_desc_block_autofill_android">Esta carauterística rique Android
|
||||
8.0 (Oreo) o mayor</string>
|
||||
<string name="settings_desc_label_scroll">Desplazar les etiquetes llargues en cuentes de truncales</string>
|
||||
<string name="settings_desc_minimize_on_copy">L\'aplicación va minimizase cuando copies el códigu OTP nel cartafueyu</string>
|
||||
<string name="settings_desc_search_includes">Especifica los valores que deberíen incluyise al guetar</string>
|
||||
<string name="settings_desc_label_highlight_token">Rescampla los pases si caduquen en 8 segundos</string>
|
||||
<string name="settings_desc_hide_global_timeout">Anubre la barra d\'escosa de tiempu global de lo cimero de la pantalla</string>
|
||||
<string name="settings_desc_show_individual_timeouts">Amuesa la barra d\'escosa de tiempu en cada entrada.
|
||||
Esto pue facer que l\'aplicación vaiga lenta, activa esta opción
|
||||
namás si ye preciso.</string>
|
||||
<string name="settings_desc_backup_append_date">Amiesta la data actual al nome suxeríu de la copia
|
||||
de seguranza</string>
|
||||
<string name="settings_desc_backup_ask">Pide\'l nome de ficheru cada vegada que se crea o
|
||||
restaura una copia de seguranza</string>
|
||||
<string name="settings_desc_backup_location">Escueyi un allugamientu predetermináu pa copies de seguranza</string>
|
||||
<string name="settings_desc_backup_location_set">Escoyóse l\'allugamientu de les copies de seguranza</string>
|
||||
<string name="settings_desc_backup_password">Afita la contraseña que s\'usa pa cifrar les
|
||||
copies de seguranza</string>
|
||||
<string name="settings_desc_auto_backup_password_enc">Crea una copia de seguranza cifrada cuando
|
||||
s\'amiesten o editen entraes, si se cumplen les condiciones</string>
|
||||
<string name="settings_desc_auto_backup_requirements">Afita un allugamientu y una contraseña
|
||||
predeterminaos pa les copies de
|
||||
seguranza p\'activar esta opción</string>
|
||||
<string name="settings_desc_backup_broadcasts">Esbilla les tribes de copies de seguranza que
|
||||
puen aicionase pente aplicaciones de
|
||||
terceros col usu d\'Espardimientu</string>
|
||||
<string name="settings_desc_openpgp_key_encrypt">La direición de corréu de la clave OpenPGP usada
|
||||
pa cifrar les copies de seguranza</string>
|
||||
<string name="settings_desc_openpgp_verify">Les copies de seguranza cifraes namás s\'importen
|
||||
si tán roblaes con una clave válida</string>
|
||||
<string name="settings_desc_special_features">Toca pa volver desactivar les carauterístiques especiales</string>
|
||||
<string name="settings_desc_enable_screenshot">Permite la fechura de captures de pantalla de
|
||||
la pantalla principal (desactívase por
|
||||
defeutu por razones de seguranza)</string>
|
||||
<string name="settings_desc_enable_android_backup_service">Permite qu\'andOTP use\'l serviciu
|
||||
integráu de copies de seguranza d\'Android pa facer
|
||||
copies de seguranza de claves y preferencies</string>
|
||||
<string name="settings_desc_clear_keystore">Desanicia la clave de cifráu del almacén de claves</string>
|
||||
<!-- Toasts -->
|
||||
<string name="settings_toast_auth_device_not_secure">Esta carauterística rique una pantalla de
|
||||
desbloquéu configurada (Axustes -> Seguranza -> Pantalla de bloquéu)</string>
|
||||
<string name="settings_toast_password_empty">Nun se permite una contraseña balera,
|
||||
afita l\'autenticación a Nenguna pa desactivala.</string>
|
||||
<string name="settings_toast_encryption_changing">Tentando de camudar el cifráu de la base
|
||||
de datos, espera</string>
|
||||
<string name="settings_toast_encryption_change_success">¡El cifráu de la base de datos camudó
|
||||
con ésitu!</string>
|
||||
<string name="settings_toast_encryption_change_failed">Fallu al camudar el cifráu de la base
|
||||
de datos, volviendo al estáu orixinal</string>
|
||||
<string name="settings_toast_encryption_backup_failed">Fallu al crear una copia de
|
||||
seguranza interna, ¡albortando!</string>
|
||||
<string name="settings_toast_encryption_no_key">Fallu al consiguir la clave de cifráu, ¡albortando!</string>
|
||||
<string name="settings_toast_encryption_auth_failed">¡Falló l\'autenticación!</string>
|
||||
<string name="settings_toast_auth_upgrade_failed">Fallu al anovar dafurto la contraseña / PIN
|
||||
al cifráu nuevu, volvi afitala manualmente n\'axustes.</string>
|
||||
<string name="settings_dialog_title_warning">Alvertencia</string>
|
||||
<string name="settings_dialog_title_error">Fallu</string>
|
||||
<string name="settings_dialog_title_clear_keystore">¿Llimpiar l\'almacén de claves?</string>
|
||||
<string name="settings_dialog_title_android_sync">Sincronización d\'Android</string>
|
||||
<string name="settings_dialog_msg_encryption_change">Agora andOTP va tentar de camudar el cifráu
|
||||
de la base de datos. En casu de fallu, una copia de seguranza va restaurase y
|
||||
el cifráu nun va camudar.\n\n<b>Por embargu, siempres ye una bona idea tener una
|
||||
copia en casu de qu\'asoceda daqué inesperao.</b></string>
|
||||
<string name="settings_dialog_msg_auth_invalid_with_encryption">¡Namás pues usar una contraseña o un PIN
|
||||
mentanto\'l cifráu de la base de datos tea afitáu a «Contraseña/PIN»!</string>
|
||||
<string name="settings_dialog_msg_encryption_invalid_with_auth">¡Primero precises afitar
|
||||
l\'autenticación a «Contraseña» o «PIN»!</string>
|
||||
<string name="settings_dialog_msg_encryption_invalid_without_credentials">¡Primero precises afitar
|
||||
una contraseña o un PIN enantes de camudar el
|
||||
cifráu!</string>
|
||||
<string name="settings_dialog_msg_clear_keystore_password">En dalgunos casos, llimpiar l\'almacén
|
||||
de claves pue ayudar a iguar problemes. ¡Namás deberíes siguir si sabes lo que tas faciendo!\n\nDarréu
|
||||
que\'l <b>cifráu de la base de datos</b> s\'afitó a <b>Contraseña/PIN</b>, nun deberíes
|
||||
nengún datu (pero nun ta demás tener una copia de seguranza).\n\n<b>¿De xuru que quies
|
||||
llimpiar l\'almacén de claves?</b></string>
|
||||
<string name="settings_dialog_msg_clear_keystore_keystore">En dalgunos casos, llimpiar l\'almacén
|
||||
de claves pue ayudar a iguar problemes. ¡Namás deberíes siguir si sabes lo que tas faciendo!\n\n<b>Alvertencia</b>:
|
||||
Darréu que\'l <b>cifráu de la base de datos</b> s\'afitó a <b>Almacén de claves d\'Android</b>,
|
||||
vas perder toles cuentes. ¡Asegúrate de que tienes una copia de seguranza!\n\n<b>¿De xuru que
|
||||
quies llimpiar l\'almacén de claves?</b></string>
|
||||
<string name="settings_dialog_msg_android_sync_disabled_encryption">La sincronización d\'Android nun pue usase col
|
||||
cifráu del almacén de claves, <b>deberíes facer una
|
||||
copia de seguranza manual!</b></string>
|
||||
<!-- List entries -->
|
||||
<string-array name="settings_entries_auth">
|
||||
<item>Nenguna</item>
|
||||
<item>Contraseña</item>
|
||||
<item>PIN</item>
|
||||
<item>Credenciales del preséu</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_encryption">
|
||||
<item>Almacén de claves d\'Android</item>
|
||||
<item>Contraseña / PIN</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_panic">
|
||||
<item>Llimpiar toles cuentes</item>
|
||||
<item>Reafitar los axustes de l\'aplicación</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_card_layout">
|
||||
<item>Compautu</item>
|
||||
<item>Por defeutu</item>
|
||||
<item>Completu</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_tap">
|
||||
<item>Nada</item>
|
||||
<item>Amosar/anubrir</item>
|
||||
<item>Copiar</item>
|
||||
<item>Copiar y dir al segundu planu</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_search_includes">
|
||||
<item>Nomes</item>
|
||||
<item>Emisor</item>
|
||||
<item>Etiquetes</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_auto_backup_password_enc">
|
||||
<item>Non</item>
|
||||
<item>Entraes nueves</item>
|
||||
<item>Cualesquier edición</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_theme">
|
||||
<item>Claridá</item>
|
||||
<item>Escuridá</item>
|
||||
<item>Prietu</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_thumbnail_size">
|
||||
<item>Anúbrense</item>
|
||||
<item>Nanu</item>
|
||||
<item>Pequeñu</item>
|
||||
<item>Por defeutu</item>
|
||||
<item>Mediu</item>
|
||||
<item>Grande</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_split_group_size">
|
||||
<item>Nun dixebrar</item>
|
||||
<item>Tres dos caráuteres</item>
|
||||
<item>Tres trés caráuteres</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_tag_functionality">
|
||||
<item>Amuésense toles entraes que concasen con <b>cualesquiera</b> d\'estes etiquetes esbillaes (o)</item>
|
||||
<item>Namás s\'amuesen les entraes que concasen con <b>toles</b> etiquetes esbillaes (y)</item>
|
||||
<item>Cambéu ente etiquetes (namás se permite una etiqueta esbillada al empar)</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_backup_broadcasts">
|
||||
<item>Copies de seguranza en testu planu</item>
|
||||
<item>Copies de seguranza cifraes</item>
|
||||
</string-array>
|
||||
<!-- Special -->
|
||||
<string name="settings_lang_sys_default">Lo predeterminao del sistema</string>
|
||||
<!-- PasswordPreference -->
|
||||
<string name="settings_hint_password">Introduz una contraseña nueva</string>
|
||||
<string name="settings_hint_pin">Introduz un PIN nuevu</string>
|
||||
<string name="settings_hint_password_confirm">Confirma la contraseña</string>
|
||||
<string name="settings_hint_pin_confirm">Confirma\'l PIN</string>
|
||||
<string name="settings_label_short_password">¡La contraseña precisa ser de polo menos %1$d de llargor!</string>
|
||||
<string name="settings_label_short_pin">¡El PIN precisar ser de polo menos %1$d díxitos de llargor!</string>
|
||||
</resources>
|
|
@ -6,8 +6,8 @@
|
|||
<string name="auth_hint_pin">ПИН код</string>
|
||||
<!-- Messages -->
|
||||
<string name="auth_msg_authenticate">Моля, удостоверете се, за да стартирате andOTP!</string>
|
||||
<string name="auth_msg_confirm_encryption">Моля, удостоверете се, за да генерирате
|
||||
нов ключ за криптиране!</string>
|
||||
<string name="auth_msg_confirm_encryption">Please confirm authentication to generate your
|
||||
encryption key!</string>
|
||||
<!-- Buttons -->
|
||||
<string name="auth_button_unlock">Отключване</string>
|
||||
<!-- Toast messages -->
|
||||
|
|
|
@ -46,11 +46,6 @@
|
|||
това преди да опитате да направите резервно копие</string>
|
||||
<string name="backup_receiver_custom_encryption_failed">Криптиране на база Парола/ПИН код, не
|
||||
се поддържа с резервно копие чрез външно приложение</string>
|
||||
<string name="backup_new_format_dialog_title">Нов метод за криптиране</string>
|
||||
<string name="backup_new_format_dialog_msg">От версия 0.6.3 на andOTP, <b>нов и подобрен
|
||||
метод за криптиране</b> се използва за защитени, с парола, резервни копия. Старите резервни копия
|
||||
все още могат да бъдат импортиран, но е <b>силно препоръчително да създавате нови резервни копия с подобрен
|
||||
метод на криптиране</b>.\n\nТова съобщение няма да бъде показано отново.</string>
|
||||
<!-- Notification channels -->
|
||||
<string name="notification_channel_name_backup_failed">Автоматичното архивиране не бе успешно</string>
|
||||
<string name="notification_channel_name_backup_success">Автоматичното архивиране е успешно</string>
|
||||
|
@ -59,7 +54,9 @@
|
|||
<string name="notification_channel_desc_backup_success">Тези известия се показват, когато
|
||||
автоматичното архивиране е успешно</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="backup_toast_mkdir_failed">Неуспешно създаване на директория за резервни копия</string>
|
||||
<string name="backup_toast_no_location">Please set a default backup location in the settings!</string>
|
||||
<string name="backup_toast_location_access_failed">Failed to access backup location!</string>
|
||||
<string name="backup_toast_file_creation_failed">Failed to create backup file!</string>
|
||||
<string name="backup_toast_export_success">Експортирането във външно хранилище е успешно</string>
|
||||
<string name="backup_toast_export_failed">Експортирането в външно хранилище е неуспешно</string>
|
||||
<string name="backup_toast_import_success">Импортиране от външно хранилище е успешно</string>
|
||||
|
@ -67,7 +64,6 @@
|
|||
<string name="backup_toast_import_decryption_failed">Декриптирането на архива не бе успешно</string>
|
||||
<string name="backup_toast_import_no_entries">Няма намерени записи в импортираните данни</string>
|
||||
<string name="backup_toast_storage_not_accessible">В момента външното хранилище не е достъпно</string>
|
||||
<string name="backup_toast_storage_permissions">Разрешението за съхранение не е предоставено</string>
|
||||
<string name="backup_toast_openpgp_error">OpenPGP Грешка: %s</string>
|
||||
<string name="backup_toast_openpgp_not_verified">Не е открит проверен подпис</string>
|
||||
<string name="backup_toast_crypt_password_not_set">Паролата не е зададена, проверете в <b>Настройки</b></string>
|
||||
|
|
|
@ -45,6 +45,13 @@
|
|||
<string name="menu_popup_change_image">Промяна на изображението</string>
|
||||
<string name="menu_popup_remove">Премахване</string>
|
||||
<string name="menu_popup_show_qr_code">Показване на QR кода</string>
|
||||
<!-- Buttons -->
|
||||
<string name="button_card_options">More options</string>
|
||||
<string name="button_card_options_format">More options for %1$s</string>
|
||||
<string name="button_card_copy">Copy token</string>
|
||||
<string name="button_card_copy_format">Copy %1$s token</string>
|
||||
<string name="button_add">Add new account</string>
|
||||
<string name="button_close_menu">Close menu</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="toast_auth_failed">Неуспешно удостоверяване. Моля, опитайте отново!</string>
|
||||
<string name="toast_auth_failed_fatal">Неуспешно удостоверяване, затваряне на andOTP!</string>
|
||||
|
@ -71,7 +78,6 @@
|
|||
<string name="dialog_title_used_tokens">Използване на токените</string>
|
||||
<string name="dialog_title_keystore_error">Грешка в Хранилището за ключове на Android</string>
|
||||
<string name="dialog_title_qr_code">QR код</string>
|
||||
<string name="dialog_title_android21_depreaction">Остаряло известие</string>
|
||||
<string name="dialog_title_enter_password">Въведете парола</string>
|
||||
<string name="dialog_label_enter_password">Въведете парола</string>
|
||||
<string name="dialog_label_confirm_password">Потвърдете паролата</string>
|
||||
|
@ -83,11 +89,6 @@
|
|||
<string name="dialog_msg_keystore_error">Неуспешно зареждане на ключа за шифроване от Хранилище за ключове на Android.
|
||||
<b>Всички добавени записи ще се загубят.</b>\n\nЗа да продължите да използвате andOTP, можете да отидете
|
||||
в <b>Настройки</b> и да превключете <b>Криптиране на базата данни</b> на <b>Парола / ПИН код</b>.</string>
|
||||
<string name="dialog_msg_android21_deprecation">Това ще бъде последната поддържана версия на andOTP за
|
||||
версия на Android под 5.1 (Lollipop). Увеличените усилия, необходими за поддържане на
|
||||
отделно приложение за съхранение, само за тези по-стари версии, както и за техния нисък пазар на
|
||||
споделянията, правят непрекъснатата поддръжка невъзможна за нашия малък екип. \n\nТова съобщение няма да бъде
|
||||
показани отново.</string>
|
||||
<!-- Shortcuts -->
|
||||
<string name="shortcut_name_scan_qr">Сканиране на QR кода</string>
|
||||
<string name="shortcut_name_import_qr">Импортиране на QR код</string>
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
<string name="settings_title_auth_inactivity">Повторно заключване при бездействие</string>
|
||||
<string name="settings_title_auth_inactivity_delay">Забавяне за повторно заключване при неактивност</string>
|
||||
<string name="settings_title_block_accessibility">Блокиране на услугите за достъпност</string>
|
||||
<string name="settings_title_block_autofill">Block autofill</string>
|
||||
<string name="settings_title_lang">Език</string>
|
||||
<string name="settings_title_theme">Тема</string>
|
||||
<string name="settings_title_card_layout">Вид оформление</string>
|
||||
|
@ -35,7 +36,7 @@
|
|||
<string name="settings_title_show_individual_timeouts">Показване на индивидуални времена за изчакване</string>
|
||||
<string name="settings_title_backup_append_date">Добавяне на датата към името на файла</string>
|
||||
<string name="settings_title_backup_ask">Попитай за името на файла</string>
|
||||
<string name="settings_title_backup_directory">Директория за резервни копия</string>
|
||||
<string name="settings_title_backup_location">Default backup location</string>
|
||||
<string name="settings_title_backup_password">Парола за резервни копия</string>
|
||||
<string name="settings_title_auto_backup_password_enc">Автоматично архивиране на нови записи</string>
|
||||
<string name="settings_title_backup_broadcasts">Резервная копия с помощта на външни приложения</string>
|
||||
|
@ -63,6 +64,10 @@
|
|||
изисква повторно удостоверяване</string>
|
||||
<string name="settings_desc_block_accessibility">Скриване на чувствителни полета от услугите
|
||||
за достъпност. <b>НЕ активирайте това, ако използвате услугите за достъпност!</b></string>
|
||||
<string name="settings_desc_block_autofill">Block autofill services from accessing password
|
||||
fields inside the app</string>
|
||||
<string name="settings_desc_block_autofill_android">This feature requires an Android version
|
||||
above 8.0 (Oreo)</string>
|
||||
<string name="settings_desc_label_scroll">Превъртане на дългите етикети, вместо да бъдат съкращавани</string>
|
||||
<string name="settings_desc_minimize_on_copy">Приложението ще бъде минимизирано, когато копирате OTP токенът в клипборда</string>
|
||||
<string name="settings_desc_search_includes">Посочете кои стойности трябва да бъдат включени при търсенето</string>
|
||||
|
@ -75,10 +80,14 @@
|
|||
<string name="settings_desc_backup_ask">Попитайте за името на файла всеки път, когато се създаде или възстановява
|
||||
резервно копие
|
||||
</string>
|
||||
<string name="settings_desc_backup_location">Choose a default backup location</string>
|
||||
<string name="settings_desc_backup_location_set">Backup location has been chosen</string>
|
||||
<string name="settings_desc_backup_password">Задайте паролата, която да се използва за криптиране на
|
||||
резервните копия</string>
|
||||
<string name="settings_desc_auto_backup_password_enc">Създаване на ново криптирано резервно копие, когато новите
|
||||
записи се добавят или редактират, ако са изпълнени условията за настройките</string>
|
||||
<string name="settings_desc_auto_backup_requirements">Set a default backup location and a
|
||||
backup password to enable this option</string>
|
||||
<string name="settings_desc_backup_broadcasts">Изберете какви типове резервни копия могат да бъдат запазени от
|
||||
приложения на трети страни за създаване на резервно копие</string>
|
||||
<string name="settings_desc_openpgp_key_encrypt">Пощенски адрес на OpenPGP ключа, използван за криптиране на
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<string name="about_label_source">Codi font</string>
|
||||
<string name="about_label_version">Versió</string>
|
||||
<string name="about_label_faq">FAQ</string>
|
||||
<string name="about_label_faq_long">Frequently asked questions</string>
|
||||
<string name="about_label_faq_long">Qüestions freqüents</string>
|
||||
<!-- Authors -->
|
||||
<string name="about_title_authors">Autors</string>
|
||||
<string name="about_label_main_developer">Programador principal</string>
|
||||
|
@ -19,22 +19,22 @@
|
|||
<string name="about_label_original_author">Autor de l\'aplicació original</string>
|
||||
<string name="about_label_original_app">Aplicació original</string>
|
||||
<string name="about_label_website">Lloc web</string>
|
||||
<string name="about_label_donate">Donar</string>
|
||||
<string name="about_label_donate">Feu una donació</string>
|
||||
<string name="about_label_contributors">Col·laboradors</string>
|
||||
<string name="about_label_translators">Traductors</string>
|
||||
<!-- Thumbnail disclaimer -->
|
||||
<string name="about_title_thumbnail_disclaimer">Avís miniatura</string>
|
||||
<string name="about_thumbnails_disclaimer_no1"><b>1.</b> totes les miniatures són marques registrades dels seus
|
||||
<string name="about_title_thumbnail_disclaimer">Avís sobre les miniatures</string>
|
||||
<string name="about_thumbnails_disclaimer_no1"><b>1.</b> Totes les miniatures són marques registrades dels seus
|
||||
respectius propietaris.</string>
|
||||
<string name="about_thumbnails_disclaimer_no2"><b>2.</b> l\'ús de les marques comercials no
|
||||
indica aprovació del titular de la marca per andOTP, ni viceversa.</string>
|
||||
<string name="about_thumbnails_disclaimer_no3"><b>3.</b> Miniatures només usades per
|
||||
representar l\'empresa o producte al qual es refereixen.</string>
|
||||
<string name="about_thumbnails_disclaimer_no4"><b>4. No utilitzeu miniatures per a qualsevol propòsit
|
||||
excepte per representar aquella marca determinada o servei.</b></string>
|
||||
<string name="about_thumbnails_disclaimer_no2"><b>2.</b> L\'ús de les marques comercials no
|
||||
indica aprovació del titular de la marca per part d\'andOTP, ni viceversa.</string>
|
||||
<string name="about_thumbnails_disclaimer_no3"><b>3.</b> Les miniatures només s\'haurien de fer servir per a
|
||||
representar l\'empresa o producte al qual es fan referència.</string>
|
||||
<string name="about_thumbnails_disclaimer_no4"><b>4. No utilitzeu les miniatures per a cap altre propòsit que no sigui
|
||||
representar aquella marca determinada o servei.</b></string>
|
||||
<!-- Support -->
|
||||
<string name="about_title_support">Doneu suport al desenvolupament</string>
|
||||
<string name="about_desc_support">Find out how you can support the development of andOTP</string>
|
||||
<string name="about_desc_support">Vegeu com podeu donar suport al desenvolupament d\'andOTP</string>
|
||||
<string name="about_title_special_features">Característiques especials</string>
|
||||
<string name="about_dialog_special_features">Esteu segur que voleu habilitar les característiques
|
||||
especials? La major part són algorismes OTP no estàndard que es van implementar
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<string name="auth_hint_pin">PIN</string>
|
||||
<!-- Messages -->
|
||||
<string name="auth_msg_authenticate">Per favor, autentiqueu-vos per a iniciar andOTP!</string>
|
||||
<string name="auth_msg_confirm_encryption">Per favor, confirmeu la vostra autenticació per a generar
|
||||
<string name="auth_msg_confirm_encryption">Per favor, confirmeu l\'autenticació per a generar
|
||||
la clau de xifratge nova!</string>
|
||||
<!-- Buttons -->
|
||||
<string name="auth_button_unlock">Desbloqueja</string>
|
||||
|
|
|
@ -20,15 +20,14 @@
|
|||
<string name="backup_desc_import_crypt_old">Restaura el conte desde un ficher JSON protegit amb contrasenya
|
||||
creat amb <b>una versió de andOTP prévia a 0.6.3</b></string>
|
||||
<string name="backup_desc_import_openpgp">Restaura els comptes d\'un fitxer JSON xifrat amb OpenPGP</string>
|
||||
<string name="backup_desc_crypt_setup">Failed to load the backup password from the <b>Settings</b>,
|
||||
this either means no password was set or something went wrong. You will be asked to enter
|
||||
the password manually when creating or importing a backup.
|
||||
<string name="backup_desc_crypt_setup">No ha estat possible carregar la còpia de seguretat de la contrasenya de <b>Preferències</b>,
|
||||
això pot ser perquè no hi ha cap contrasenya o perquè alguna cosa ha fallat. Haureu d\'escriure
|
||||
la contrasenya manualment quan creeu o importeu una còpia de seguretat. </string>
|
||||
<string name="backup_desc_openpgp_provider">Cal instal·lar un programa OpenPGP i habilitar-lo
|
||||
a <b>Preferències</b> per a fer servir aquesta característica.
|
||||
</string>
|
||||
<string name="backup_desc_openpgp_provider">You need to install an OpenPGP provider and enable
|
||||
it in the <b>Settings</b> to use this feature.
|
||||
</string>
|
||||
<string name="backup_desc_openpgp_keyid">You need to select an OpenPGP key in the <b>Settings</b>
|
||||
before you can create encrypted backups.
|
||||
<string name="backup_desc_openpgp_keyid">Cal triar una clau OpenPGP a <b>Preferències</b>
|
||||
per a poder crear còpies xifrades.
|
||||
</string>
|
||||
<string name="backup_desc_replace">Si està activat les entrades antigues són substituïdes quan s\'importa una
|
||||
còpia de seguretat i només hi queda la còpia. Si no, les entrades velles i les còpies de seguretat
|
||||
|
@ -38,32 +37,29 @@
|
|||
<string name="backup_dialog_msg_export_warning">Realment voleu exportar la base de dades com a
|
||||
fitxer de text net JSON? Aquest fitxer contindrà les vostres claus secretes; per favor, manteniu-lo <b>ben protegit</b>!
|
||||
</string>
|
||||
<string name="backup_receiver_title_backup_failed">Backup failed</string>
|
||||
<string name="backup_receiver_title_backup_success">Backup successful</string>
|
||||
<string name="backup_receiver_plain_disabled">Plain-text backups are currently not allowed,
|
||||
please go to the Settings to enable them</string>
|
||||
<string name="backup_receiver_encrypted_disabled">Encrypted backups are currently not allowed,
|
||||
please go to the Settings to enable them</string>
|
||||
<string name="backup_receiver_title_backup_failed">La còpia de seguretat ha fallat</string>
|
||||
<string name="backup_receiver_title_backup_success">S\'ha realitzat la còpia de seguretat</string>
|
||||
<string name="backup_receiver_plain_disabled">Les còpies de seguretat en text pla no són permeses,
|
||||
podeu activar-les a Preferències</string>
|
||||
<string name="backup_receiver_encrypted_disabled">Les còpies de seguretat xifrades no són permeses,
|
||||
podeu activar-les a Preferències</string>
|
||||
<string name="backup_receiver_read_permission_failed">Read permission not granted, please do
|
||||
this before attempting backup</string>
|
||||
<string name="backup_receiver_write_permission_failed">Write permission not granted, please do
|
||||
this before attempting backup</string>
|
||||
<string name="backup_receiver_custom_encryption_failed">Password/PIN based encryption not
|
||||
supported with broadcast backup</string>
|
||||
<string name="backup_new_format_dialog_title">New encryption method</string>
|
||||
<string name="backup_new_format_dialog_msg">Since version 0.6.3 of andOTP, a <b>new and improved
|
||||
encryption method</b> is used for password-protected backups. The old backups can still be
|
||||
imported, but it is <b>highly recommended to create new backups with the improved
|
||||
encryption</b>.\n\nThis message will not be shown again.</string>
|
||||
<!-- Notification channels -->
|
||||
<string name="notification_channel_name_backup_failed">Automatic backup failed</string>
|
||||
<string name="notification_channel_name_backup_success">Automatic backup successful</string>
|
||||
<string name="notification_channel_desc_backup_failed">These notifications are shown when an
|
||||
automatic backup has failed for some reason</string>
|
||||
<string name="notification_channel_desc_backup_success">These notifications are shown when an
|
||||
automatic backup was successful</string>
|
||||
<string name="notification_channel_name_backup_failed">La còpia de seguretat automàtica ha fallat</string>
|
||||
<string name="notification_channel_name_backup_success">La còpia de seguretat automàtica s\'ha realitzat</string>
|
||||
<string name="notification_channel_desc_backup_failed">Aquestes notificacions es mostres quan la
|
||||
còpia de seguretat automàtica falla</string>
|
||||
<string name="notification_channel_desc_backup_success">Aquests notificacions es mostren quan la
|
||||
còpia de seguretat reïx</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="backup_toast_mkdir_failed">No ha pogut crear el directori de còpia de seguretat</string>
|
||||
<string name="backup_toast_no_location">Per favor, configureu la localització per defecte de les còpies de seguretat!</string>
|
||||
<string name="backup_toast_location_access_failed">No ha estat possible accedir a la localització de les còpies de seguretat!</string>
|
||||
<string name="backup_toast_file_creation_failed">No ha estat possible crear el fitxer de còpia de seguretat!</string>
|
||||
<string name="backup_toast_export_success">Exportació a l\'emmagatzematge extern correcta</string>
|
||||
<string name="backup_toast_export_failed">L\'exportació a emmagatzematge extern ha fallat</string>
|
||||
<string name="backup_toast_import_success">Importació des de l\'emmagatzematge extern correcta</string>
|
||||
|
@ -71,9 +67,8 @@
|
|||
<string name="backup_toast_import_decryption_failed">El desxifratge de la còpia ha fallat</string>
|
||||
<string name="backup_toast_import_no_entries">No s\'han trobat cap entrada en les dades importades</string>
|
||||
<string name="backup_toast_storage_not_accessible">L\'emmagatzematge extern no és accessible actualment</string>
|
||||
<string name="backup_toast_storage_permissions">Permisos d\'emmagatzematge no concedits</string>
|
||||
<string name="backup_toast_openpgp_error">Error OpenPGP: %s</string>
|
||||
<string name="backup_toast_openpgp_not_verified">No s\'ha detectat cap signatura verificada</string>
|
||||
<string name="backup_toast_crypt_password_not_set">Password not set, check the <b>Settings</b></string>
|
||||
<string name="backup_toast_file_selection_failed">Can\'t open file selection dialog!</string>
|
||||
<string name="backup_toast_crypt_password_not_set">No hi ha cap contrasenya establerta, comproveu les <b>Preferències</b></string>
|
||||
<string name="backup_toast_file_selection_failed">No ha estat possible obrir el diàleg de seleccio de fitxers!</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,36 +1,38 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="intro_slide1_title">Let\'s get started</string>
|
||||
<string name="intro_slide1_desc">Welcome to <b>andOTP</b>, this wizard will guide you through
|
||||
the initial setup. Please pay attention and read carefully otherwise you could lose data!
|
||||
\n\nDon\'t worry, you can still change any of the options later in the <b>Settings</b>.</string>
|
||||
<string name="intro_slide2_desc">To ensure the security of your accounts <b>andOTP</b> only
|
||||
stores them in encrypted data files. Here you can choose which method of encryption will be
|
||||
used.</string>
|
||||
<string name="intro_slide2_desc_keystore">The KeyStore is a system component of Android for
|
||||
securely storing cryptographic keys. The advantage of this method is that the keys are
|
||||
stored separated from the data files and can be backed by hardware cryptography (if your
|
||||
device supports it). However, as the keys are not stored with the apps data, <b>this method
|
||||
prevents external backup solutions (like Titanium) from working</b>. If you choose this
|
||||
method you will have to rely on the internal backup functions provided by <b>andOTP</b>.
|
||||
\n\n<b>Warning</b>: The KeyStore is known to cause a lot of problems, please only use it if
|
||||
you absolutely have to. If you don\'t mind entering a password / PIN every time you start
|
||||
<b>andOTP</b> it is <b>highly recommended to use the password-based encryption instead</b>.</string>
|
||||
<string name="intro_slide1_title">Comencem</string>
|
||||
<string name="intro_slide1_desc">Benvinguda a <b>andOTP</b>! Aquest assistents us guiarà en el
|
||||
procés de configuració inicial. Pareu atenció i llegiu atentament per tal d\'evitar la pèrdua de dades.
|
||||
\n\nNo patiu, podreu canviar qualsevol opció a <b>Preferències</b>.</string>
|
||||
<string name="intro_slide2_desc">Per tal de garantir la seguretat dels vostres comptes, <b>andOTP</b> fa servir
|
||||
xifratge per a desar les dades. Aquí podeu triar el mètode de xifratge que
|
||||
s\'hi farà servir.</string>
|
||||
<string name="intro_slide2_desc_keystore">The KeyStore is a system component of Android used to
|
||||
securely store cryptographic keys. The advantage of using the KeyStore is that the keys are
|
||||
stored separately from <b>andOTP</b>\'s data, and can be backed by hardware-based encryption
|
||||
(if your device supports it). However, as the keys are not stored with <b>andOTP</b>\'s data,
|
||||
<b>this method prevents external backup solutions (like Titanium) from working</b>. If you
|
||||
choose this method, you will have to rely on the internal backup functions provided by
|
||||
<b>andOTP</b>.\n\n<b>Warning</b>: The KeyStore is known to cause many problems, so
|
||||
please only use it if you absolutely have to. If you don\'t mind entering a password / PIN
|
||||
every time you start <b>andOTP</b>, it is <b>highly recommended to use the password-based
|
||||
encryption instead</b>.</string>
|
||||
<string name="intro_slide2_desc_password">This method will encrypt your data with a key
|
||||
generated from a password or PIN. The main advantage here is that this will work with
|
||||
external backup solutions (like Titanium) and is much less failure-prone than the KeyStore.
|
||||
However, you will have to enter your credentials every time you start <b>andOTP</b>.</string>
|
||||
<string name="intro_slide3_desc_keystore">Here you can setup an authentication to lock
|
||||
<b>andOTP</b>. Since you have chosen <b>Android KeyStore</b> as encryption method this is
|
||||
optional.</string>
|
||||
<string name="intro_slide3_desc_password">Here you can setup an authentication to lock
|
||||
<b>andOTP</b>. Since you have chosen <b>Password / PIN</b> as encryption method you need to
|
||||
set either a password or a PIN to proceed.</string>
|
||||
generated from a password or PIN. The main advantage of using this method is that external
|
||||
backup solutions (like Titanium) will work as expected, and it is much less failure-prone
|
||||
than the KeyStore. However, you will have to enter your credentials every time you start
|
||||
<b>andOTP</b>.</string>
|
||||
<string name="intro_slide3_desc_keystore">Here you can setup an authentication method to lock
|
||||
<b>andOTP</b>. Since you have chosen <b>Android KeyStore</b> as your encryption method, this
|
||||
step is optional.</string>
|
||||
<string name="intro_slide3_desc_password">Here you can setup an authentication method to lock
|
||||
<b>andOTP</b>. Since you have chosen <b>Password / PIN</b> as your encryption method, a
|
||||
password or a PIN must be set to proceed.</string>
|
||||
<string name="intro_slide3_warn_no_password">Please set a password to continue!</string>
|
||||
<string name="intro_slide3_warn_no_pin">Please set a PIN to continue!</string>
|
||||
<string name="intro_slide3_warn_confirm_password">Please confirm your password to continue!</string>
|
||||
<string name="intro_slide3_warn_confirm_pin">Please confirm your PIN to continue!</string>
|
||||
<string name="intro_slide4_title">Finished</string>
|
||||
<string name="intro_slide4_desc">Your settings have been saved, you are all set to use
|
||||
<b>andOTP</b> now!</string>
|
||||
<string name="intro_slide4_desc">Your settings have been saved, you are now all set to use
|
||||
<b>andOTP</b>!</string>
|
||||
</resources>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<string name="button_settings">Configuració</string>
|
||||
<string name="button_all_tags">Totes les etiquetes</string>
|
||||
<string name="button_no_tags">Sense etiquetes</string>
|
||||
<string name="button_qr_from_image">QR code from image</string>
|
||||
<string name="button_qr_from_image">codi QR de la imatge</string>
|
||||
<!-- Custom formatting -->
|
||||
<string name="format_custom_period">%d s</string>
|
||||
<!-- Hints -->
|
||||
|
@ -22,7 +22,7 @@
|
|||
<string name="label_period">Període</string>
|
||||
<string name="label_digits">Dígits</string>
|
||||
<string name="label_counter">Comptador</string>
|
||||
<string name="label_issuer">Issuer</string>
|
||||
<string name="label_issuer">Emissor</string>
|
||||
<string name="label_label">Etiqueta</string>
|
||||
<string name="label_algorithm">Algorisme</string>
|
||||
<string name="label_tags">Etiquetes</string>
|
||||
|
@ -37,14 +37,21 @@
|
|||
<string name="menu_main_settings">Configuració</string>
|
||||
<string name="menu_main_sort">Ordena</string>
|
||||
<string name="menu_sort_none">Sense ordenar</string>
|
||||
<string name="menu_sort_issuer">Issuer</string>
|
||||
<string name="menu_sort_issuer">Emissor</string>
|
||||
<string name="menu_sort_label">Etiqueta</string>
|
||||
<string name="menu_sort_last_used">Últimes utilitzades</string>
|
||||
<string name="menu_sort_most_used">Most used</string>
|
||||
<string name="menu_popup_edit">Edit</string>
|
||||
<string name="menu_sort_most_used">Més utilitzades</string>
|
||||
<string name="menu_popup_edit">Edita</string>
|
||||
<string name="menu_popup_change_image">Canvia la imatge</string>
|
||||
<string name="menu_popup_remove">Suprimeix</string>
|
||||
<string name="menu_popup_show_qr_code">Show QR Code</string>
|
||||
<string name="menu_popup_show_qr_code">Mostra el codi QR</string>
|
||||
<!-- Buttons -->
|
||||
<string name="button_card_options">Més opcions</string>
|
||||
<string name="button_card_options_format">Més opcions per a %1$s</string>
|
||||
<string name="button_card_copy">Copia el testimoni</string>
|
||||
<string name="button_card_copy_format">Copia el testimoni de %1$s</string>
|
||||
<string name="button_add">Afegeix un compte nou</string>
|
||||
<string name="button_close_menu">Tanca el menú</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="toast_auth_failed">Error d\'autenticació. Torneu-ho a intentar!</string>
|
||||
<string name="toast_auth_failed_fatal">L\'autenticació ha fallat, andOTP es tancarà!</string>
|
||||
|
@ -52,44 +59,38 @@
|
|||
<string name="toast_entry_exists">Aquest element ja existeix</string>
|
||||
<string name="toast_invalid_qr_code">Codi QR no vàlid</string>
|
||||
<string name="toast_encryption_key_empty">No s\'ha carregat la clau de xifratge</string>
|
||||
<string name="toast_intent_creation_failed">Invalid intent-provided code</string>
|
||||
<string name="toast_intent_creation_succeeded">Intent-provided code added</string>
|
||||
<string name="toast_file_load_error">Could not open the file</string>
|
||||
<string name="toast_qr_error">Could not find/confirm QR code</string>
|
||||
<string name="toast_qr_checksum_exception">Checksum verification failed while decoding QR code</string>
|
||||
<string name="toast_qr_format_error">Format error in QR code</string>
|
||||
<string name="toast_qr_unsuported">QR Code not supported</string>
|
||||
<string name="toast_qr_failed_to_generate">Failed to generate QR Code</string>
|
||||
<string name="toast_intent_creation_failed">El codi passat per l\'aplicació no és vàlid</string>
|
||||
<string name="toast_intent_creation_succeeded">S\'ha afegit un codi proporcionat per una aplicació</string>
|
||||
<string name="toast_file_load_error">No ha estat possible obrir el fitxer</string>
|
||||
<string name="toast_qr_error">No ha estat possible trobar/confirmar el codi QR</string>
|
||||
<string name="toast_qr_checksum_exception">La suma de verificació ha fallat mentre descodificava el QR</string>
|
||||
<string name="toast_qr_format_error">Error de format en el codi QR</string>
|
||||
<string name="toast_qr_unsuported">Codi QR no suportat</string>
|
||||
<string name="toast_qr_failed_to_generate">La generació del codi QR ha fallat</string>
|
||||
<!-- Errors -->
|
||||
<string name="error_invalid_secret">Invalid secret</string>
|
||||
<string name="error_invalid_secret">Clau invàlida</string>
|
||||
<!-- Dialogs -->
|
||||
<string name="dialog_title_auth">Autentica</string>
|
||||
<string name="dialog_title_manual_entry">Introduïu-ne els detalls</string>
|
||||
<string name="dialog_title_remove">Suprimeix</string>
|
||||
<string name="dialog_title_rename">Canvia el nom</string>
|
||||
<string name="dialog_title_counter">Comptador</string>
|
||||
<string name="dialog_title_used_tokens">Tokens usage</string>
|
||||
<string name="dialog_title_used_tokens">Ús de testimonis</string>
|
||||
<string name="dialog_title_keystore_error">Error al magatzem de claus</string>
|
||||
<string name="dialog_title_qr_code">QR Code</string>
|
||||
<string name="dialog_title_android21_depreaction">Deprecation notice</string>
|
||||
<string name="dialog_title_qr_code">Codi QR</string>
|
||||
<string name="dialog_title_enter_password">Introduïu la contrasenya</string>
|
||||
<string name="dialog_label_enter_password">Introduïu la contrasenya</string>
|
||||
<string name="dialog_label_confirm_password">Confirmeu la contrasenya</string>
|
||||
<string name="dialog_msg_auth">Per favor, introduïu les vostres credencials per a iniciar andOTP.</string>
|
||||
<string name="dialog_msg_confirm_delete">Segur que voleu suprimir el compte \"%1$s\"?</string>
|
||||
<string name="dialog_msg_used_tokens">andOTP will track when you use your tokens (using the \"Tap
|
||||
to reveal\" feature or copying to clipboard) to be able to sort them by \"Most used\" or
|
||||
\"Last used\".\n\nThis message will not be shown again.</string>
|
||||
<string name="dialog_msg_used_tokens">andOTP registrarà quan feu servir els testimonis (quan feu servir
|
||||
«Toqueu per a mostrar» o copieu al portaretalls) per tal d\'ordenar-los per nombre d\'usos o
|
||||
últim ús.\n\nAquest missatge no tornarà a aparèixer.</string>
|
||||
<string name="dialog_msg_keystore_error">No s\'ha pogut carregar la clau de xifratge del KeyStore.
|
||||
<b>Qualsevol entrada que s\'hi hagin afegit es perdrà.</b>\n\nPer a continuar usant andOTP, podeu
|
||||
anar a la <b>Configuració</b> i canviar el <b>xifratge de la base de dades</b> a <b>Contrasenyes / PIN</b>.</string>
|
||||
<string name="dialog_msg_android21_deprecation">This will be the last version of andOTP to
|
||||
support Android versions below 5.1 (Lollipop). The increased effort required to maintain a
|
||||
separate storage implementation just for those older versions as well as their low market
|
||||
shares make a continued support infeasible for our small team.\n\nThis message will not be
|
||||
shown again.</string>
|
||||
<!-- Shortcuts -->
|
||||
<string name="shortcut_name_scan_qr">Escaneja un codi QR</string>
|
||||
<string name="shortcut_name_import_qr">Import QR code</string>
|
||||
<string name="shortcut_name_import_qr">Importa un codi QR</string>
|
||||
<string name="shortcut_name_enter_details">Introduïu-ne els detalls</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="settings_activity_title">Configuració</string>
|
||||
<string name="settings_activity_title">Preferències</string>
|
||||
<!-- Categories -->
|
||||
<string name="settings_category_title_security">Seguretat</string>
|
||||
<string name="settings_category_title_ui">Interfície d\'usuari</string>
|
||||
|
@ -13,35 +13,36 @@
|
|||
<string name="settings_title_auth_pin">PIN</string>
|
||||
<string name="settings_title_encryption">Xifratge de la base de dades</string>
|
||||
<string name="settings_title_panic">Botó del pànic</string>
|
||||
<string name="settings_title_relock_screen_off">Re-lock on screen off</string>
|
||||
<string name="settings_title_relock_background">Re-lock when going into the background</string>
|
||||
<string name="settings_title_auth_inactivity">Re-lock on inactivity</string>
|
||||
<string name="settings_title_auth_inactivity_delay">Delay for inactivity re-lock</string>
|
||||
<string name="settings_title_block_accessibility">Block accessibility services</string>
|
||||
<string name="settings_title_relock_screen_off">Torna a blocar quan s\'apaga la pantalla</string>
|
||||
<string name="settings_title_relock_background">Torna a blocar quan l\'aplicació va a segon pla</string>
|
||||
<string name="settings_title_auth_inactivity">Torna a blocar després d\'un període d\'inactivitat</string>
|
||||
<string name="settings_title_auth_inactivity_delay">Temps d\'espera per al blocat per inactivitat</string>
|
||||
<string name="settings_title_block_accessibility">Bloca els serveis d\'accessibilitat</string>
|
||||
<string name="settings_title_block_autofill">Bloca l\'emplenament automàtic</string>
|
||||
<string name="settings_title_lang">Idioma</string>
|
||||
<string name="settings_title_theme">Tema</string>
|
||||
<string name="settings_title_card_layout">Card layout</string>
|
||||
<string name="settings_title_card_layout">Disposició de les targetes</string>
|
||||
<string name="settings_title_label_size">Mida de la lletra de l\'etiqueta</string>
|
||||
<string name="settings_title_label_scroll">Permet el desplaçament a les etiquetes</string>
|
||||
<string name="settings_title_tap_single">Single-tap</string>
|
||||
<string name="settings_title_tap_double">Double-tap</string>
|
||||
<string name="settings_title_tap_single">Un toc</string>
|
||||
<string name="settings_title_tap_double">Doble toc</string>
|
||||
<string name="settings_title_thumbnail_size_ask">Mida de la miniatura</string>
|
||||
<string name="settings_title_split_group_size">Separa el testimoni amb espais</string>
|
||||
<string name="settings_title_tag_functionality">Tag selection behavior</string>
|
||||
<string name="settings_title_minimize_on_copy">Minimize app after copying OTP</string>
|
||||
<string name="settings_title_search_includes">Search behavior</string>
|
||||
<string name="settings_title_label_highlight_token">Highlight expiring tokens</string>
|
||||
<string name="settings_title_hide_global_timeout">Hide global timeout bar</string>
|
||||
<string name="settings_title_show_individual_timeouts">Show individual timeouts</string>
|
||||
<string name="settings_title_backup_append_date">Append date to filename</string>
|
||||
<string name="settings_title_tag_functionality">Comportament de la selecció de les etiquetes</string>
|
||||
<string name="settings_title_minimize_on_copy">Minimitza l\'aplicació després de copiar l\'OTP</string>
|
||||
<string name="settings_title_search_includes">Comportament de la cerca</string>
|
||||
<string name="settings_title_label_highlight_token">Destaca els testimonis que caduquen</string>
|
||||
<string name="settings_title_hide_global_timeout">Amaga la barra global de temps d\'espera</string>
|
||||
<string name="settings_title_show_individual_timeouts">Mostra els temps d\'espera individuals</string>
|
||||
<string name="settings_title_backup_append_date">Afegeix la data al nom del fitxer</string>
|
||||
<string name="settings_title_backup_ask">Demana el nom de fitxer</string>
|
||||
<string name="settings_title_backup_directory">Directori de còpia de seguretat</string>
|
||||
<string name="settings_title_backup_location">Localització per defecte per a les còpies de seguretat</string>
|
||||
<string name="settings_title_backup_password">Contrasenya de la còpia de seguretat</string>
|
||||
<string name="settings_title_auto_backup_password_enc">Automatically backup on new entries</string>
|
||||
<string name="settings_title_auto_backup_password_enc">Fes una còpia de seguretat en crear una nova entrada</string>
|
||||
<string name="settings_title_backup_broadcasts">Backup Broadcasts</string>
|
||||
<string name="settings_title_openpgp_provider">OpenPGP provider</string>
|
||||
<string name="settings_title_openpgp_key_encrypt">OpenPGP encryption key</string>
|
||||
<string name="settings_title_openpgp_key_sign">OpenPGP signing key (optional)</string>
|
||||
<string name="settings_title_openpgp_provider">Proveïdor d’OpenPGP</string>
|
||||
<string name="settings_title_openpgp_key_encrypt">Clau de xifrat d\'OpenPGP</string>
|
||||
<string name="settings_title_openpgp_key_sign">Clau de signat d\'OpenPGP (opcional)</string>
|
||||
<string name="settings_title_openpgp_verify">Verifica les còpies de seguretat xifrades</string>
|
||||
<string name="settings_title_special_features">Habilita les característiques especials</string>
|
||||
<string name="settings_title_enable_screenshot">Permet screenshots</string>
|
||||
|
@ -53,41 +54,49 @@
|
|||
<string name="settings_desc_tap_to_reveal_timeout">Indiqueu durant quant de temps (en segons)
|
||||
es mostraran les entrades</string>
|
||||
<string name="settings_desc_panic">Decidiu què fer quan es prem el botó del pànic</string>
|
||||
<string name="settings_desc_relock_screen_off">Require authentication after the devices screen
|
||||
has been turned off</string>
|
||||
<string name="settings_desc_relock_background">Require authentication after the app was sent to
|
||||
the background (e.g. by pressing the home button)</string>
|
||||
<string name="settings_desc_auth_inactivity">Require authentication after the device has been
|
||||
inactive</string>
|
||||
<string name="settings_desc_auth_inactivity_delay">Select the time (in sec) after which to
|
||||
require reauthentication</string>
|
||||
<string name="settings_desc_block_accessibility">Hide sensitive fields from the accessibility
|
||||
services. <b>DO NOT enable this if you rely on the accessibility services!</b></string>
|
||||
<string name="settings_desc_relock_screen_off">Demana autenticació després que la pantalla
|
||||
s\'hagi apagat</string>
|
||||
<string name="settings_desc_relock_background">Demana autenticació després que l\'aplicació
|
||||
se\'n vagi a segon pla (p. ex. prement el botó «inici»)</string>
|
||||
<string name="settings_desc_auth_inactivity">Demana autenticació després que el dispositiu ha
|
||||
estat inactiu</string>
|
||||
<string name="settings_desc_auth_inactivity_delay">Indiqueu després quant de temps (en segons)
|
||||
es demanarà reautenticació</string>
|
||||
<string name="settings_desc_block_accessibility">Oculta els camps sensibles als serveis
|
||||
d\'accessibilitat. <b>NO l\'activeu si us calen els serveis d\'accessibilitat</b></string>
|
||||
<string name="settings_desc_block_autofill">Bloca l\'accés dels serveis d\'emplenament automàtic
|
||||
als camps de contrasenya en l\'aplicació</string>
|
||||
<string name="settings_desc_block_autofill_android">Aquesta característica exigeix una versió d\'Android
|
||||
superior a la 8.0 (Oreo)</string>
|
||||
<string name="settings_desc_label_scroll">Les etiquetes llargues es desplacen en comptes de truncar-les</string>
|
||||
<string name="settings_desc_minimize_on_copy">App will be minimized when you copy the OTP to clipboard</string>
|
||||
<string name="settings_desc_search_includes">Specify which values should be included when searching</string>
|
||||
<string name="settings_desc_label_highlight_token">Highlights token in red if it\'s expiring in 8 seconds</string>
|
||||
<string name="settings_desc_hide_global_timeout">Hide the global timeout bar shown at the top of the screen</string>
|
||||
<string name="settings_desc_show_individual_timeouts">Show an individual timeout bar for every entry.
|
||||
This can slow down the app, only enable if really necessary.</string>
|
||||
<string name="settings_desc_backup_append_date">Append the current date and time to the suggested
|
||||
backup filename</string>
|
||||
<string name="settings_desc_minimize_on_copy">L\'aplicació es minimitzarà després d\'haver copiat l\'OTP al portaretalls</string>
|
||||
<string name="settings_desc_search_includes">Especifiqueu quins valors haurien de ser inclosos en la cerca</string>
|
||||
<string name="settings_desc_label_highlight_token">Destaca el testimoni en vermell si caduca en 8 segons</string>
|
||||
<string name="settings_desc_hide_global_timeout">Amaga la barra global de temps d\'espera en la part superior de la pantalla</string>
|
||||
<string name="settings_desc_show_individual_timeouts">Mostra una barra de temps d\'espera per a cada entrada.
|
||||
Això pot alentir l\'aplicació, activeu-la només si realment us cal.</string>
|
||||
<string name="settings_desc_backup_append_date">Afegeix la data i hora actuals al nom suggerit per
|
||||
al fitxer de còpia de seguretat</string>
|
||||
<string name="settings_desc_backup_ask">Demana el nom del fitxer cada vegada que es crea o restaura una còpia de seguretat</string>
|
||||
<string name="settings_desc_backup_location">Tria una localització per defecte per a les còpies de seguretat</string>
|
||||
<string name="settings_desc_backup_location_set">S\'ha triat la localització per a les còpies de seguretat</string>
|
||||
<string name="settings_desc_backup_password">Contrasenya que s\'usarà per a xifrar les
|
||||
còpies de seguretat</string>
|
||||
<string name="settings_desc_auto_backup_password_enc">Creates a new encrypted backup when new
|
||||
entries are added, or edited, if settings conditions are met</string>
|
||||
<string name="settings_desc_auto_backup_password_enc">Crea una còpia de seguretat nova quan s\'afegeixin o
|
||||
editin entrades, si s\'hi compleixen les condicions</string>
|
||||
<string name="settings_desc_auto_backup_requirements">Trieu una localització per defecte per a les còpies de seguretat i
|
||||
una contrasenya per a activar aquesta opció</string>
|
||||
<string name="settings_desc_backup_broadcasts">Select which backup types can be triggered by
|
||||
3rd-party apps using Broadcasts</string>
|
||||
<string name="settings_desc_openpgp_key_encrypt">Mail address of the OpenPGP key used to encrypt
|
||||
the backups</string>
|
||||
<string name="settings_desc_openpgp_verify">Només s\'importaran còipes xifrades si s\'han
|
||||
<string name="settings_desc_openpgp_key_encrypt">Adreça de correu de la clau OpenPGP usada per a
|
||||
xifrar les còpies de seguretat</string>
|
||||
<string name="settings_desc_openpgp_verify">Només s\'importaran còpies xifrades si s\'han
|
||||
signat amb una clau vàlida</string>
|
||||
<string name="settings_desc_special_features">Desmarqueu per a deshabilitar les característiques especials</string>
|
||||
<string name="settings_desc_enable_screenshot">Permet fer captures de la pantalla principal
|
||||
(desactivat per defecte per motius de seguretat)</string>
|
||||
<string name="settings_desc_enable_android_backup_service">Enables andOTP to use Android\'s
|
||||
built in backup service to backup keys and preferences</string>
|
||||
<string name="settings_desc_enable_android_backup_service">Permet que andOTP faci servir el servei de còpies de seguretat
|
||||
inclòs a Android per a desar les claus i les preferències</string>
|
||||
<string name="settings_desc_clear_keystore">Esborra la clau d\'encriptació del magatzem de claus</string>
|
||||
<!-- Toasts -->
|
||||
<string name="settings_toast_auth_device_not_secure">Aquesta característica requereix un bloqueig de pantalla
|
||||
|
@ -106,10 +115,10 @@
|
|||
<string name="settings_toast_encryption_auth_failed">Ha fallat l\'autenticació!</string>
|
||||
<string name="settings_toast_auth_upgrade_failed">Ha fallat l\'actualització automàtica de la contrasenya / PIN
|
||||
per al nou xifratge; per favor, reinicialitzeu-la manualment en la configuració!</string>
|
||||
<string name="settings_dialog_title_warning">Warning</string>
|
||||
<string name="settings_dialog_title_warning">Alerta</string>
|
||||
<string name="settings_dialog_title_error">Error</string>
|
||||
<string name="settings_dialog_title_clear_keystore">Voleu neteja el magatzem de claus?</string>
|
||||
<string name="settings_dialog_title_android_sync">Android sync</string>
|
||||
<string name="settings_dialog_title_android_sync">Sistema de còpies de seguretat d\'Android</string>
|
||||
<string name="settings_dialog_msg_encryption_change">andOTP will now try to change the database
|
||||
encryption. In case of a failure an internal backup will be restored and the encryption
|
||||
remains unchanged.\n\n<b>However, it\'s always a good idea to have a backup in case
|
||||
|
@ -145,25 +154,25 @@
|
|||
<item>Reinicialitza les opcions de l\'aplicació</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_card_layout">
|
||||
<item>Compact</item>
|
||||
<item>Default</item>
|
||||
<item>Full</item>
|
||||
<item>Compacte</item>
|
||||
<item>Per defecte</item>
|
||||
<item>Complet</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_tap">
|
||||
<item>Nothing</item>
|
||||
<item>Reveal/Hide</item>
|
||||
<item>Copy</item>
|
||||
<item>Copy and go to background</item>
|
||||
<item>Res</item>
|
||||
<item>Mostra/Oculta</item>
|
||||
<item>Copia</item>
|
||||
<item>Copia i passa a segon pla</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_search_includes">
|
||||
<item>Label</item>
|
||||
<item>Issuer</item>
|
||||
<item>Tags</item>
|
||||
<item>Etiqueta</item>
|
||||
<item>Emissor</item>
|
||||
<item>Etiquetes</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_auto_backup_password_enc">
|
||||
<item>Off</item>
|
||||
<item>New Entries</item>
|
||||
<item>Any Edits</item>
|
||||
<item>Entrada nova</item>
|
||||
<item>Totes les edicions</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_theme">
|
||||
<item>Tema clar</item>
|
||||
|
@ -172,11 +181,11 @@
|
|||
</string-array>
|
||||
<string-array name="settings_entries_thumbnail_size">
|
||||
<item>Ocult</item>
|
||||
<item>Tiny</item>
|
||||
<item>Small</item>
|
||||
<item>Default</item>
|
||||
<item>Medium</item>
|
||||
<item>Large</item>
|
||||
<item>Molt petita</item>
|
||||
<item>Petita</item>
|
||||
<item>Per defecte</item>
|
||||
<item>Mitjana</item>
|
||||
<item>Grossa</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_split_group_size">
|
||||
<item>No dividir</item>
|
||||
|
@ -184,13 +193,13 @@
|
|||
<item>Després de tres caràcters</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_tag_functionality">
|
||||
<item>Show all entries matching <b>any</b> of the selected tags (or)</item>
|
||||
<item>Only show entries matching <b>all</b> of the selected tags (and)</item>
|
||||
<item>Switch between tags (only allow one tag to be selected at a time)</item>
|
||||
<item>Mostra totes les entrades en què hi ha <b>alguna</b> de les etiquetes (OR)</item>
|
||||
<item>Mostra totes les entrades en què apareixen <b>totes</b> les etiquetes (AND)</item>
|
||||
<item>Commuta entre etiquetes (només permet de seleccionar una etiqueta cada vegada)</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_backup_broadcasts">
|
||||
<item>Plain-text backups</item>
|
||||
<item>Encrypted backups</item>
|
||||
<item>Còpies de seguretat en text pla</item>
|
||||
<item>Còpies de seguretat xifrada</item>
|
||||
</string-array>
|
||||
<!-- Special -->
|
||||
<string name="settings_lang_sys_default">Valor del sistema per defecte</string>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<string name="auth_hint_pin">PIN</string>
|
||||
<!-- Messages -->
|
||||
<string name="auth_msg_authenticate">Přihlašte se pro spuštění andOTP!</string>
|
||||
<string name="auth_msg_confirm_encryption">Prosím potvrďte své přihlášení pro vygenerování nového šifrovacího klíče!</string>
|
||||
<string name="auth_msg_confirm_encryption">Pro vygenerování šifrovacího klíče prosím potvrďte své přihlášení!</string>
|
||||
<!-- Buttons -->
|
||||
<string name="auth_button_unlock">Odemknout</string>
|
||||
<!-- Toast messages -->
|
||||
|
|
|
@ -35,17 +35,15 @@ který byl vytvořen pomocí <b>verze andOTP nižší než 0.6.3</b></string>
|
|||
<string name="backup_receiver_read_permission_failed">Nebylo uděleno oprávnění ke čtení, prosím udělte ho před pokusem o zálohování</string>
|
||||
<string name="backup_receiver_write_permission_failed">Nebylo uděleno oprávnění k zápisu, prosím udělte ho před pokusem o zálohování</string>
|
||||
<string name="backup_receiver_custom_encryption_failed">Šifrování heslem/PINem není podporováno v kombinaci s automatizovaným zálohováním</string>
|
||||
<string name="backup_new_format_dialog_title">Nová metoda šifrování</string>
|
||||
<string name="backup_new_format_dialog_msg">Od veze 0.6.3 se pro ochranu heslem používá <b>nová a vylepšená metoda šifrování</b>
|
||||
Stále lze importovat staré zálohy, ale <b> velmi se doporučuje vytvořit novou zálohu s vylepšeným šifrováním</b>.
|
||||
\n\nTato zpráva se již nezobrazí.</string>
|
||||
<!-- Notification channels -->
|
||||
<string name="notification_channel_name_backup_failed">Automatické zálohování selhalo</string>
|
||||
<string name="notification_channel_name_backup_success">Automatické zálohování proběhlo úspěšně</string>
|
||||
<string name="notification_channel_desc_backup_failed">Tato upozornění se zobrazí, když automatické zálohování z nějakého důvodu selže</string>
|
||||
<string name="notification_channel_desc_backup_success">Tato upozornění se zobrazí, když automatické zálohování proběhne úspěšně</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="backup_toast_mkdir_failed">Nepodařilo se vytvořit záložní adresář</string>
|
||||
<string name="backup_toast_no_location">Prosím nastavte výchozí umístění zálohy v nastavení!</string>
|
||||
<string name="backup_toast_location_access_failed">Nepodařilo se získat přístup k umístění zálohy!</string>
|
||||
<string name="backup_toast_file_creation_failed">Nepodařilo se vytvořit soubor zálohy!</string>
|
||||
<string name="backup_toast_export_success">Export na externí úložiště byl úspěšný</string>
|
||||
<string name="backup_toast_export_failed">Export na externí úložiště selhal</string>
|
||||
<string name="backup_toast_import_success">Import z externího úložiště byl úspěšný</string>
|
||||
|
@ -53,7 +51,6 @@ Stále lze importovat staré zálohy, ale <b> velmi se doporučuje vytvořit nov
|
|||
<string name="backup_toast_import_decryption_failed">Dešifrování zálohy se nezdařilo</string>
|
||||
<string name="backup_toast_import_no_entries">V importovaných datech nebyly nalezeny žádné záznamy</string>
|
||||
<string name="backup_toast_storage_not_accessible">Externí úložiště teď není dostupné</string>
|
||||
<string name="backup_toast_storage_permissions">Oprávnění pro úložiště nebylo uděleno</string>
|
||||
<string name="backup_toast_openpgp_error">Chyba OpenPGP: %s</string>
|
||||
<string name="backup_toast_openpgp_not_verified">Nenalezen ověřený podpis</string>
|
||||
<string name="backup_toast_crypt_password_not_set">Heslo není nastaveno, zkontrolujte <b>Nastavení</b></string>
|
||||
|
|
|
@ -41,10 +41,17 @@
|
|||
<string name="menu_sort_label">Popis</string>
|
||||
<string name="menu_sort_last_used">Naposledy použité</string>
|
||||
<string name="menu_sort_most_used">Nejpoužívanější</string>
|
||||
<string name="menu_popup_edit">Edit</string>
|
||||
<string name="menu_popup_edit">Upravit</string>
|
||||
<string name="menu_popup_change_image">Změnit obrázek</string>
|
||||
<string name="menu_popup_remove">Smazat</string>
|
||||
<string name="menu_popup_show_qr_code">Ukaž QR kód</string>
|
||||
<!-- Buttons -->
|
||||
<string name="button_card_options">Další volby</string>
|
||||
<string name="button_card_options_format">Další volby pro %1$s</string>
|
||||
<string name="button_card_copy">Kopírovat token</string>
|
||||
<string name="button_card_copy_format">Kopírovat %1$s token</string>
|
||||
<string name="button_add">Přidat nový účet</string>
|
||||
<string name="button_close_menu">Zavřít nabídku</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="toast_auth_failed">Chyba ověření, zkuste to prosím znovu!</string>
|
||||
<string name="toast_auth_failed_fatal">Ověření se nezdařilo, zavírám andOTP!</string>
|
||||
|
@ -68,25 +75,19 @@
|
|||
<string name="dialog_title_remove">Smazat</string>
|
||||
<string name="dialog_title_rename">Přejmenování</string>
|
||||
<string name="dialog_title_counter">Počítadlo</string>
|
||||
<string name="dialog_title_used_tokens">Tokens usage</string>
|
||||
<string name="dialog_title_used_tokens">Využití tokenů</string>
|
||||
<string name="dialog_title_keystore_error">Chyba úložiště klíčů</string>
|
||||
<string name="dialog_title_qr_code">QR kód</string>
|
||||
<string name="dialog_title_android21_depreaction">Oznámení o ukončení podpory</string>
|
||||
<string name="dialog_title_enter_password">Zadejte heslo</string>
|
||||
<string name="dialog_label_enter_password">Zadejte heslo</string>
|
||||
<string name="dialog_label_confirm_password">Potvrďte heslo</string>
|
||||
<string name="dialog_msg_auth">Prosím zadejte heslo zařízení ke spuštění andOTP.</string>
|
||||
<string name="dialog_msg_confirm_delete">Jste si jistí, že chcete odebrat účet \"%1$s\"?</string>
|
||||
<string name="dialog_msg_used_tokens">andOTP will track when you use your tokens (using the \"Tap
|
||||
to reveal\" feature or copying to clipboard) to be able to sort them by \"Most used\" or
|
||||
\"Last used\".\n\nThis message will not be shown again.</string>
|
||||
<string name="dialog_msg_used_tokens">andOTP bude sledovat, když použijete své tokeny (pomocí funkce \"Klepněte
|
||||
pro odhalení\" nebo je zkopírujete do schránky), abyste je mohli řadit podle \"Nejčastěji používaných\" nebo
|
||||
\"Naposledy použito\".\n\nTato zpráva nebude znovu zobrazena.</string>
|
||||
<string name="dialog_msg_keystore_error">Nepodařilo se načíst šifrovací klíč z KeyStore.
|
||||
<b>Veškeré přidané položky budou ztraceny.</b> \n\nPro zajištění použitelnosti andOTP v <b>Nastavení</b> přepněte <b>Šifrování databáze</b> na <b>heslo / PIN</b>.</string>
|
||||
<string name="dialog_msg_android21_deprecation">This will be the last version of andOTP to
|
||||
support Android versions below 5.1 (Lollipop). The increased effort required to maintain a
|
||||
separate storage implementation just for those older versions as well as their low market
|
||||
shares make a continued support infeasible for our small team.\n\nThis message will not be
|
||||
shown again.</string>
|
||||
<!-- Shortcuts -->
|
||||
<string name="shortcut_name_scan_qr">Načíst QR kód</string>
|
||||
<string name="shortcut_name_import_qr">Importovat QR kód</string>
|
||||
|
|
|
@ -18,24 +18,25 @@
|
|||
<string name="settings_title_auth_inactivity">Zamknout při nečinnosti</string>
|
||||
<string name="settings_title_auth_inactivity_delay">Zpoždění zámku při neaktivitě</string>
|
||||
<string name="settings_title_block_accessibility">Blokovat služby usnadnění přístupu</string>
|
||||
<string name="settings_title_block_autofill">Blokovat automatické vyplňování</string>
|
||||
<string name="settings_title_lang">Jazyk</string>
|
||||
<string name="settings_title_theme">Vzhled</string>
|
||||
<string name="settings_title_card_layout">Rozložení karet</string>
|
||||
<string name="settings_title_label_size">Velikost písma popisku</string>
|
||||
<string name="settings_title_label_scroll">Pohybující se popisky</string>
|
||||
<string name="settings_title_tap_single">Single-tap</string>
|
||||
<string name="settings_title_tap_double">Double-tap</string>
|
||||
<string name="settings_title_tap_single">Jedno klepnutí</string>
|
||||
<string name="settings_title_tap_double">Dvojí poklepání</string>
|
||||
<string name="settings_title_thumbnail_size_ask">Velikost náhledu</string>
|
||||
<string name="settings_title_split_group_size">Rozdělit token mezerami</string>
|
||||
<string name="settings_title_tag_functionality">Chování výběru štítků</string>
|
||||
<string name="settings_title_minimize_on_copy">Minimalizovat aplikaci po zkopírování OTP</string>
|
||||
<string name="settings_title_search_includes">Způsob vyhledávání</string>
|
||||
<string name="settings_title_label_highlight_token">Zvýraznit tokeny s končící platností</string>
|
||||
<string name="settings_title_hide_global_timeout">Hide global timeout bar</string>
|
||||
<string name="settings_title_show_individual_timeouts">Show individual timeouts</string>
|
||||
<string name="settings_title_hide_global_timeout">Skrýt společnou časovou lištu</string>
|
||||
<string name="settings_title_show_individual_timeouts">Zobrazit individuální časové limity</string>
|
||||
<string name="settings_title_backup_append_date">Přidání data k názvu souboru</string>
|
||||
<string name="settings_title_backup_ask">Zadejte název souboru</string>
|
||||
<string name="settings_title_backup_directory">Adresář záloh</string>
|
||||
<string name="settings_title_backup_location">Výchozí umístění zálohy</string>
|
||||
<string name="settings_title_backup_password">Heslo pro zálohu</string>
|
||||
<string name="settings_title_auto_backup_password_enc">Automaticky zálohovat při přidání nových položek</string>
|
||||
<string name="settings_title_backup_broadcasts">Příkazy k zálohování</string>
|
||||
|
@ -56,17 +57,24 @@
|
|||
<string name="settings_desc_auth_inactivity">Vyžadovat přihlášení poté, co bylo zařízení neaktivní</string>
|
||||
<string name="settings_desc_auth_inactivity_delay">Zvolte čas v sekundách, po kterém bude opět potřeba přihlášení</string>
|
||||
<string name="settings_desc_block_accessibility">Skrýt pole s citlivými informacemi před službami pro usnadnění přístupu. <b>NEAKTIVUJTE pokud spoléháte na služby usnadnění přístupu!</b></string>
|
||||
<string name="settings_desc_block_autofill">Blokovat službám automatického vyplňování přístup k polím sloužícím k zadání
|
||||
hesla uvnitř aplikace</string>
|
||||
<string name="settings_desc_block_autofill_android">Tato funkce vyžaduje vyšší verzi Android
|
||||
než 8.0 (Oreo)</string>
|
||||
<string name="settings_desc_label_scroll">Posouvat příliš dlouhé popisky namísto zkracování</string>
|
||||
<string name="settings_desc_minimize_on_copy">Aplikace bude minimalizována, když zkopírujete OTP do schránky</string>
|
||||
<string name="settings_desc_search_includes">Určete, které hodnoty by měly být zahrnuty při hledání</string>
|
||||
<string name="settings_desc_label_highlight_token">Zvýraznit token červeně, pokud vyprší do 8 sekund</string>
|
||||
<string name="settings_desc_hide_global_timeout">Hide the global timeout bar shown at the top of the screen</string>
|
||||
<string name="settings_desc_show_individual_timeouts">Show an individual timeout bar for every entry.
|
||||
This can slow down the app, only enable if really necessary.</string>
|
||||
<string name="settings_desc_hide_global_timeout">Skrýt společnou časovou lištu v horní části obrazovky</string>
|
||||
<string name="settings_desc_show_individual_timeouts">Zobrazit individuální časový limit pro každý záznam.
|
||||
Může to zpomalit aplikaci, povolte, pouze pokud je to opravdu nutné.</string>
|
||||
<string name="settings_desc_backup_append_date">Přidá aktuální datum a čas k navrhovanému názvu záložního souboru</string>
|
||||
<string name="settings_desc_backup_ask">Dotazovat se na název souboru vždy při vytváření či obnovování zálohy</string>
|
||||
<string name="settings_desc_backup_location">Zvolte výchozí umístění zálohy</string>
|
||||
<string name="settings_desc_backup_location_set">Umístění zálohy bylo vybráno</string>
|
||||
<string name="settings_desc_backup_password">Nastaví heslo používané k šifrování záloh</string>
|
||||
<string name="settings_desc_auto_backup_password_enc">Vytvoří novou šifrovanou zálohu při vytvoření či úpravě položek, když jsou splněny podmínky z nastavení</string>
|
||||
<string name="settings_desc_auto_backup_requirements">Pro povolení této volby nastavte umístění zálohy a heslo pro zálohu</string>
|
||||
<string name="settings_desc_backup_broadcasts">Vyberte, které typy zálohování můžou být spuštěny pomocí příkazů od aplikací třetí strany</string>
|
||||
<string name="settings_desc_openpgp_key_encrypt">E-mailová adresa OpenPGP klíče použitého k šifrování záloh</string>
|
||||
<string name="settings_desc_openpgp_verify">Šifrované zálohy jsou importovány pouze, jsou-li podepsány platným klíčem</string>
|
||||
|
@ -117,10 +125,10 @@ V případě chyby bude obnovena interní záloha a šifrování zůstane nezmě
|
|||
<item>Plná</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_tap">
|
||||
<item>Nothing</item>
|
||||
<item>Reveal/Hide</item>
|
||||
<item>Copy</item>
|
||||
<item>Copy and go to background</item>
|
||||
<item>Nic</item>
|
||||
<item>Zobrazit/skrýt</item>
|
||||
<item>Kopírovat</item>
|
||||
<item>Kopírovat a přejít na pozadí</item>
|
||||
</string-array>
|
||||
<string-array name="settings_entries_search_includes">
|
||||
<item>Popisek</item>
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
<string name="auth_hint_pin">PIN</string>
|
||||
<!-- Messages -->
|
||||
<string name="auth_msg_authenticate">Bitte authentifizieren Sie sich, um andOTP zu starten!</string>
|
||||
<string name="auth_msg_confirm_encryption">Bitte bestätigen Sie Ihre Authentifizierung um den neuen Verschlüsselungsschlüssel zu generieren!</string>
|
||||
<string name="auth_msg_confirm_encryption">Bitte bestätigen Sie die Authentifizierung, um Ihren
|
||||
Schlüssel zu generieren!</string>
|
||||
<!-- Buttons -->
|
||||
<string name="auth_button_unlock">Entsperren</string>
|
||||
<!-- Toast messages -->
|
||||
|
|
|
@ -42,18 +42,15 @@
|
|||
zum Sichern benötigt</string>
|
||||
<string name="backup_receiver_custom_encryption_failed">Passwort/PIN Verschlüsselung ist nicht
|
||||
unterstützt mit Broadcast Datensicherung</string>
|
||||
<string name="backup_new_format_dialog_title">Neue Verschlüsselungsmethode</string>
|
||||
<string name="backup_new_format_dialog_msg">Seit Version 0.6.3 von andOTP, wird eine <b>neue und verbesserte
|
||||
Verschlüsselungsmethode</b> für passwortgeschützte Datensicherungen benutzt. Alte Datensicherungen
|
||||
können weiterhin importiert werden, aber es wird <b>nachdrücklich empfohlen neue Datensicherungen mit
|
||||
der verbesserten Verschlüsselung zu erstellen</b>.\n\nDiese Nachricht wird nicht erneut angezeigt.</string>
|
||||
<!-- Notification channels -->
|
||||
<string name="notification_channel_name_backup_failed">Automatische Sicherung fehlgeschlagen</string>
|
||||
<string name="notification_channel_name_backup_success">Automatische Sicherung erfolgreich</string>
|
||||
<string name="notification_channel_desc_backup_failed">Diese Mitteilungen werden angezeigt, wenn eine automatische Sicherung aus irgendeinem Grund fehlgeschlagen ist.</string>
|
||||
<string name="notification_channel_desc_backup_success">Diese Mitteilungen werden angezeigt, wenn eine automatische Sicherung erfolgreich war.</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="backup_toast_mkdir_failed">Erstellen des Backup-Verzeichnisses fehlgeschlagen</string>
|
||||
<string name="backup_toast_no_location">Bitte legen Sie einen Standard-Sicherungsort in den Einstellungen fest!</string>
|
||||
<string name="backup_toast_location_access_failed">Zugriff auf Sicherungsort fehlgeschlagen!</string>
|
||||
<string name="backup_toast_file_creation_failed">Fehler beim Erstellen der Sicherungsdatei!</string>
|
||||
<string name="backup_toast_export_success">Export auf externen Speicher erfolgreich</string>
|
||||
<string name="backup_toast_export_failed">Export auf externen Speicher fehlgeschlagen</string>
|
||||
<string name="backup_toast_import_success">Import vom externen Speicher erfolgreich</string>
|
||||
|
@ -61,7 +58,6 @@
|
|||
<string name="backup_toast_import_decryption_failed">Entschlüsselung des Backups ist fehlgeschlagen</string>
|
||||
<string name="backup_toast_import_no_entries">In den importierten Daten wurden keine Einträge gefunden</string>
|
||||
<string name="backup_toast_storage_not_accessible">Externer Speicher derzeit nicht zugreifbar</string>
|
||||
<string name="backup_toast_storage_permissions">Speicherberechtigung nicht gewährt</string>
|
||||
<string name="backup_toast_openpgp_error">OpenPGP-Fehler: %s</string>
|
||||
<string name="backup_toast_openpgp_not_verified">Keine geprüfte Signatur erkannt</string>
|
||||
<string name="backup_toast_crypt_password_not_set">Kein Passwort gesetzt, überprüfe die <b>Einstellungen</b></string>
|
||||
|
|
|
@ -45,6 +45,13 @@
|
|||
<string name="menu_popup_change_image">Bild ändern</string>
|
||||
<string name="menu_popup_remove">Entfernen</string>
|
||||
<string name="menu_popup_show_qr_code">Zeige QR-Code</string>
|
||||
<!-- Buttons -->
|
||||
<string name="button_card_options">Weitere Optionen</string>
|
||||
<string name="button_card_options_format">Weitere Optionen für %1$s</string>
|
||||
<string name="button_card_copy">Token kopieren</string>
|
||||
<string name="button_card_copy_format">%1$s Token kopieren</string>
|
||||
<string name="button_add">Neues Konto hinzufügen</string>
|
||||
<string name="button_close_menu">Menü schließen</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="toast_auth_failed">Authentifizierung fehlgeschlagen, bitte erneut versuchen!</string>
|
||||
<string name="toast_auth_failed_fatal">Authentifizierung fehlgeschlagen, andOTP wird geschlossen!</string>
|
||||
|
@ -71,7 +78,6 @@
|
|||
<string name="dialog_title_used_tokens">Verwendete Token</string>
|
||||
<string name="dialog_title_keystore_error">KeyStore Fehler</string>
|
||||
<string name="dialog_title_qr_code">QR-Code</string>
|
||||
<string name="dialog_title_android21_depreaction">Hinweis</string>
|
||||
<string name="dialog_title_enter_password">Passwort eingeben</string>
|
||||
<string name="dialog_label_enter_password">Passwort eingeben</string>
|
||||
<string name="dialog_label_confirm_password">Passwort bestätigen</string>
|
||||
|
@ -81,11 +87,6 @@
|
|||
um anzuzeigen\" verwenden oder die sie in die Zwischenablage kopieren), um sie nach \"meistbenutzt\" oder
|
||||
\"zuletzt verwendet\" zu sortieren.\n\nDiese Nachricht wird nicht wieder angezeigt.</string>
|
||||
<string name="dialog_msg_keystore_error">Fehler beim Laden des Verschlüsselungsschlüssels aus dem KeyStore. <b>Alle Einträge, die hinzugefügt werden, gehen verloren.</b>\n\nUm andOTP dennoch verwenden zu können, rufe die <b>Einstellungen</b> auf und setze die <b>Datenbank-Verschlüsselung</b> auf <b>Passwort / PIN</b>.</string>
|
||||
<string name="dialog_msg_android21_deprecation">Dies wird die letzte Version von andOTP sein, die
|
||||
Android-Versionen niedriger als 5.1 (Lollipop) unterstützt. Der erhöhte Aufwand zur Aufrechterhaltung einer separaten
|
||||
Speicherimplementierung nur für diese älteren Versionen und deren geringer Marktanteil
|
||||
machen eine fortgesetzte Unterstützung für unser kleines Team unmöglich.\n\nDiese Nachricht wird nicht erneut
|
||||
angezeigt.</string>
|
||||
<!-- Shortcuts -->
|
||||
<string name="shortcut_name_scan_qr">QR-Code scannen</string>
|
||||
<string name="shortcut_name_import_qr">QR-Code importieren</string>
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
<string name="settings_title_auth_inactivity">Bei Inaktivität sperren</string>
|
||||
<string name="settings_title_auth_inactivity_delay">Zeit bis zur Inaktivitätssperre</string>
|
||||
<string name="settings_title_block_accessibility">Eingabehilfen blockieren</string>
|
||||
<string name="settings_title_block_autofill">Autofill verhindern</string>
|
||||
<string name="settings_title_lang">Sprache</string>
|
||||
<string name="settings_title_theme">Design</string>
|
||||
<string name="settings_title_card_layout">Kartenlayout</string>
|
||||
|
@ -35,7 +36,7 @@
|
|||
<string name="settings_title_show_individual_timeouts">Individuelle Timeouts anzeigen</string>
|
||||
<string name="settings_title_backup_append_date">Datum an den Dateinamen anhängen</string>
|
||||
<string name="settings_title_backup_ask">Nach Dateinamen fragen</string>
|
||||
<string name="settings_title_backup_directory">Sicherungsverzeichnis</string>
|
||||
<string name="settings_title_backup_location">Standard-Sicherungsort</string>
|
||||
<string name="settings_title_backup_password">Datensicherungs-Passwort</string>
|
||||
<string name="settings_title_auto_backup_password_enc">Automatische Datensicherung bei neuen Einträgen</string>
|
||||
<string name="settings_title_backup_broadcasts">Broadcasts-Sicherungen</string>
|
||||
|
@ -61,6 +62,9 @@
|
|||
<string name="settings_desc_auth_inactivity_delay">Zeit (in Sekunden) nach der erneute
|
||||
Authentifizierung benötigt wird</string>
|
||||
<string name="settings_desc_block_accessibility">Verstecke vertrauliche Einträge vor den Eingabehilfsdiensten. <b>NICHT aktivieren, wenn Eingabehilfe benötigt wird!</b></string>
|
||||
<string name="settings_desc_block_autofill">Hindert Autofill-Dienste am Zugriff auf Passwortfelder in der App</string>
|
||||
<string name="settings_desc_block_autofill_android">Dieses Feature erfordert eine Android-Version
|
||||
höher als 8.0 (Oreo)</string>
|
||||
<string name="settings_desc_label_scroll">Überlange Beschriftungen scrollen, statt diese abzuschneiden</string>
|
||||
<string name="settings_desc_minimize_on_copy">App wird minimiert wenn der OTP Code kopiert wurde</string>
|
||||
<string name="settings_desc_search_includes">Welche Werte sollen in der Suche enthalten sein?</string>
|
||||
|
@ -70,11 +74,15 @@
|
|||
Dies kann die App verlangsamen, nur aktivieren, wenn wirklich notwendig.</string>
|
||||
<string name="settings_desc_backup_append_date">Aktuelles Datum und die aktuelle Uhrzeit an den vorgeschlagenen Sicherungsdateinamen anhängen</string>
|
||||
<string name="settings_desc_backup_ask">Jedes Mal nach dem Dateinamen fragen, wenn eine Sicherung erstellt oder wiederhergestellt wird</string>
|
||||
<string name="settings_desc_backup_location">Wählen Sie eine Standard-Sicherungsort</string>
|
||||
<string name="settings_desc_backup_location_set">Sicherungsort wurde ausgewählt</string>
|
||||
<string name="settings_desc_backup_password">Passwort festlegen, mit dem die Sicherungen verschlüsselt werden sollen</string>
|
||||
<string name="settings_desc_auto_backup_password_enc">Erstellt eine neue verschlüsselte Datensicherung bei
|
||||
Erstellung oder Bearbeitung von Einträgen, wenn Bedingungen erfüllt sind</string>
|
||||
<string name="settings_desc_auto_backup_requirements">Legen Sie einen Standard-Sicherungsort fest und setzen sie ein
|
||||
Sicherungspasswort, um diese Option zu aktivieren</string>
|
||||
<string name="settings_desc_backup_broadcasts">Über Broadcasts auswählen, welche Sicherungstypen von Drittanbieteranwendungen ausgelöst werden können.</string>
|
||||
<string name="settings_desc_openpgp_key_encrypt">EMail-Adresse, mit welcher der OpenPGP-Schlüssel verschlüsselt wurde</string>
|
||||
<string name="settings_desc_openpgp_key_encrypt">E-Mail-Adresse, mit welcher der OpenPGP-Schlüssel verschlüsselt wurde</string>
|
||||
<string name="settings_desc_openpgp_verify">Verschlüsselte Sicherungen werden nur importiert,
|
||||
wenn sie mit einem gültigen Schlüssel signiert sind</string>
|
||||
<string name="settings_desc_special_features">Haken entfernen, um die speziellen Funktionen wieder zu deaktivieren</string>
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
<string name="auth_hint_pin">PIN</string>
|
||||
<!-- Messages -->
|
||||
<string name="auth_msg_authenticate">Παρακαλώ ταυτοποιηθείτε για να ξεκινήσει ο andOTP!</string>
|
||||
<string name="auth_msg_confirm_encryption">Παρακαλώ επιβεβαιώστε την ταυτοποίησή σας για να παραχθεί το καινούριο κλειδί κρυπτογράφησης!</string>
|
||||
<string name="auth_msg_confirm_encryption">Παρακαλώ επιβεβαιώστε την επαλήθευση, για να δημιουργήσετε το δικό σας
|
||||
κλειδί κρυπτογράφησης!</string>
|
||||
<!-- Buttons -->
|
||||
<string name="auth_button_unlock">Ξεκλείδωμα</string>
|
||||
<!-- Toast messages -->
|
||||
|
|
|
@ -38,18 +38,15 @@
|
|||
<string name="backup_receiver_read_permission_failed">Η άδεια για ανάγνωση δεν έχει δοθεί, παρακαλώ παραχωρήστε την πριν προσπαθήσετε να πάρετε αντίγραφο ασφαλείας</string>
|
||||
<string name="backup_receiver_write_permission_failed">Η άδεια για εγγραφή δεν έχει δοθεί, παρακαλώ παραχωρήστε την πριν προσπαθήσετε να πάρετε αντίγραφο ασφαλείας</string>
|
||||
<string name="backup_receiver_custom_encryption_failed">Η κρυπτογράφηση με κωδικό πρόσβασης ή PIN δεν υποστηρίζεται στα αντίγραφα ασφαλείας μέσω εκπομπής</string>
|
||||
<string name="backup_new_format_dialog_title">Νέα μέθοδος κρυπτογράφησης</string>
|
||||
<string name="backup_new_format_dialog_msg">Από την έκδοση 0.6.3 της εφαρμογής andOTP, μία <b> νέα και βελτιωμένη
|
||||
μέθοδος κρυπτογράφησης</b> που χρησιμοποιείται για αντίγραφα ασφαλείας που προστατεύονται με κωδικό πρόσβασης. Τα παλιά αντίγραφα ασφαλείας μπορούν ακόμα να είναι
|
||||
εισάγονται, αλλά <b>Συνιστάται ιδιαίτερα να δημιουργήσετε νέα αντίγραφα ασφαλείας με τη βελτιωμένη
|
||||
μέθοδο κρυπτογράφησης</b>.\n\nΑυτό το μήνυμα δεν θα εμφανιστεί ξανά.</string>
|
||||
<!-- Notification channels -->
|
||||
<string name="notification_channel_name_backup_failed">Αποτυχία αυτόματης λήψης αντιγράφου ασφαλείας</string>
|
||||
<string name="notification_channel_name_backup_success">Επιτυχής αυτόματη λήψη αντιγράφου ασφαλείας</string>
|
||||
<string name="notification_channel_desc_backup_failed">Αυτές οι ειδοποιήσεις εμφανίζονται όταν μία αυτόματη λήψη αντιγράφου ασφαλείας απέτυχε για κάποιο λόγο</string>
|
||||
<string name="notification_channel_desc_backup_success">Αυτές οι ειδοποιήσεις εμφανίζονται όταν μία αυτόματη λήψη αντιγράφου ασφαλείας ήταν επιτυχής</string>
|
||||
<!-- Toast messages -->
|
||||
<string name="backup_toast_mkdir_failed">Αποτυχία δημιουργίας φακέλου αντιγράφων ασφαλείας</string>
|
||||
<string name="backup_toast_no_location">Καθορίστε μια προεπιλεγμένη θέση για δημιουργία αντιγράφων ασφαλείας στις ρυθμίσεις!</string>
|
||||
<string name="backup_toast_location_access_failed">Αποτυχία πρόσβασης στην τοποθεσία αντιγράφων ασφαλείας!</string>
|
||||
<string name="backup_toast_file_creation_failed">Αποτυχία δημιουργίας αντιγράφου ασφαλείας!</string>
|
||||
<string name="backup_toast_export_success">Εξαγωγή σε εξωτερική αποθήκευση επιτυχής</string>
|
||||
<string name="backup_toast_export_failed">Η εξαγωγή σε εξωτερική συσκευή αποθήκευσης απέτυχε</string>
|
||||
<string name="backup_toast_import_success">Εισαγωγή από εξωτερική αποθήκευση επιτυχής</string>
|
||||
|
@ -57,7 +54,6 @@
|
|||
<string name="backup_toast_import_decryption_failed">Η αποκρυπτογράφηση του αντιγράφου ασφαλείας απέτυχε</string>
|
||||
<string name="backup_toast_import_no_entries">Δεν βρέθηκαν εγγραφές στα δεδομένα που εισήχθηκαν</string>
|
||||
<string name="backup_toast_storage_not_accessible">Η εξωτερική αποθήκευση δεν είναι διαθέσιμη αυτή τη στιγμή</string>
|
||||
<string name="backup_toast_storage_permissions">Η άδεια για τον αποθηκευτικό χώρο δε χορηγήθηκε</string>
|
||||
<string name="backup_toast_openpgp_error">Σφάλμα OpenPGP: %s</string>
|
||||
<string name="backup_toast_openpgp_not_verified">Δεν ανιχνεύτηκε επαληθευμένη υπογραφή</string>
|
||||
<string name="backup_toast_crypt_password_not_set">Ο κωδικός πρόσβασης δεν έχει οριστεί, ελέγξτε τις <b>ρυθμίσεις</b></string>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue