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