Add a dialog for Aegis' license

This commit is contained in:
Alexander Bakker 2021-01-27 13:54:11 +01:00
parent e6e2809c9c
commit bda1a1d5af
57 changed files with 290 additions and 169 deletions

1
app/src/main/assets/LICENSE Symbolic link
View file

@ -0,0 +1 @@
../../../../LICENSE

View file

@ -0,0 +1,14 @@
<html>
<head>
<style type="text/css">
body {
background-color: %2$s;
color: %3$s;
font-size: 0.8em;
}
</style>
</head>
<body>
<pre>%1$s</pre>
</body>
</html>

View file

@ -8,7 +8,7 @@ import androidx.lifecycle.Lifecycle;
import com.beemdevelopment.aegis.encoding.EncodingException;
import com.beemdevelopment.aegis.helpers.ContextHelper;
import com.beemdevelopment.aegis.otp.OtpInfoException;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.tasks.PasswordSlotDecryptTask;
import com.beemdevelopment.aegis.util.IOUtils;
import com.beemdevelopment.aegis.vault.VaultEntry;

View file

@ -17,7 +17,7 @@ import com.beemdevelopment.aegis.otp.OtpInfo;
import com.beemdevelopment.aegis.otp.OtpInfoException;
import com.beemdevelopment.aegis.otp.SteamInfo;
import com.beemdevelopment.aegis.otp.TotpInfo;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.tasks.ProgressDialogTask;
import com.beemdevelopment.aegis.util.IOUtils;
import com.beemdevelopment.aegis.vault.VaultEntry;

View file

@ -2,7 +2,7 @@ package com.beemdevelopment.aegis.importers;
import android.content.Context;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.util.IOUtils;
import com.topjohnwu.superuser.io.SuFile;

View file

@ -12,7 +12,7 @@ import com.beemdevelopment.aegis.encoding.Hex;
import com.beemdevelopment.aegis.otp.OtpInfo;
import com.beemdevelopment.aegis.otp.OtpInfoException;
import com.beemdevelopment.aegis.otp.TotpInfo;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.util.JsonUtils;
import com.beemdevelopment.aegis.util.PreferenceParser;
import com.beemdevelopment.aegis.vault.VaultEntry;

View file

@ -14,7 +14,7 @@ import com.beemdevelopment.aegis.encoding.EncodingException;
import com.beemdevelopment.aegis.encoding.Hex;
import com.beemdevelopment.aegis.otp.OtpInfoException;
import com.beemdevelopment.aegis.otp.TotpInfo;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.util.IOUtils;
import com.beemdevelopment.aegis.util.PreferenceParser;
import com.beemdevelopment.aegis.vault.VaultEntry;

View file

@ -21,6 +21,8 @@ import com.beemdevelopment.aegis.Theme;
import com.beemdevelopment.aegis.helpers.ThemeHelper;
import com.beemdevelopment.aegis.licenses.GlideLicense;
import com.beemdevelopment.aegis.licenses.ProtobufLicense;
import com.beemdevelopment.aegis.ui.dialogs.ChangelogDialog;
import com.beemdevelopment.aegis.ui.dialogs.LicenseDialog;
import com.mikepenz.iconics.context.IconicsLayoutInflater2;
import de.psdev.licensesdialog.LicenseResolver;
@ -49,8 +51,15 @@ public class AboutActivity extends AegisActivity {
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
View btnLicenses = findViewById(R.id.btn_licenses);
btnLicenses.setOnClickListener(v -> showLicenseDialog());
View btnLicense = findViewById(R.id.btn_license);
btnLicense.setOnClickListener(v -> {
LicenseDialog.create()
.setTheme(getConfiguredTheme())
.show(getSupportFragmentManager(), null);
});
View btnThirdPartyLicenses = findViewById(R.id.btn_third_party_licenses);
btnThirdPartyLicenses.setOnClickListener(v -> showThirdPartyLicenseDialog());
TextView appVersion = findViewById(R.id.app_version);
appVersion.setText(getCurrentAppVersion());
@ -80,7 +89,9 @@ public class AboutActivity extends AegisActivity {
View btnChangelog = findViewById(R.id.btn_changelog);
btnChangelog.setOnClickListener(v -> {
ChangelogDialog.create().setTheme(getConfiguredTheme()).show(getSupportFragmentManager(), "CHANGELOG_DIALOG");
ChangelogDialog.create()
.setTheme(getConfiguredTheme())
.show(getSupportFragmentManager(), null);
});
}
@ -116,7 +127,7 @@ public class AboutActivity extends AegisActivity {
startActivity(Intent.createChooser(mailIntent, this.getString(R.string.email)));
}
private void showLicenseDialog() {
private void showThirdPartyLicenseDialog() {
String stylesheet = getString(R.string.custom_notices_format_style);
int backgroundColorResource = getConfiguredTheme() == Theme.AMOLED ? R.attr.cardBackgroundFocused : R.attr.cardBackground;
String backgroundColor = getThemeColorAsHex(backgroundColorResource);
@ -131,7 +142,7 @@ public class AboutActivity extends AegisActivity {
new LicensesDialog.Builder(this)
.setNotices(R.raw.notices)
.setTitle(R.string.licenses)
.setTitle(R.string.third_party_licenses)
.setNoticesCssStyle(stylesheet)
.setIncludeOwnLicense(true)
.build()

View file

@ -16,6 +16,7 @@ import com.beemdevelopment.aegis.Preferences;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.Theme;
import com.beemdevelopment.aegis.ThemeMap;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.vault.VaultManagerException;
import java.util.Locale;

View file

@ -33,6 +33,7 @@ import com.beemdevelopment.aegis.helpers.BiometricsHelper;
import com.beemdevelopment.aegis.helpers.EditTextHelper;
import com.beemdevelopment.aegis.helpers.MetricsHelper;
import com.beemdevelopment.aegis.helpers.UiThreadExecutor;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.tasks.PasswordSlotDecryptTask;
import com.beemdevelopment.aegis.vault.VaultFile;
import com.beemdevelopment.aegis.vault.VaultFileCredentials;

View file

@ -1,94 +0,0 @@
package com.beemdevelopment.aegis.ui;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.Theme;
import com.beemdevelopment.aegis.helpers.ThemeHelper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
public class ChangelogDialog extends DialogFragment {
private Theme _themeStyle;
public static ChangelogDialog create() {
return new ChangelogDialog();
}
@SuppressLint("InflateParams")
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final View customView;
try {
customView = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_web_view, null);
} catch (InflateException e) {
e.printStackTrace();
return new AlertDialog.Builder(getActivity())
.setTitle(android.R.string.dialog_alert_title)
.setMessage(getString(R.string.webview_error))
.setPositiveButton(android.R.string.ok, null)
.show();
}
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setTitle("Changelog")
.setView(customView)
.setPositiveButton(android.R.string.ok, null)
.show();
final WebView webView = customView.findViewById(R.id.web_view);
StringBuilder buf = new StringBuilder();
try (InputStream html = getActivity().getAssets().open("changelog.html")) {
BufferedReader in = new BufferedReader(new InputStreamReader(html, "UTF-8"));
String str;
while ((str = in.readLine()) != null)
buf.append(str);
in.close();
String changelog = buf.toString();
changelog = replaceStylesheet(changelog);
webView.loadData(changelog, "text/html", "UTF-8");
} catch (IOException e) {
webView.loadData("<h1>Unable to load</h1><p>" + e.getLocalizedMessage() + "</p>", "text/html", "UTF-8");
}
return dialog;
}
private String replaceStylesheet(String changelog) {
int backgroundColorResource = _themeStyle == Theme.AMOLED ? R.attr.cardBackgroundFocused : R.attr.cardBackground;
String backgroundColor = colorToCSS(ThemeHelper.getThemeColor(backgroundColorResource, getContext().getTheme()));
String textColor = colorToCSS(0xFFFFFF & ThemeHelper.getThemeColor(R.attr.primaryText, getContext().getTheme()));
return String.format(changelog, backgroundColor, textColor);
}
private static String colorToCSS(int color) {
return String.format("rgb(%d, %d, %d)", Color.red(color), Color.green(color), Color.blue(color));
}
public ChangelogDialog setTheme(Theme theme) {
_themeStyle = theme;
return this;
}
}

View file

@ -39,6 +39,7 @@ import com.beemdevelopment.aegis.otp.OtpInfo;
import com.beemdevelopment.aegis.otp.OtpInfoException;
import com.beemdevelopment.aegis.otp.SteamInfo;
import com.beemdevelopment.aegis.otp.TotpInfo;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.util.Cloner;
import com.beemdevelopment.aegis.vault.VaultEntry;
import com.beemdevelopment.aegis.vault.VaultManager;

View file

@ -10,6 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.views.GroupAdapter;
import java.text.Collator;

View file

@ -23,6 +23,7 @@ import com.beemdevelopment.aegis.helpers.FabScrollHelper;
import com.beemdevelopment.aegis.importers.DatabaseImporter;
import com.beemdevelopment.aegis.importers.DatabaseImporterEntryException;
import com.beemdevelopment.aegis.importers.DatabaseImporterException;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.models.ImportEntry;
import com.beemdevelopment.aegis.ui.views.ImportEntriesAdapter;
import com.beemdevelopment.aegis.util.UUIDMap;

View file

@ -4,6 +4,7 @@ import android.os.Bundle;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.ThemeMap;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.intro.IntroBaseActivity;
import com.beemdevelopment.aegis.ui.intro.SlideFragment;
import com.beemdevelopment.aegis.ui.slides.DoneSlide;

View file

@ -32,6 +32,7 @@ import com.beemdevelopment.aegis.helpers.PermissionHelper;
import com.beemdevelopment.aegis.helpers.QrCodeAnalyzer;
import com.beemdevelopment.aegis.otp.GoogleAuthInfo;
import com.beemdevelopment.aegis.otp.GoogleAuthInfoException;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.fragments.BackupsPreferencesFragment;
import com.beemdevelopment.aegis.ui.fragments.PreferencesFragment;
import com.beemdevelopment.aegis.ui.views.EntryListView;

View file

@ -8,7 +8,6 @@ import android.view.MenuItem;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.camera.core.CameraInfoUnavailableException;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageAnalysis;
@ -22,6 +21,7 @@ import com.beemdevelopment.aegis.ThemeMap;
import com.beemdevelopment.aegis.helpers.QrCodeAnalyzer;
import com.beemdevelopment.aegis.otp.GoogleAuthInfo;
import com.beemdevelopment.aegis.otp.GoogleAuthInfoException;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.vault.VaultEntry;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.zxing.Result;

View file

@ -17,6 +17,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.crypto.KeyStoreHandle;
import com.beemdevelopment.aegis.crypto.KeyStoreHandleException;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.vault.VaultFileCredentials;
import com.beemdevelopment.aegis.vault.slots.BiometricSlot;
import com.beemdevelopment.aegis.vault.slots.PasswordSlot;

View file

@ -12,6 +12,7 @@ import android.widget.TextView;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.otp.GoogleAuthInfo;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.vault.VaultManager;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;

View file

@ -0,0 +1,21 @@
package com.beemdevelopment.aegis.ui.dialogs;
import android.content.Context;
import com.beemdevelopment.aegis.R;
public class ChangelogDialog extends SimpleWebViewDialog {
private ChangelogDialog() {
super(R.string.changelog);
}
public static ChangelogDialog create() {
return new ChangelogDialog();
}
@Override
protected String getContent(Context context) {
String content = readAssetAsString(context, "changelog.html");
return String.format(content, getBackgroundColor(), getTextColor());
}
}

View file

@ -1,4 +1,4 @@
package com.beemdevelopment.aegis.ui;
package com.beemdevelopment.aegis.ui.dialogs;
import android.app.Activity;
import android.app.Dialog;

View file

@ -0,0 +1,22 @@
package com.beemdevelopment.aegis.ui.dialogs;
import android.content.Context;
import com.beemdevelopment.aegis.R;
public class LicenseDialog extends SimpleWebViewDialog {
private LicenseDialog() {
super(R.string.license);
}
public static LicenseDialog create() {
return new LicenseDialog();
}
@Override
protected String getContent(Context context) {
String license = readAssetAsString(context, "LICENSE");
String html = readAssetAsString(context, "license.html");
return String.format(html, license, getBackgroundColor(), getTextColor());
}
}

View file

@ -0,0 +1,93 @@
package com.beemdevelopment.aegis.ui.dialogs;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebView;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.Theme;
import com.beemdevelopment.aegis.helpers.ThemeHelper;
import com.google.common.io.CharStreams;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
public abstract class SimpleWebViewDialog extends DialogFragment {
private Theme _theme;
private final @StringRes int _title;
protected SimpleWebViewDialog(@StringRes int title) {
_title = title;
}
protected abstract String getContent(Context context);
@SuppressLint("InflateParams")
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final View view;
try {
view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_web_view, null);
} catch (InflateException e) {
e.printStackTrace();
return new AlertDialog.Builder(getActivity())
.setTitle(android.R.string.dialog_alert_title)
.setMessage(getString(R.string.webview_error))
.setPositiveButton(android.R.string.ok, null)
.show();
}
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setTitle(_title)
.setView(view)
.setPositiveButton(android.R.string.ok, null)
.show();
String content = getContent(getContext());
final WebView webView = view.findViewById(R.id.web_view);
webView.loadData(content, "text/html", "UTF-8");
return dialog;
}
public SimpleWebViewDialog setTheme(Theme theme) {
_theme = theme;
return this;
}
protected String getBackgroundColor() {
int backgroundColorResource = _theme == Theme.AMOLED ? R.attr.cardBackgroundFocused : R.attr.cardBackground;
return colorToCSS(ThemeHelper.getThemeColor(backgroundColorResource, getContext().getTheme()));
}
protected String getTextColor() {
return colorToCSS(0xFFFFFF & ThemeHelper.getThemeColor(R.attr.primaryText, getContext().getTheme()));
}
@SuppressLint("DefaultLocale")
private static String colorToCSS(int color) {
return String.format("rgb(%d, %d, %d)", Color.red(color), Color.green(color), Color.blue(color));
}
protected static String readAssetAsString(Context context, String name) {
try (InputStream inStream = context.getAssets().open(name);
InputStreamReader reader = new InputStreamReader(inStream, StandardCharsets.UTF_8)) {
return CharStreams.toString(reader);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -12,7 +12,7 @@ import com.beemdevelopment.aegis.Preferences;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.Theme;
import com.beemdevelopment.aegis.ViewMode;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.GroupManagerActivity;
import com.beemdevelopment.aegis.vault.VaultEntry;

View file

@ -11,7 +11,7 @@ import androidx.preference.SwitchPreferenceCompat;
import com.beemdevelopment.aegis.Preferences;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.vault.VaultManagerException;
public class BackupsPreferencesFragment extends PreferencesFragment {

View file

@ -22,7 +22,7 @@ import com.beemdevelopment.aegis.BuildConfig;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.helpers.DropdownHelper;
import com.beemdevelopment.aegis.importers.DatabaseImporter;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.ImportEntriesActivity;
import com.beemdevelopment.aegis.ui.tasks.ExportTask;
import com.beemdevelopment.aegis.vault.VaultBackupManager;

View file

@ -10,7 +10,7 @@ import androidx.preference.PreferenceFragmentCompat;
import com.beemdevelopment.aegis.AegisApplication;
import com.beemdevelopment.aegis.Preferences;
import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.vault.VaultManager;
import com.beemdevelopment.aegis.vault.VaultManagerException;

View file

@ -21,7 +21,7 @@ import com.beemdevelopment.aegis.crypto.KeyStoreHandleException;
import com.beemdevelopment.aegis.helpers.BiometricSlotInitializer;
import com.beemdevelopment.aegis.helpers.BiometricsHelper;
import com.beemdevelopment.aegis.services.NotificationService;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.SlotManagerActivity;
import com.beemdevelopment.aegis.ui.preferences.SwitchPreference;
import com.beemdevelopment.aegis.ui.tasks.PasswordSlotDecryptTask;

View file

@ -23,7 +23,7 @@ import com.beemdevelopment.aegis.helpers.BiometricSlotInitializer;
import com.beemdevelopment.aegis.helpers.BiometricsHelper;
import com.beemdevelopment.aegis.helpers.EditTextHelper;
import com.beemdevelopment.aegis.helpers.PasswordStrengthHelper;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.ui.intro.SlideFragment;
import com.beemdevelopment.aegis.ui.tasks.KeyDerivationTask;
import com.beemdevelopment.aegis.vault.VaultFileCredentials;

View file

@ -12,7 +12,7 @@ import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
public abstract class ProgressDialogTask<Params, Result> extends AsyncTask<Params, String, Result> {
private ProgressDialog _dialog;

View file

@ -30,7 +30,7 @@ import com.beemdevelopment.aegis.helpers.MetricsHelper;
import com.beemdevelopment.aegis.helpers.SimpleItemTouchHelperCallback;
import com.beemdevelopment.aegis.helpers.UiRefresher;
import com.beemdevelopment.aegis.otp.TotpInfo;
import com.beemdevelopment.aegis.ui.Dialogs;
import com.beemdevelopment.aegis.ui.dialogs.Dialogs;
import com.beemdevelopment.aegis.vault.VaultEntry;
import com.bumptech.glide.Glide;
import com.bumptech.glide.ListPreloader;
@ -45,7 +45,6 @@ import com.google.android.material.chip.ChipGroup;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;

View file

@ -178,7 +178,7 @@
</LinearLayout>
<LinearLayout
android:id="@+id/btn_licenses"
android:id="@+id/btn_license"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
@ -208,13 +208,56 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/licenses"
android:text="@string/license"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/licenses_description"
android:text="@string/license_description"
android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/btn_third_party_licenses"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:focusable="true">
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:importantForAccessibility="no"
app:ico_color="?attr/iconColorPrimary"
app:ico_icon="gmi-file-text"
app:ico_size="16dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:orientation="vertical"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/third_party_licenses"
android:textAppearance="@style/TextAppearance.AppCompat.Subhead" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/third_party_licenses_description"
android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
</LinearLayout>

View file

@ -227,8 +227,8 @@
<string name="changelog">سجل التغيير</string>
<string name="whats_new">ما الجديد</string>
<string name="github_description">الكود المصدري، والمشاكل، والمعلومات</string>
<string name="licenses">الرخصات</string>
<string name="licenses_description">الرخصات المكتبات التي يستعملها Aegis</string>
<string name="third_party_licenses">الرخصات</string>
<string name="third_party_licenses_description">الرخصات المكتبات التي يستعملها Aegis</string>
<string name="country_netherlands">هولندا</string>
<string name="email_us">اكتب بريد الكتروني</string>
<string name="visit_website">قم بزيارة موقعنا</string>

View file

@ -244,8 +244,8 @@
<string name="changelog">Seznam změn</string>
<string name="whats_new">Co je nového?</string>
<string name="github_description">Zdrojový kód, problémy a informace</string>
<string name="licenses">Licence</string>
<string name="licenses_description">Licence knihoven použitých v Aegis</string>
<string name="third_party_licenses">Licence</string>
<string name="third_party_licenses_description">Licence knihoven použitých v Aegis</string>
<string name="country_netherlands">Nizozemsko</string>
<string name="email_us">Pošlete nám e-mail</string>
<string name="visit_website">Navštivte náš web</string>

View file

@ -244,8 +244,8 @@
<string name="changelog">Änderungsprotokoll</string>
<string name="whats_new">Was ist neu</string>
<string name="github_description">Quellcode, Probleme und Informationen</string>
<string name="licenses">Lizenzen</string>
<string name="licenses_description">Lizenzen der Bibliotheken, die Aegis verwendet</string>
<string name="third_party_licenses">Lizenzen</string>
<string name="third_party_licenses_description">Lizenzen der Bibliotheken, die Aegis verwendet</string>
<string name="country_netherlands">Niederlande</string>
<string name="email_us">Eine E-Mail schreiben</string>
<string name="visit_website">Besuche unsere Website</string>

View file

@ -244,8 +244,8 @@
<string name="changelog">Αρχείο καταγραφής αλλαγών</string>
<string name="whats_new">Τι νέο υπάρχει</string>
<string name="github_description">Πηγαίος κώδικας, προβλήματα και πληροφορίες</string>
<string name="licenses">Άδειες</string>
<string name="licenses_description">Άδειες βιβλιοθηκών που χρησιμοποιεί το Aegis</string>
<string name="third_party_licenses">Άδειες</string>
<string name="third_party_licenses_description">Άδειες βιβλιοθηκών που χρησιμοποιεί το Aegis</string>
<string name="country_netherlands">Ολλανδία</string>
<string name="email_us">Γράψτε ένα email</string>
<string name="visit_website">Επισκεφτείτε την ιστοσελίδα μας</string>

View file

@ -224,8 +224,8 @@
<string name="changelog">Historial de cambios</string>
<string name="whats_new">Novedades</string>
<string name="github_description">Código fuente, problemas e información</string>
<string name="licenses">Licencias</string>
<string name="licenses_description">Licencias de las librerías usadas por Aegis</string>
<string name="third_party_licenses">Licencias</string>
<string name="third_party_licenses_description">Licencias de las librerías usadas por Aegis</string>
<string name="country_netherlands">Países Bajos</string>
<string name="email_us">Escríbanos un correo electrónico</string>
<string name="visit_website">Visite nuestra página web</string>

View file

@ -238,8 +238,8 @@
<string name="changelog">Aldaketen erregistroa</string>
<string name="whats_new">Zer berri</string>
<string name="github_description">Iturburu-kodea, arazoak eta informazioa</string>
<string name="licenses">Lizentziak</string>
<string name="licenses_description">Aegis-ek erabiltzen dituen liburutegien lizentziak</string>
<string name="third_party_licenses">Lizentziak</string>
<string name="third_party_licenses_description">Aegis-ek erabiltzen dituen liburutegien lizentziak</string>
<string name="country_netherlands">Herbehereak</string>
<string name="email_us">Idatzi eposta bat</string>
<string name="visit_website">Ikusi gure webgunea</string>

View file

@ -240,8 +240,8 @@
<string name="changelog">گزارش تغییرات</string>
<string name="whats_new">تغییرات جدید</string>
<string name="github_description">دسترسی به کد برنامه</string>
<string name="licenses">لایسنس</string>
<string name="licenses_description">لایسنس های کتابخانه های مورد استفاده</string>
<string name="third_party_licenses">لایسنس</string>
<string name="third_party_licenses_description">لایسنس های کتابخانه های مورد استفاده</string>
<string name="country_netherlands">هلند</string>
<string name="email_us">ایمیل بنویسید</string>
<string name="visit_website">از وب‌سایت ما دیدن کنید</string>

View file

@ -240,8 +240,8 @@
<string name="changelog">Muutosloki</string>
<string name="whats_new">Mitä uutta</string>
<string name="github_description">Lähdekoodi, ongelmat ja tietoa</string>
<string name="licenses">Käyttöoikeudet</string>
<string name="licenses_description">Aegisin käyttämien kirjastojen käyttöoikeudet</string>
<string name="third_party_licenses">Käyttöoikeudet</string>
<string name="third_party_licenses_description">Aegisin käyttämien kirjastojen käyttöoikeudet</string>
<string name="country_netherlands">Alankomaat</string>
<string name="email_us">Lähetä sähköpostia</string>
<string name="visit_website">Käy verkkosivuillamme</string>

View file

@ -244,8 +244,8 @@
<string name="changelog">Historique des modifications</string>
<string name="whats_new">Les nouveautés</string>
<string name="github_description">Code source, problèmes et informations</string>
<string name="licenses">Licences</string>
<string name="licenses_description">Licences des bibliothèques utilisées par Aegis</string>
<string name="third_party_licenses">Licences</string>
<string name="third_party_licenses_description">Licences des bibliothèques utilisées par Aegis</string>
<string name="country_netherlands">Pays-Bas</string>
<string name="email_us">Écrire un email</string>
<string name="visit_website">Visiter notre site internet</string>

View file

@ -235,8 +235,8 @@
<string name="changelog">परिवर्तन लॉग</string>
<string name="whats_new">नया क्या है</string>
<string name="github_description">सोर्स कोड, मुद्दे और जानकारी</string>
<string name="licenses">लाइसेंस</string>
<string name="licenses_description">लाइब्रेरीज के लाइसेंस जो Aegis उपयोग करता है</string>
<string name="third_party_licenses">लाइसेंस</string>
<string name="third_party_licenses_description">लाइब्रेरीज के लाइसेंस जो Aegis उपयोग करता है</string>
<string name="country_netherlands">नीदरलैंड</string>
<string name="email_us">ईमेल लिखें</string>
<string name="visit_website">हमारी वेबसाइट पर जाएँ</string>

View file

@ -192,8 +192,8 @@
<string name="changelog">Változásnapló</string>
<string name="whats_new">Újdonságok</string>
<string name="github_description">Forráskód, problémák és információk</string>
<string name="licenses">Licencek</string>
<string name="licenses_description">Az Aegis által használt programkönyvtárok licencei</string>
<string name="third_party_licenses">Licencek</string>
<string name="third_party_licenses_description">Az Aegis által használt programkönyvtárok licencei</string>
<string name="country_netherlands">Hollandia</string>
<string name="email_us">Írjon egy e-mailt</string>
<string name="visit_website">Keresse fel weboldalunkat</string>

View file

@ -238,8 +238,8 @@
<string name="changelog">Catatan perubahan</string>
<string name="whats_new">Apa yang baru</string>
<string name="github_description">Kode sumber, masalah dan informasi</string>
<string name="licenses">Lisensi</string>
<string name="licenses_description">Lisensi pustaka yang digunakan Aegis</string>
<string name="third_party_licenses">Lisensi</string>
<string name="third_party_licenses_description">Lisensi pustaka yang digunakan Aegis</string>
<string name="country_netherlands">Belanda</string>
<string name="email_us">Tuliskan email</string>
<string name="visit_website">Kunjungi situs web kami</string>

View file

@ -244,8 +244,8 @@
<string name="changelog">Changelog</string>
<string name="whats_new">Novità</string>
<string name="github_description">Codice, problemi e informazioni</string>
<string name="licenses">Licenze</string>
<string name="licenses_description">Licenze delle librerie usate da Aegis</string>
<string name="third_party_licenses">Licenze</string>
<string name="third_party_licenses_description">Licenze delle librerie usate da Aegis</string>
<string name="country_netherlands">Paesi Bassi</string>
<string name="email_us">Scrivici una email</string>
<string name="visit_website">Visita il nostro sito web</string>

View file

@ -239,8 +239,8 @@
<string name="changelog">更新履歴</string>
<string name="whats_new">新着情報</string>
<string name="github_description">ソースコード、問題および情報</string>
<string name="licenses">ライセンス</string>
<string name="licenses_description">Aegisが使用するライブラリーのライセンス</string>
<string name="third_party_licenses">ライセンス</string>
<string name="third_party_licenses_description">Aegisが使用するライブラリーのライセンス</string>
<string name="country_netherlands">オランダ</string>
<string name="email_us">メールを書く</string>
<string name="visit_website">ウェブサイトを表示</string>

View file

@ -134,8 +134,8 @@
<string name="changelog">ಬದಲಾವಣೆ ಲಾಗ್</string>
<string name="whats_new">ಹೊಸತೇನಿದೆ</string>
<string name="github_description">ಮೂಲ ಕೋಡ್, ಸಮಸ್ಯೆಗಳು ಹಾಗು ಮಾಹಿತಿ</string>
<string name="licenses">ಪರವಾನಗಿಗಳು</string>
<string name="licenses_description">Aegis ಉಪಯೋಗಿಸುವ ಲೈಬ್ರೆರಿಗಳ ಪರವಾನಗಿಗಳು</string>
<string name="third_party_licenses">ಪರವಾನಗಿಗಳು</string>
<string name="third_party_licenses_description">Aegis ಉಪಯೋಗಿಸುವ ಲೈಬ್ರೆರಿಗಳ ಪರವಾನಗಿಗಳು</string>
<string name="country_netherlands">ನೆದರ್ಲೆಂಡ್ಸ್</string>
<string name="email_us">ಈಮೇಲನ್ನು ಬರಿ</string>
<string name="visit_website">ನಮ್ಮ ಅಂತರ್ಜಾಲದ ಪುಟವನ್ನು ಭೇಟಿ ಮಾಡು</string>

View file

@ -244,8 +244,8 @@
<string name="changelog">Wijzigingen</string>
<string name="whats_new">Vernieuwingen</string>
<string name="github_description">Broncode, problemen en informatie</string>
<string name="licenses">Licenties</string>
<string name="licenses_description">Licenties van gebruikte libraries</string>
<string name="third_party_licenses">Licenties</string>
<string name="third_party_licenses_description">Licenties van gebruikte libraries</string>
<string name="country_netherlands">Nederland</string>
<string name="email_us">Schrijf een email</string>
<string name="visit_website">Bekijk de website</string>

View file

@ -252,8 +252,8 @@
<string name="changelog">Lista zmian</string>
<string name="whats_new">Co nowego</string>
<string name="github_description">Kod źródłowy, problemy i informacje</string>
<string name="licenses">Licencje</string>
<string name="licenses_description">Licencje bibliotek, z których korzysta aplikacja Aegis</string>
<string name="third_party_licenses">Licencje</string>
<string name="third_party_licenses_description">Licencje bibliotek, z których korzysta aplikacja Aegis</string>
<string name="country_netherlands">Holandia</string>
<string name="email_us">Napisz wiadomość e-mail</string>
<string name="visit_website">Odwiedź naszą stronę</string>

View file

@ -244,8 +244,8 @@
<string name="changelog">Registro de Mudanças</string>
<string name="whats_new">O que há de novo</string>
<string name="github_description">Código fonte, problemas e informações</string>
<string name="licenses">Licenças</string>
<string name="licenses_description">Licenças das bibliotecas usadas pelo Aegis</string>
<string name="third_party_licenses">Licenças</string>
<string name="third_party_licenses_description">Licenças das bibliotecas usadas pelo Aegis</string>
<string name="country_netherlands">Países Baixos</string>
<string name="email_us">Escreva-nos um email</string>
<string name="visit_website">Visite nosso site</string>

View file

@ -244,8 +244,8 @@
<string name="changelog">Registo de alterações</string>
<string name="whats_new">O que há de novo</string>
<string name="github_description">Código fonte, problemas e informações</string>
<string name="licenses">Licenças</string>
<string name="licenses_description">Licenças das bibliotecas utilizadas pelo Aegis</string>
<string name="third_party_licenses">Licenças</string>
<string name="third_party_licenses_description">Licenças das bibliotecas utilizadas pelo Aegis</string>
<string name="country_netherlands">Holanda</string>
<string name="email_us">Escreva um e-mail</string>
<string name="visit_website">Visite o nosso site</string>

View file

@ -246,8 +246,8 @@
<string name="changelog">Istoric modificări</string>
<string name="whats_new">Ce este nou</string>
<string name="github_description">Cod sursă, probleme și informații</string>
<string name="licenses">Licențe</string>
<string name="licenses_description">Licenţele bibliotecilor Aegis utilizeaza</string>
<string name="third_party_licenses">Licențe</string>
<string name="third_party_licenses_description">Licenţele bibliotecilor Aegis utilizeaza</string>
<string name="country_netherlands">Olanda</string>
<string name="email_us">Scrieţi un e-mail</string>
<string name="visit_website">Vizitați site-ul nostru web</string>

View file

@ -252,8 +252,8 @@
<string name="changelog">Список изменений</string>
<string name="whats_new">Что нового</string>
<string name="github_description">Исходный код, замечания и информация</string>
<string name="licenses">Лицензии</string>
<string name="licenses_description">Лицензии библиотек, используемых в Aegis</string>
<string name="third_party_licenses">Лицензии</string>
<string name="third_party_licenses_description">Лицензии библиотек, используемых в Aegis</string>
<string name="country_netherlands">Нидерланды</string>
<string name="email_us">Написать эл. письмо</string>
<string name="visit_website">Посетить наш веб-сайт</string>

View file

@ -198,8 +198,8 @@
<string name="changelog">Değişiklik Günlüğü</string>
<string name="whats_new">Yeni ne var?</string>
<string name="github_description">Kaynak kod, sorunlar ve bilgiler</string>
<string name="licenses">Lisanslar</string>
<string name="licenses_description">Aegis\'in kullandığı kütüphanelerin lisansları</string>
<string name="third_party_licenses">Lisanslar</string>
<string name="third_party_licenses_description">Aegis\'in kullandığı kütüphanelerin lisansları</string>
<string name="country_netherlands">Hollanda</string>
<string name="email_us">Bir e-posta yazın</string>
<string name="visit_website">Sitemizi ziyaret edin</string>

View file

@ -240,8 +240,8 @@
<string name="changelog">更新日志</string>
<string name="whats_new">新增功能</string>
<string name="github_description">源代码,问题和信息</string>
<string name="licenses">许可证</string>
<string name="licenses_description">Aegis 使用的许可证和库</string>
<string name="third_party_licenses">许可证</string>
<string name="third_party_licenses_description">Aegis 使用的许可证和库</string>
<string name="country_netherlands">荷兰</string>
<string name="email_us">发送电子邮件</string>
<string name="visit_website">访问我们的网站</string>

View file

@ -230,8 +230,8 @@
<string name="changelog">更新日誌</string>
<string name="whats_new">有什麼新鮮事</string>
<string name="github_description">源代碼、議題和訊息</string>
<string name="licenses">許可證</string>
<string name="licenses_description">Aegis 使用的許可證和庫</string>
<string name="third_party_licenses">許可證</string>
<string name="third_party_licenses_description">Aegis 使用的許可證和庫</string>
<string name="country_netherlands">荷蘭</string>
<string name="email_us">發送電子郵件</string>
<string name="visit_website">訪問我們的網站</string>

View file

@ -275,8 +275,10 @@
<string name="whats_new">What\'s new</string>
<string name="github" translatable="false">GitHub</string>
<string name="github_description">Source code, issues and information</string>
<string name="licenses">Licenses</string>
<string name="licenses_description">Licenses of the libraries Aegis uses</string>
<string name="license">License</string>
<string name="license_description">Aegis Authenticator is licensed under GPLv3</string>
<string name="third_party_licenses">Third-party licenses</string>
<string name="third_party_licenses_description">Licenses of the third-party libraries Aegis uses</string>
<string name="author_alex" translatable="false">Alexander Bakker</string>
<string name="country_netherlands">Netherlands</string>
<string name="author_michael" translatable="false">Michael Schättgen</string>
@ -285,7 +287,7 @@
<string name="about_support">Support</string>
<string name="support_rate">Rate</string>
<string name="support_rate_description">Support us by leaving a review in the Google Play Store</string>
<string name="webview_error">This device doesn\'t support web view, which is necessary to view the changelog. It is missing a system component.</string>
<string name="webview_error">This device doesn\'t support web view, which is necessary to view the changelog and the license. It is missing a system component.</string>
<string name="email">Email</string>
<string name="time_sync_warning_title">Automatic time synchronization</string>
<string name="time_sync_warning_message">Aegis relies on the system time to be in sync to generate correct codes. A deviation of only a few seconds could result in incorrect codes. It looks like your device is not configured to automatically synchronize the time. Would you like to do so now?</string>