diff --git a/app/build.gradle b/app/build.gradle
index 5af2e8a1..79a0eb37 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,6 +1,6 @@
repositories {
google()
- jcenter()
+ mavenCentral()
maven { url 'https://jitpack.io' }
}
@@ -9,13 +9,16 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
+def financierPropertiesFile = rootProject.file("./Keys/financier.properties")
+def financierProperties = new Properties()
+
+financierProperties.load(new FileInputStream(financierPropertiesFile))
+
android {
buildFeatures {
dataBinding true
- // viewBinding true
}
compileSdkVersion 30
- buildToolsVersion '29.0.3'
flavorDimensions "channel"
productFlavors {
@@ -30,12 +33,21 @@ android {
}
}
+ signingConfigs {
+ release {
+ storeFile file(financierProperties['storeFile'])
+ storePassword financierProperties['storePassword']
+ keyAlias financierProperties['keyAlias']
+ keyPassword financierProperties['keyPassword']
+ }
+ }
+
defaultConfig {
applicationId "com.handydev.financier"
minSdkVersion 21
- targetSdkVersion 30
- versionCode 215
- versionName "2.0.15"
+ targetSdkVersion 29
+ versionCode 216
+ versionName "2.0.16"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
javaCompileOptions {
@@ -50,6 +62,7 @@ android {
buildTypes {
release {
minifyEnabled false
+ signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
applicationVariants.all { variant ->
variant.outputs.all { output ->
@@ -114,25 +127,25 @@ def eventbus_version = '3.2.0'
dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
- implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.multidex:multidex:2.0.1'
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
implementation "androidx.viewpager2:viewpager2:1.0.0"
- kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
+ implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
//googledrive
googleplayImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1'
googleplayImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
- googleplayImplementation 'com.google.android.gms:play-services-auth:19.0.0'
+ googleplayImplementation 'com.google.android.gms:play-services-auth:19.2.0'
googleplayImplementation 'com.google.http-client:google-http-client-gson:1.26.0'
googleplayImplementation 'com.google.api-client:google-api-client-android:1.26.0'
googleplayImplementation 'com.google.apis:google-api-services-drive:v3-rev136-1.25.0'
//googledrive misc
- googleplayImplementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-rc1'
+ googleplayImplementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
googleplayImplementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
- googleplayImplementation ('androidx.work:work-runtime-ktx:2.4.0'){
+ googleplayImplementation ('androidx.work:work-runtime-ktx:2.5.0'){
//Needed due to a transitive dependency clash with the google api client dep
exclude group: 'com.google.guava', module:'listenablefuture'
}
@@ -141,14 +154,14 @@ dependencies {
//untied - SAME AS ABOVE
untiedImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1'
untiedImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
- untiedImplementation 'com.google.android.gms:play-services-auth:19.0.0'
+ untiedImplementation 'com.google.android.gms:play-services-auth:19.2.0'
untiedImplementation 'com.google.http-client:google-http-client-gson:1.26.0'
untiedImplementation 'com.google.api-client:google-api-client-android:1.26.0'
untiedImplementation 'com.google.apis:google-api-services-drive:v3-rev136-1.25.0'
//googledrive misc
- untiedImplementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-rc01'
+ untiedImplementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
untiedImplementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
- untiedImplementation ('androidx.work:work-runtime-ktx:2.4.0'){
+ untiedImplementation ('androidx.work:work-runtime-ktx:2.5.0'){
//Needed due to a transitive dependency clash with the google api client dep
exclude group: 'com.google.guava', module:'listenablefuture'
}
@@ -162,26 +175,26 @@ dependencies {
implementation 'net.sf.trove4j:trove4j:3.0.3'
implementation 'com.dropbox.core:dropbox-core-sdk:3.1.3'
- implementation 'com.squareup.okhttp3:okhttp:3.14.9'
- implementation 'com.squareup.okio:okio:1.17.5'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.1'
+ implementation 'com.squareup.okio:okio:2.8.0'
implementation "org.greenrobot:eventbus:$eventbus_version"
kapt "org.greenrobot:eventbus-annotation-processor:$eventbus_version"
implementation 'com.wdullaer:materialdatetimepicker:3.6.4'
- implementation 'commons-io:commons-io:2.5'
+ implementation 'commons-io:commons-io:2.6'
implementation 'com.mtramin:rxfingerprint:2.2.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.19'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'org.reactivestreams:reactive-streams:1.0.3'
implementation 'com.mlsdev.rximagepicker:library:2.1.5'
implementation 'com.github.bumptech.glide:glide:4.11.0'
- implementation 'com.google.android.material:material:1.2.1'
+ implementation 'com.google.android.material:material:1.4.0'
implementation fileTree(include: '**/*.jar', dir: 'libs')
testImplementation 'junit:junit:4.13.1'
- testImplementation 'androidx.test:core:1.3.0'
+ testImplementation 'androidx.test:core:1.4.0'
testImplementation 'org.robolectric:robolectric:4.4'
- implementation "androidx.core:core-ktx:+"
+ implementation "androidx.core:core-ktx:1.6.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6b2daa05..cc40d8a4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -19,7 +19,7 @@
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true" />
-
+
diff --git a/app/src/main/assets/whatsnew.htm b/app/src/main/assets/whatsnew.htm
index 63ab1fb2..6e4c054d 100644
--- a/app/src/main/assets/whatsnew.htm
+++ b/app/src/main/assets/whatsnew.htm
@@ -17,6 +17,15 @@
+2.0.16
+
+ [*]Crash fixed when going back from Add Category screen.
+ [*]Duplicate categories in Category selector fixed.
+ [*]Fix Backup not working on Android 11.
+ [*]Ukrainian locale improved.
+ [*]Updated third party libraries.
+
+
2.0.15
[*]Crash fixed.
diff --git a/app/src/main/java/com/handydev/financier/activity/MyEntitySelector.kt b/app/src/main/java/com/handydev/financier/activity/MyEntitySelector.kt
index ae91f0ab..3678cc30 100644
--- a/app/src/main/java/com/handydev/financier/activity/MyEntitySelector.kt
+++ b/app/src/main/java/com/handydev/financier/activity/MyEntitySelector.kt
@@ -219,8 +219,8 @@ abstract class MyEntitySelector internal co
}
}
- fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
- if (resultCode == Activity.RESULT_OK && requestCode == actBtnId) {
+ fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ if (resultCode == Activity.RESULT_OK && requestCode == actBtnId && data != null) {
onNewEntity(data)
}
}
diff --git a/app/src/main/java/com/handydev/financier/activity/RequestPermission.java b/app/src/main/java/com/handydev/financier/activity/RequestPermission.java
index 07855b75..5ceb4c66 100644
--- a/app/src/main/java/com/handydev/financier/activity/RequestPermission.java
+++ b/app/src/main/java/com/handydev/financier/activity/RequestPermission.java
@@ -1,9 +1,14 @@
package com.handydev.financier.activity;
+import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.Environment;
+
import androidx.core.content.ContextCompat;
+import static android.os.Build.VERSION.SDK_INT;
+
public class RequestPermission {
public static boolean isRequestingPermission(Context context, String permission) {
@@ -15,6 +20,11 @@ public static boolean isRequestingPermission(Context context, String permission)
}
public static boolean checkPermission(Context ctx, String permission) {
+ /*if(SDK_INT >= 30) {
+ if(permission.equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+ return Environment.isExternalStorageManager();
+ }
+ }*/
return ContextCompat.checkSelfPermission(ctx, permission) == PackageManager.PERMISSION_GRANTED;
}
diff --git a/app/src/main/java/com/handydev/financier/activity/RequestPermissionActivity.java b/app/src/main/java/com/handydev/financier/activity/RequestPermissionActivity.java
index 01ac6dac..d2f23254 100644
--- a/app/src/main/java/com/handydev/financier/activity/RequestPermissionActivity.java
+++ b/app/src/main/java/com/handydev/financier/activity/RequestPermissionActivity.java
@@ -1,14 +1,24 @@
package com.handydev.financier.activity;
import android.Manifest;
+import android.app.Activity;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.PackageManager;
+
+import androidx.activity.result.ActivityResult;
+import androidx.activity.result.ActivityResultCallback;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.appcompat.widget.SwitchCompat;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
@@ -23,6 +33,9 @@
import com.handydev.financier.R;
import com.handydev.financier.utils.MyPreferences;
+import static android.os.Build.VERSION.SDK_INT;
+import static android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION;
+
@EActivity(R.layout.activity_request_permissions)
public class RequestPermissionActivity extends AppCompatActivity {
@@ -53,11 +66,28 @@ public class RequestPermissionActivity extends AppCompatActivity {
@ViewById(R.id.toggleSms)
SwitchCompat toggleSms;
+ ActivityResultLauncher activityResultLauncher;
+
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(MyPreferences.switchLocale(base));
}
+ /* @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if(SDK_INT >= 30) {
+ activityResultLauncher = registerForActivityResult(
+ new ActivityResultContracts.StartActivityForResult(),
+ new ActivityResultCallback() {
+ @Override
+ public void onActivityResult(ActivityResult result) {
+ checkAllFilesPermission();
+ }
+ });
+ }
+ }*/
+
@AfterViews
public void initViews() {
checkPermissions();
@@ -66,8 +96,16 @@ public void initViews() {
}
}
+ private void checkAllFilesPermission() {
+ enableToggle(!Environment.isExternalStorageManager(), toggleWriteStorage, toggleWriteStorageWrap);
+ }
+
private void checkPermissions() {
- disableToggleIfGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE, toggleWriteStorage, toggleWriteStorageWrap);
+ //if(SDK_INT >= 30) {
+ // checkAllFilesPermission();
+ //} else {
+ disableToggleIfGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE, toggleWriteStorage, toggleWriteStorageWrap);
+ //}
disableToggleIfGranted(Manifest.permission.GET_ACCOUNTS, toggleGetAccounts, toggleGetAccountsWrap);
disableToggleIfGranted(Manifest.permission.CAMERA, toggleCamera, toggleCameraWrap);
if(!BuildConfig.FLAVOR.equals("googleplay")) {
@@ -77,17 +115,26 @@ private void checkPermissions() {
private void disableToggleIfGranted(String permission, CompoundButton toggleButton, ViewGroup wrapLayout) {
if (isGranted(permission)) {
- toggleButton.setChecked(true);
- toggleButton.setEnabled(false);
- wrapLayout.setBackgroundResource(0);
+ enableToggle(false, toggleButton, wrapLayout);
} else if (permission.equals(requestedPermission)) {
wrapLayout.setBackgroundResource(R.drawable.highlight_border);
}
}
+ private void enableToggle(Boolean enable, CompoundButton toggleButton, ViewGroup wrapLayout) {
+ toggleButton.setChecked(!enable);
+ toggleButton.setEnabled(enable);
+ wrapLayout.setBackgroundResource(0);
+ }
+
@Click(R.id.toggleWriteStorage)
public void onGrantWriteStorage() {
- requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, toggleWriteStorage);
+ /*if(SDK_INT >= 30){
+ Intent intent = new Intent(ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
+ activityResultLauncher.launch(intent);
+ } else {*/
+ requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, toggleWriteStorage);
+ //}
}
@Click(R.id.toggleGetAccounts)
diff --git a/app/src/main/java/com/handydev/financier/db/DatabaseAdapter.kt b/app/src/main/java/com/handydev/financier/db/DatabaseAdapter.kt
index 119b226a..dc3a543b 100644
--- a/app/src/main/java/com/handydev/financier/db/DatabaseAdapter.kt
+++ b/app/src/main/java/com/handydev/financier/db/DatabaseAdapter.kt
@@ -630,15 +630,6 @@ open class DatabaseAdapter(context: Context?) : MyEntityManager(context) {
}
}
return CategoryTree.createFromCache(categories)
- /*val c: Cursor = when {
- excludingTreeId > 0 -> {
- getCategoriesWithoutSubtree(excludingTreeId, includeNoCategory)
- }
- else -> {
- getCategories(includeNoCategory)
- }
- }
- return CategoryTree.createFromCursor(c) { obj: Cursor? -> formCursor(c) }*/
}
fun getCategoriesTree(includeNoCategory: Boolean): CategoryTree {
diff --git a/app/src/main/java/com/handydev/financier/fragments/BudgetListFragment.kt b/app/src/main/java/com/handydev/financier/fragments/BudgetListFragment.kt
index 167e706d..c1dbbd37 100644
--- a/app/src/main/java/com/handydev/financier/fragments/BudgetListFragment.kt
+++ b/app/src/main/java/com/handydev/financier/fragments/BudgetListFragment.kt
@@ -50,9 +50,9 @@ class BudgetListFragment: AbstractListFragment(R.layout.budget_list) {
override fun internalOnCreate(savedInstanceState: Bundle?) {
super.internalOnCreate(savedInstanceState)
val totalText = view?.findViewById(R.id.total)
- totalText?.setOnClickListener { view: View? -> showTotals() }
- bFilter = view?.findViewById(R.id.bFilter)
- bFilter!!.setOnClickListener { v: View? ->
+ totalText?.setOnClickListener { showTotals() }
+ bFilter = view?.findViewById(R.id.bFilter)
+ bFilter!!.setOnClickListener {
val intent = Intent(activity!!, DateFilterActivity::class.java)
filter.toIntent(intent)
startActivityForResult(intent, FILTER_BUDGET_REQUEST)
@@ -183,7 +183,7 @@ class BudgetListFragment: AbstractListFragment(R.layout.budget_list) {
val recur = RecurUtils.createFromExtraString(b.recur)
AlertDialog.Builder(activity!!)
.setMessage(if (recur.interval === RecurInterval.NO_RECUR) R.string.delete_budget_confirm else R.string.delete_budget_recurring_confirm)
- .setPositiveButton(R.string.yes) { arg0, arg1 ->
+ .setPositiveButton(R.string.yes) { _, _ ->
db!!.deleteBudget(id)
recreateCursor()
}
diff --git a/app/src/main/java/com/handydev/financier/model/Category.kt b/app/src/main/java/com/handydev/financier/model/Category.kt
index cdd11217..cd94cdd7 100644
--- a/app/src/main/java/com/handydev/financier/model/Category.kt
+++ b/app/src/main/java/com/handydev/financier/model/Category.kt
@@ -12,7 +12,6 @@ package com.handydev.financier.model
import android.database.Cursor
import com.handydev.financier.db.CategoriesCache
-import com.handydev.financier.db.DatabaseAdapter
import com.handydev.financier.db.DatabaseHelper.CategoryViewColumns
import javax.persistence.Column
import javax.persistence.Entity
diff --git a/app/src/main/java/com/handydev/financier/model/CategoryEntity.kt b/app/src/main/java/com/handydev/financier/model/CategoryEntity.kt
index 8e3209d8..dd630ab9 100644
--- a/app/src/main/java/com/handydev/financier/model/CategoryEntity.kt
+++ b/app/src/main/java/com/handydev/financier/model/CategoryEntity.kt
@@ -40,6 +40,9 @@ open class CategoryEntity> : MyEntity() {
if (children == null) {
children = CategoryTree()
}
+ if(children?.any { it.id == category.id } == true) {
+ return
+ }
category.parent = this as T
category.type = type
children!!.add(category)
diff --git a/app/src/main/java/com/handydev/financier/model/CategoryTree.kt b/app/src/main/java/com/handydev/financier/model/CategoryTree.kt
index 811dfe3a..9669f348 100644
--- a/app/src/main/java/com/handydev/financier/model/CategoryTree.kt
+++ b/app/src/main/java/com/handydev/financier/model/CategoryTree.kt
@@ -220,9 +220,6 @@ class CategoryTree> : Iterable {
if(category.title == Category.noCategory().title) {
return
}
- if(level > 10) {
- Log.d("f", "f")
- }
addCategoryIfNeeded(category, parent)
var children = categoriesList.filter { it.left >= category.left && it.right <= category.right && it.id != category.id }
for(child in children) {
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index b982eb55..6c75c802 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -1,6 +1,6 @@
-
+
Konten
Protokoll
Währungen
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 228de351..93dafc9a 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -855,8 +855,8 @@
Уведомлять о проблемах
Уведомлять если авто-бэкап не завершился успешно.
Включите автоматическое резервное копирование на Google Диск или Dropbox, чтобы обеспечить сохранность ваших данных. Перейдите в Меню -> Настройки -> Резервная копия базы.
- %s%n(Нажмите чтобы убрать это сообщение)
- Авто-бэкап завершился в %s с ошибкой [%s].
+ %s (Нажмите чтобы убрать это сообщение)
+ Авто-бэкап завершился в %1$s с ошибкой [%2$s].
Разрешение Читать/Писать Внешний Носитель не выдано
Разрешения
@@ -942,7 +942,7 @@
- Список
- %s: не удалось найти \"%s\"? Создать новую сущность?
+ %1$s: не удалось найти \"%2$s\"? Создать новую сущность?
Категория: не удалось найти \"%s\"? Создайте новую категорию нажав кнопку +.
Список
diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml
index b22f1321..64f54f2a 100644
--- a/app/src/main/res/values-uk-rUA/strings.xml
+++ b/app/src/main/res/values-uk-rUA/strings.xml
@@ -1,6 +1,5 @@
-
-
+
Рахунки
Журнал
Валюти
@@ -60,8 +59,10 @@
Використовувати копійки
Проект
Будь ласка, оберіть рахунок...
- Будь ласка виберіть валюту...
+ Будь ласка, виберіть валюту...
Будь ласка, оберіть категорію...
+ Будь ласка, оберіть одержувача...
+ Почніть друкувати…
Будь ласка, виберіть проект...
Увага
Почніть зі створення рахунку. Натисніть на зелений \'+\' внизу...
@@ -100,6 +101,12 @@
Без атрибутів
Додати атрибут
Новий атрибут
+
+ - Текст
+ - Число
+ - Список
+ - Прапорець
+
Тип
Назва
Значення
@@ -117,6 +124,8 @@
Перейти до маркера
Нажміть на вказівник \"Моє місцезнаходження\"
Примітка
+ Примітка містить
+ Містить \"%1$s\"
Служба недоступна, будь ласка, спробуйте ще раз пізніше
Визначити адресу
Визначення адреси...
@@ -133,6 +142,7 @@
Звіт за місцезнаходженням
За проектами
Звіт по проектам
+
По рахункам за період
Звіт по рахункам за період часу
По категоріям за період
@@ -155,6 +165,7 @@
Не знайдені рахунки за вказаним фільтром.
Не знайдені місцезнаходження за вказаним фільтром.
Рахунок не вказаний
+
Сьогодні
Вчора
Цього тижня
@@ -181,6 +192,11 @@
Цей запис
Усі записи
Ви редагуєте бюджет який повторюється, зміни торкнуться всіх повтореннь
+
+ - Банк
+ - Готівка
+ - Кредитка
+
Тип рахунку
Емітент
Готівка
@@ -202,12 +218,37 @@
Інтерфейс користувача
Сортування рахунків
Порядок сортування рахунків у списку (вимагає перезапуску)
+
+ - За порядком сортування (зростання)
+ - За порядком сортування (спадання)
+ - За ім\'ям
+ - За останньою транзакцією (зростання)
+ - За останньою транзакцією (спадання)
+
Сортування розташувань
Сортування для списку розташувань
+
+ - За ім\'ям
+ - За частотою
+
Сортування шаблонів
Порядок сортування списку шаблонів
+
+ - За датою створення
+ - За ім\'ям
+ - За аккаунтами
+
Сортування бюджетів
Порядок сортування списку бюджетів
+
+ - За датою початку
+ - За ім\'ям
+ - За розміром
+
+
+ - Від новіших до старіших
+ - Від старіших до новіших
+
Більше продуктів...
PIN-код захисту
Поставте, щоб захистити запуск PIN-кодом
@@ -228,6 +269,7 @@
Відновлення бази даних...
Відновити з Google Drive
Відновлення бази даних...
+ Відновлення бази даних...
Базу даних успішно відновлено.
Не можна підключитися до Google Диска.
Резервну папку на Google Диску не знайдено.
@@ -235,9 +277,11 @@
Вкажіть папку резервної копії Google Диску у налаштуваннях.
Помилка надсилання файлу резервної копії Google Диску. Будь ласка, спробуйте ще раз.
Помилка під час отримання файлу резервної копії. Будь ласка, спробуйте ще раз.
+
Помилка доступу до папки в Google Диску.
Помилка, служба не доступна в Google Диску.
Помилка підключення з Google Диском.
+
Успішно! %s
Невдало...
Дублювати
@@ -245,6 +289,7 @@
Виберіть рахунок одержувач...
Оновити баланс
Закрити рахунок
+ Закрити рахунок?
Перевідкрити рахунок
Різниця
Новий баланс
@@ -319,9 +364,9 @@
Повторення
Період
Пн
- Вівт
+ Вт
Ср
- Чет
+ Чт
Пт
Сб
Нд
@@ -342,6 +387,7 @@
Пароль облікового запису Google
Резервна папка
Для зберігання файлів резервної копії створити нову папку в Мій диск
+
Параметри звіту
Основні налаштування звітів
Налаштування для звітів за категоріями
@@ -359,8 +405,23 @@
Останнє півріччя
За останні 9 місяців
За останній рік
- Звітний період
- Вкажіть період (к-ть місяців) для графиків у звіті
+
+ - 6 місяців тому
+ - 3 місяці тому
+ - Попередній місяць
+ - Поточний місяць
+ - Гаступний місяць
+ - Через 3 місяці
+ - Через 6 місяці
+
+ Контрольний період
+ Визначте контрольний період (кількість місяців), який слід враховувати при відкритті діаграм звітів
+
+ - 3 місяці
+ - 6 місяців
+ - 9 місяців
+ - 1 рік
+
Звітна валюта
Вкажіть валюту для використання у звітах
Останні $n місяців
@@ -389,6 +450,7 @@
Жовтень
Листопад
Грудень
+
Інше
Назва шаблону
Шаблони
@@ -448,15 +510,15 @@
Z
Z-Z
Z-Z-Z
- ZZ
- ZZ-Zz
- Хр-Хр-Хр
+ Zz
+ Zz-Zz
+ Zz-Zz-Zz
Зелений
Синій
Жовтий
Червоний
Рожевий
- Звук:%s Вібрація:%s Світлодіод:%s
+ Звук:%s Вібрація:%s Світло:%s
Нетиповий
За замовчуванням
Мелодія
@@ -478,6 +540,7 @@
Показувати баланс на віджеті
Прикріпити зображення
Зробити знімок
+
Подяка
Сортувати за назвою
Сортувати все за назвою
@@ -489,6 +552,7 @@
Розрахунковий день
День, в який ви оплачуєте рахунок кредитної картки.
День, в який здійснюють оплату
+
Розрахунковий день по виписці
Звітний період
Використовувати регулярний день оплати
@@ -496,6 +560,7 @@
Неприпустиме значення. Вставте день оплати для звітного місяця.
Вставте новий день розрахунку.
Власний день розрахунку повинен відрізнятися від регулярного дня.
+
Виписка
Виписка за місяць
Виписка за кредитною карткою
@@ -511,20 +576,20 @@
Платежі
Різні надхождення
Витрати
- локалізація
+ Мова
Встановіть мову інтерфейсу (потрібне перезавантаження!)
+
Введіть PIN
Масові операції
- UnionPay
PayPal
Використовувати фільтр для пошуку транзакцій
Очистити все
Узгодити все
Видалити все
- Выконати
+ Виконати
Застосувати \'%s\' на %d транзакцію(й)?
Не вибрано транзакцій…
- Юридичні особи
+ Суб\'єкти
Відновити
Відновлені заплановані транзакції
Відновлено %d пропущених транзакцій. Використовуйте масові операції для роботи з ними.
@@ -539,24 +604,44 @@
За одержувача / Період
Звіт по одержувачам транзакцій за період
Без одержувачів
+ Без одержувачів
Не знайдено одержувачів за вказаним фільтром у звіті.
Зробити пожертву
Android Маркет недоступний на вашому пристрої
Тип
+
Експорт QIF
Експортування даних до QIF...
Усі рахунки
Не знайдено...
Порожній звіт
День місяця
+
Відображати поточний баланс
Показувати поточний баланс рахунку в Журналі (потрібен перезапуск)
+
+ Альтернативний колір для парних та непарних рядочків журналу
+ Альтернативний колір для рядочків журналу
+
+ Альтернативний колір для парних та непарних рядочків облікових записів
+ Альтернативний колір для рядочків облікових записів
+
Нова валюта...
Час блокування
Час утримання екрану активним перед його блокуванням
+
+ - Вимк.
+ - 1 хвилина
+ - 3 хвилини
+ - 5 хвилин
+ - 10 хвилин
+ - 15 хвилин
+
+
Формат дати
Блокувати Нову Транзакцію\\Переказ
Блокувати екрани \'Нову транзакцію\' та \'Новий переказ\' піном
+
[Розділити...]
[Розділена транзакція]
[Розділений переказ]
@@ -564,12 +649,15 @@
Лишилася деяка нерозділена сума транзакції…
Ця транзакція частина розділеної транзакції. Ви справді хочете видалити батьківську транзакцію?
Отримання курсу обміну %s/%s ...
+ Завантажити курс валют з %s…
+
Сума
Відкорегувати суму
Рівномірно
Поділити порівно
Останній
Коригувати останню
+
Додати переказ
Ім\'я файла
Оберіть рахунок
@@ -578,22 +666,36 @@
Імпорт даних з CSV...
Вибрати ім\'я файлу імпорту
Не знайдено файл імпорту
+ Import file not found. Please try it without the prefix\n\'%1$s\'
Невідома категорія файлу імпорту
Невідомий проекту у файлі імпорту
Неправильна валюта у файлі імпорту
+ Wrong currency in import file: %1$s\nPlease separate the different accounts into different files.
Виняток невірного аргумента
Помилка аналізу файлу імпорту
Помилка імпорту CSV
+
Імпортувати QIF
Імпортувати дані з QIF...
Помилка імпорту QIF
QIF файл було успішно імпортовано
Імпорт/експорт
*ПОПЕРЕДЖЕННЯ* Зверніть увагу, що всі існуючі дані будуть видалені!
+
+ Google Диск
+ Включити синхронізацію з Google Диском
+ Синхронізація зображень з Диском
+ Вивантжувати зображення
+ Вивантжувати прикріплені зображеннядо Google Диску
+ Папка Google Диск
+ Виберіть папку Google Диску для збереження зображень
+
Остання категорія
Запам\'ятати останню категорію для обраного одержувача (або рахунку, якщо поле одержувача вимкнене)
+
Формат символу
Використовувати заголовку з файлу
+
Інформація
Баланс
Категорія переказу
@@ -608,16 +710,21 @@
Новий
Створити нову папку
Не вдалося створити теку
+
Резервування бази даних
Тека резервної копії
Поточна тека резервних копій бази даних: %s
+
Надіслати резервну копію до…
Надіслати резервну копію бази даних до…
+
Ліцензія
+
Швидке меню рахунків
Увімкнути швидке меню у рахунках
Швидке меню журналу
Увімкнути швидке меню у журналі
+
Dropbox
Авторизація
Дозволити Financier вивантажувати файли на ваш Dropbox
@@ -628,6 +735,10 @@
Вивантажувати автоматичні копії
Вивантажувати автоматичні копії на Dropbox
Вивантаження файлу на Dropbox…
+ Помилка при роботі з Dropbox
+ Не дозволено вивантажувати в Dropbox. Будь ласка перевірте Налаштування.
+ Завантаження файлів з Dropbox...
+
Курси валют
Немає курсів валют
Курс обміну
@@ -635,15 +746,17 @@
До валюти
Зробити типовою
Будь ласка, встановіть валюту за замовчуванням, щоб отримати правильний Баланс (Меню - > Сутності - > Валюти)
+
Назад
Виберіть
- Селектор категорій
- Ієрархічний селектор
+ Вибір категорій
+ Ієрархічний вибір
Використовувати ієрархічний вибір категорій
Підтвердити автоматично
Підтвердити автоматично вибір дочірньої категорії
Доходи/витрати
Групувати категорії доходів і витрат разом
+
Загалом
Усі рахунки %s
Усі %s транзакції
@@ -655,14 +768,19 @@
Н/Д
Немає обмінного курсу на %s, щоб обчислити суму від %s до %s
Немає обмінного курсу від %s до %s
+
Об\'єднати кнопки журналу
Групувати разом кнопки Нова транзакція/Переказ/Шаблон (потрібний перезапуск)
+
Активний
+
Доходи/витрати
Дохід
Витрати
Всього
+
Імпорт даних з CSV: %s%%...
+
Видалити старі транзакції
Зробити резервну копію перед видаленням транзакцій
Видалити транзакції до і включно по вказану дату. Баланси рахунків не зміняться.
@@ -671,6 +789,7 @@
Попередній період
Видалення старих транзакцій…
Не вдається зробити резервну копію бази даних, переривання...
+
Дата останньої транзакції
Показати дату останньої транзакції у списку рахунків (потрібний перезапуск)
Список рахунків
@@ -682,123 +801,211 @@
Переіндексувати
Екран запуску
Виберіть вкладку, яка буде обрана під час запуску
+
+ - Рахунки
+ - Журнал
+ - Бюджети
+ - Звіти
+
+
Поточні баланси не вірні, будь лааска, перейдіть Меню -> Більше -> Виправлення даних
Виправлення даних
Перевірка та виправлення за необхідності…
+
Не можна переказувати на один той же рахунок...
- Цього і минулого тижня
- Цього і минулого місяця
+
+ Цього і попереднього тижня
+ Цього і попереднього місяця
Власний
+
Початкова сума
Валюта рахунку
- Спліт перекази валютою, яка відрізняються від валюти рахунку, ще не підтримуються
+ Розділені перекази валютою, яка відрізняються від валюти рахунку, ще не підтримуються
Показати валюту
Показувати вибір валюти у екрані нової транзакції
Дозволяти ввод десяткових знаків для валют
Можливість ввести десяткові знаки для деякіх валют (центи, копійки і т.і.)
Узгодити
+
+ Переконайтеся, що файл в UTF-8
+
+ Показати \'Оплата кредитною карткою\'
+ Показувати прапорець для позначки платежів кредитної картки
+ Відкрити калькулятор
+ Відкрити калькулятор для транзакцій, створених із шаблону
+
+ Заплановані операції можуть працювати НЕ так, як очікувалося, коли фінансир установлений на SD-карту. Будь ласка, перемістіть його на память телефону.
+
+ Планувальник
+
+ Завтра
+ Наступний тиждень
+ Це та наступний тиждень
+ Наступний місяць
+ Це та наступний місяць
+ Наступні 3 місяці
+
+ Щось не так з постачальником валютних курсів. Відповідь від сервісу- %s
+ Постачальник курсів валют
+ Вибрати постачальника курсів валют для завантаження
+ OpenExchangeRates App ID
+ Зареєструйте безкоштовний акаунт на OpenExchangeRates і введіть ваш App ID
+ Завантажити всі курси
+ Завантажені курси валют
+
+ Експорт розділень
+
+ Усі %s рахунки
+ Збереження
+ Бюджет з метою заощадити гроші
Вібрація
Вібрація при натисканні кнопок PIN або калькулятора
+ Немає підключення до мережі, був використаний останні завантажені тарифи…
+ Одержувач переказу
+ Показувати поле одержувача під час нового Переказу
Аккаунт для резервування
Вибрати аккаунт Google Диску
+ Потрібен дозвіл
+ для рахунку %s
+ Будь ласка, авторизуйтесь Financier для доступу до Google Drive та спробуйте ще раз…
+ Завантаження файлів з Google Диску…
+ Будь ласка, вкажіть свій обліковий запис Google Диска в Налаштуваннях, потім спробуйте ще раз…
+ Резервне копіювання здійснено на Google Диск: %s
+ Відновлення бази даних з Диску Google…
+ З\'єднання встановлено. Будь ласка, спробуйте останню операцію ще раз…
+ Неможливо підключитися до Google Диска:\n%s
+ Не моливо вибрати обліковий запис Google для використання. Виглядає що ваш пристрій не підтримує сервіси Google Play.
Доступ тільки на читання
Дозволити доступ тільки на читання усіх файлів на Google Диску
+ Завантажити тестовий файл на Диск Google...
Вивантажувати копії бази
Вивантажувати копії бази на Google Диск
Вивантажувати авт. копії
Вивантажувати авт. копії бази на Google Диск
- Постачальник курсів валют
- Вибрати постачальника курсів валют для завантаження
+ Резевне копіювання/Відновлення Онлайн
+ Резервне копіювання Google Диска
+ Відновлення з Диску Google
+ Резервне копіювання Dropbox
+ Відновлення з Dropbox
+ Резервне копіювання бази даних…
-
- - Текст
- - Номер
- - Список
- - Прапорець
-
-
- - Банк
- - Готівка
- - Кредитка
-
-
- - За порядком сортування (зростання)
- - За порядком сортування (спадання)
- - За ім\'ям
- - За останньою транзакцією (зростання)
- - За останньою транзакцією (спадання)
-
-
- - За ім\'ям
- - За частотою
-
-
- - За датою створення
- - За ім\'ям
- - За аккаунтами
-
-
- - За датою початку
- - За ім\'ям
- - За розміром
-
-
- - Від новіших до старіших
- - Від старіших до новіших
-
-
- - 6 місяців тому
- - 3 місяці тому
- - Минулого місяця
- - Цього місяця
- - Наступного місяця
- - Наступні 3 місяці
- - Наступні 6 місяців
-
-
- - 3 місяці
- - 6 місяців
- - 9 місяців
- - 1 рік
-
-
- - Викл.
- - 1 хвилина
- - 3 хвилини
- - 5 хвилин
- - 10 хвилин
- - 15 хвилин
-
-
- - Рахунки
- - Журнал
- - Бюджети
- - Звіти
-
- Випущено під ліцензією GNU GPL v2
- Дізнатися інформацію про проект
- Усі %s аккаунти
+ Financier вимагає кілька дозволів наданих вручну.
+ Надайте дозвіл нижче, а потім поверніться до попереднього екрану і повторіть операцію. Дозволи можна відкликати у системних налаштуваннях -> Дозволи для додатків.
+ Сховище
+ Потрібно для зчитувати та записувати файли резервних копій із/до зовнішнього сховища.
+ Камера
+ Потрібно для робити з зображеннями і додаванням їх до транзакцій.
+ Контакти
+ Потрібно для резервного копіювання в особистий Диск Google.
+ Дозволи надані.
+ Дозвіл не надано
+ SMS
+ Потрібно для додавання нових операцій автоматично по шаблонах SMS.
+ Політика конфіденційності
+
+ Показати меню
+ Показувати кнопку меню на екрані Облікові записи
+
+
+ Номер SMS
+ Фільтрувати за номером або текстом
+ Номер відправника SMS або ім\'я
+ Шаблони SMS
+ Шаблон (?)
+ Заповнювачі: \n{{p}} - ціна\n{{a}} - цифри останнього облікового запису\n{{*}} - будь які символи/слова
+ Вкажіть шаблон із заповнювачами
+ Спробуй приклад SMS тут
+ Шаблони SMS
+ Немає шаблонів SMS
+ Додати шаблон SMS
+ Новий шаблон SMS
+ Сортувати за іменем
+ Шаблон SMS продубльовано
+ Видалити цей шаблон SMS?
+ Нова операція додана SMS з %s
+ Операція SMS з %s
+ Виберіть тип та обліковий запис (опціонально)
+ SMS
+ Статус транзакції
+ Статус транзакції з SMS: %s
+ Збереження тексту SMS
+ Додати текст SMS до нотатки транзакції
+
+ За замовчуванням
+ Mir
+ Тип оплати
Електронний
- Створення резервної копії бази даних…
- Немає дозволу для завантаження на Dropbox. Будь ласка перевірте ваші налаштування.
- Запит дозволу
- для аккаунту %s
- Будь ласка дозвольте Financier доступ до вашого Google Диску та спробуйте ще раз…
- Заплановані транзакції можуть працювати не так як очікується якщо Financier встановлений на карту пам\'яті. Будь ласка перенесіть додаток до внутрішньої пам\'яті телефону.
- Будь ласка зареєструйте безкоштовний аккаунт в сервісі OpenExchangeRates та введіть ваш App ID
- Яндекс.Деньги
- Коментар містить текст
- Містить %1$s
- Закрити рахунок?
- Немає одержувачів
- Завантаження обмінного курсу для %s…
- Увімкнути синхронізацію з Google Диском
- Завантажувати зображення
- Папка на Google Диску
- Помилка при підключенні до Dropbox
- Завантаження файлів з Dropbox…
- Автоматично встановлювати фокус у поле введення суми для нових транзакцій
- Встановлювати фокус в поле суми
+ Видалити обліковий запис
+
+ Змінити налаштування програми
+ Зміна категорій, платежів, проектів, місцезнаходжень, тощо
+ Розклад транзакцій та переказів
+ Резервне копіювання бази даних на локальне сховище
+ Відновлення бази даних з локального сховища
+ Резервне копіювання бази даних на Диск Google
+ Відновлення бази даних з Диску Google
+ Зберегти базу даних в Dropbox
+ Відновити базу даних з Dropbox
+ Надсилати резервну копію бази даних на електронну пошту і т. д
+ Імпорт/експорт бази даних в інший формат на csv, qif, тощо
+ Застосувати операції для кількох транзакцій
+ Переглянути місячне планування
+ Виправити внутрішні проблеми, якщо необхідно
+ Зробити добровільну пожертву для підтримки проекту
+ Отримати більш детальну інформацію про проект
+
+ Будь ласка, не забудьте PIN. Немає способу відновити вашу інформацію або вимкнути захист, якщо ви втратите або забудете PIN.
+
+ Нагадувати про резервне копіювання
+ Нагадувати, якщо авто резервуваня невідбулось протягом декількох днів.
+ Сповіщати про проблеми
+ Сповіщати, якщо авто резервне копіювання не вдалося під час останнього виконання.
+ Ви повинні розглянути можливість увімкнення автотоматичного резервування до Google Drive або Dropbox, щоб зберегти ваші дані. Відкрийте меню -> Налаштування -> резервне копіювання.
+ %s (Натисніть, щоб відхилити це повідомлення)
+ Помилка автоматичоно резервування при %1$s з помилкою [%2$s].
+
+ Дозвіл на запис до зовнішнього накопичувача не надано
+ Дозволи
+ Переглянути права доступу, які потрібно надати вручну
+
+ Сканер відбитків
+ Використовувати відбиток пальця для розблокування додатку
+ Резервне копіювання до PIN-коду
+ Дозволити використовувати PIN-код для розблокування програми, навіть якщо ввімкнено відбиток пальця.
+ Для продовження, підтвердіть відбиток пальця
+ Торкніться сенсора
+ Відбиток розпізнано
+ Відбиток пальця не розпізнано. Повторіть спробу
+ Помилка!
+ Сенсор відбитків пальців не виявлено
+ Потрібно ввести як мінімум один відбиток пальця
+ Цей пристрій не підтримується.
+ Не доступно: %s
+
+ Камера
+ Зображення
+ Використовувати PIN
+ Встановити фокус на полі Сума
+ Автоматично фокусуватися на полі суми для нових транзакцій
+ Неактивний
+
+ Виберіть об\'єкт
+ Вибір категорії
+ Вибір одержувача
+ Вибір місцезнаходження
+ Вибір проєкту
+ Показати список або фільтр
+
+ Не вдалося знайти %1$s з заголовком \"%2$s\"? Створити новий, якщо відсутній?
+ Не вдалося знайти наявну категорію з заголовком \"%s\"? Будь ласка, створіть нову, використовуючи кнопку + на селекторі категорій.
+ Показати все
+ Тип шаблону…
+
+
+ - Показати фільтри
+ - Показати список
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 04cfe06f..6b7514c1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
-
+
Accounts
Blotter
Currencies
@@ -168,10 +168,10 @@
Today
Yesterday
- This week
- This month
- Last week
- Last month
+ Current week
+ Current month
+ Previous week
+ Previous month
Name
Symbol
Code
@@ -814,8 +814,8 @@
Cannot transfer to the same account…
- This and last week
- This and last month
+ Current and previous week
+ Current and previous month
Custom
Original Amount
@@ -963,8 +963,8 @@
Notify about failures
Notify if autobackup failed during the last execution.
You should consider enabling autobackup to Google Drive or Dropbox to keep your data safe. Go to Menu -> Preferences -> Backup.
- %s%n(Tap to dismiss this message)
- Autobackup failed at %s with error [%s].
+ %s (Tap to dismiss this message)
+ Autobackup failed at %1$s with error [%2$s].
Write external storage permisson not granted
Permissions
@@ -998,7 +998,7 @@
Project selector
Show list or filter on tap
- Not able to find %s with title \"%s\"? Create a new one if missing?
+ Not able to find %1$s with title \"%2$s\"? Create a new one if missing?
Not able to find existing Category with title \"%s\"? Please create a new one using the + button on the category selector.
List all
Type template…
diff --git a/build.gradle b/build.gradle
index fe89ce1c..f02a34ef 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,25 +1,27 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.4.21'
+ ext.kotlin_version = '1.5.21'
repositories {
google()
jcenter()
+ mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.1.2'
+ classpath 'com.android.tools.build:gradle:4.2.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
ext {
- lifecycle_version = "2.2.0"
+ lifecycle_version = "2.3.1"
}
}
allprojects {
repositories {
- jcenter()
google()
+ jcenter()
+ mavenCentral()
}
}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f3633248..102b2a13 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip