From c365269be56886a65051bd8dfcbbda050732ac27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20FERREIRA=20DE=20SOUSA?= Date: Mon, 7 Sep 2020 18:34:16 +0200 Subject: [PATCH 01/76] Add French translation --- app/src/main/res/values-fr/strings.xml | 133 +++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 app/src/main/res/values-fr/strings.xml diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000..51eb90d --- /dev/null +++ b/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,133 @@ + + + + Money Tracker + Intitulé + Catégorie + Montant + Ajouter revenu + Ajouter dépense + Ajout + Rapport + RÉGLAGE DE LA PÉRIODE + TOTAL + Total revenus + Total dépenses + Supprimer + Jour + Semaine + Mois + Année + Éternité + Aimez-vous MoneyTracker ? + Évaluez-le sur Google Play ! + Peut-être plus tard + Non, merci + Oui ! + + Opérations + Comptes + Ajout d\'un revenu + Ajout d\'une dépense + Ajout d\'un compte + + Exporter + Ajouter compte + Solde initial + Compte + Virement + Depuis + Vers + Taux de conversion + Ajouter un taux + Compte supprimé + + Synthèse + Personnalisé + Synthèse + Devise + Erreur ! Conversion à définir. + Montant + Paramètres + Paramètres + Compte par défaut + Devise d\'affichage + Devise se substituant à NON + + Résultats + Revenus + Dépenses + + Précision d\'affichage + + Importer/Exporter + Importer + %1$s opérations ont été importées + Aide + Pour importer des opérations dans l\'application :\n + 1. Créer un fichier CSV au format \n + date;titre;catégorie;montant;devise.\n + 2. Copier son contenu dans le champ de saisie.\n + 3. Appuyer sur importer. Au bout de quelques secondes, le nombre d\'opérations importées est affiché.\n + \n + Note : date - horodatage en millisecondes ; devise - code devise à 3 lettres.\n + Exemple : 1466948795712;métro;transport;-20.0;EUR + + Banque achète + Convertir vers + Banque vend + Convertir depuis + + Date + Heure + + Sauvegarde/Restauration + Échec de la sauvegarde. + Échec de la restauration. + Le fichier de sauvegarde %1$s a bien été restauré. + Restauration effectuée + Attention + Êtes-vous sûr de vouloir écraser les données courantes avec celles du fichier %1$s ? Assurez-vous d\'avoir une sauvegarde des données courantes. + Restaurer maintenant + + Éditer le revenu + Éditer la dépense + + Importation en cours… + Sauvegarde en cours… + Restauration en cours… + Recherche des sauvegardes… + Suppression de la sauvegarde… + + Version %1$s (Android %2$s) + À propos + Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn. + + Champ obligatoire. + Impossible d\'être si riche ou pauvre. + Impossible d\'être si riche. + Aucune + Montant trop important. + Montant trop important. + Impossible de convertir vers la même devise. + Opérations dans le futur impossibles. + Au moins un compte est requis. + + Éditer le compte + Couleur + Objectif + Restaurer + Archiver + Le compte par défaut ne peut pas être archivé. + Suppression du compte + Êtes-vous sûr de vouloir supprimer ce compte ? Il ne pourra plus être restauré. + + Graphique + Information + Opérations + + Suppression de la sauvegarde + Êtes-vous sûr de vouloir supprimer le fichier %1$s ? Il ne pourra plus être restauré. + + La date de fin ne peut être antérieure à celle de début + From 709965aa1c21cd913d0a0c24da070bc04ceb9588 Mon Sep 17 00:00:00 2001 From: Yevhenii Kanivets Date: Fri, 11 Sep 2020 17:32:16 +0300 Subject: [PATCH 02/76] VersionCode 24, versionName '2.1.2'. --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b78476b..52008b6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,8 +25,8 @@ android { minSdkVersion 21 targetSdkVersion 29 - versionCode 33 - versionName '2.1.1' + versionCode 34 + versionName '2.1.2' } signingConfigs { releaseConfig { From 0359f4f15e01935937145468bb734e703ad0b371 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Oct 2020 19:12:26 -0300 Subject: [PATCH 03/76] PT-BR Translation --- app/src/main/res/values-pt-rBR/strings.xml | 149 +++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 app/src/main/res/values-pt-rBR/strings.xml diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000..9008578 --- /dev/null +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,149 @@ + + + + Money Tracker + Título + Categoria + Preço + Adicionar receita + Adicionar despesa + Adicionar + Relatório + MUDAR A DATA + TOTAL + Receita total + Despesa total + Deletar + Dia + Semana + Mês + Ano + Tudo + Você gosta do MoneyTracker? + Avalie ele na Google Play! + Talvez depois + Não, obrigado + Sim! + + Registos + Contas + Adicionar receita + Adicionar despesa + Adicionar conta + + Open navigation drawer + Close navigation drawer + + Exportar + Adicionar conta + Saldo inicial + Conta + Transferir + De + Para + Taxas de câmbio + Adicionar taxa de câmbio + " -> " + Conta removida + + Breve resumo + Personalizado + Resumo + Moeda + Erro! Especifique as taxas de câmbio. + Quantidade + Configurações + Configurações + Conta padrão + pref_default_account + pref_default_currency + %1$s - %2$s + pref_non_substitution_currency + Moeda padrão + Moeda não substituível + + Resultados + Receitas + Despesas + + pref_display_precision + Precisão da exibição + 9.99$ = 10$ + 9.99$ = 9$ + 9.99$ = 9.99$ + + Importar/Exportar + Importar + %1$s registros foram importados + Ajuda + Para importar registros no aplicativo:\n + 1. Crie um arquivo no formato CSV - \n + hora;título;categoria;preço;moeda.\n + 2. Copie o seu conteúdo para o campo de texto.\n + 3. Pressione o botão de importar. Em alguns segundos você verá quantos registros foram importados.\n + \n + Nota: hora - o valor deve ser em milissegundos; moeda - código de 3 símbolos da moeda.\n + Exemplo: 1466948795712;metrô;transporte;-20.0;BRL + + / + Banco vende + Converter para + Banco compra + Converte de + + Data + Horário + + Backup/Restaurar + Falha ao criar o backup. + Falha ao restaurar o backup. + O arquivo de backup selecionado %1$s foi restaurado com sucesso. + Backup restaurado + Atenção + Você tem certeza que deseja apagar todos os dados atuais e restaurar o arquivo de backup %1$s? Certifique-se de fazer backup dos dados atuais. + Fazer backup agora + + Editar receita + Editar despesa + + Importando registros… + Fazendo backup… + Restaurando backup… + Buscando backups… + Removendo backup… + + pref_about + Versão %1$s (Android %2$s) + Sobre + Open Money Tracker (OMT) é uma aplicação contábil. Você pode gerenciar suas receitas e despesas de uma forma fácil. Contas e taxas de câmbio também são suportadas.\n\nPara nos ajudar a tornar o OMT melhor, por favor, reporte bugs no fórum 4PDA; novas ideias de funções também são muito bem vindas. Pesquise respostas ou inicie uma discussão nofórum.\n\nO OMT é um software de código aberto, então todo mundo é encorajado a se tornar um contribuidor. Não desenvolvedores também podem ajudar. Por exemplo, você pode ajudar a traduzir o OMT, fornecer capturas de tela ou publicar sobre o OMT.\n\nEste software é disponibilizado sobre a licença GNU-GPL v3 e o seu código fonte está disponível no GitHub.\n\nPerfil do desenvolvedor no LinkedIn. + + Este campo não pode ficar vazio + Você não pode ser tão rico ou tão pobre. + Você não pode ser tão rico. + Nenhum + Isto é muito para ser transferido. + Isto é muito para a troca. + Não é possível converter as moedas. + Não é possível criar um registro no futuro. + Pelo menos uma conta é necessária. + + Editar conta + Cor + Objetivo + Restaurar + Arquivar + Você não pode arquivar a conta padrão. + Deletar conta + Tem certeza que deseja deletar esta conta? Isso não pode ser desfeito. + + Gráfico + Informação + Operações + + + Deletar backup + Tem certeza que deseja deletar esse arquivo de backup %1$s? Isso não pode ser desfeito. + + %1$s (%2$d) + A data final não pode ser anterior a data inicial + From b98741ad36100356cc34b148648772e6dc923f9c Mon Sep 17 00:00:00 2001 From: Yevhenii Kanivets Date: Sat, 3 Oct 2020 22:19:20 +0300 Subject: [PATCH 04/76] #2; Migrate to AndroidX. --- app/build.gradle | 19 ++++++++++------ .../moneytracker/util/CrashlyticsProxy.java | 2 +- app/src/main/AndroidManifest.xml | 4 ++-- .../activity/account/AccountsActivity.java | 2 +- .../activity/account/AddAccountActivity.java | 2 +- .../activity/account/TransferActivity.java | 2 +- .../account/edit/EditAccountActivity.kt | 2 +- .../edit/fragment/EditAccountFragment.kt | 2 +- .../activity/base/BaseActivity.java | 14 ++++++------ .../activity/base/BaseBackActivity.java | 6 ++--- .../activity/base/BaseDrawerActivity.java | 14 ++++++------ .../activity/base/BaseFragment.kt | 2 +- .../activity/charts/ChartsActivity.java | 6 ++--- .../charts/fragment/GraphFragment.java | 6 ++--- .../charts/fragment/SummaryFragment.java | 4 ++-- .../AddExchangeRateActivity.java | 4 ++-- .../exchange_rate/ExchangeRatesActivity.java | 2 +- .../activity/external/BackupActivity.java | 4 ++-- .../external/ImportExportActivity.java | 6 ++--- .../activity/record/AddRecordActivity.kt | 2 +- .../activity/record/MainActivity.kt | 6 ++--- .../adapter/GeneralViewPagerAdapter.kt | 6 ++--- .../adapter/MonthSummaryAdapter.java | 2 +- .../moneytracker/adapter/RecordAdapter.kt | 4 ++-- .../adapter/RecordReportAdapter.kt | 6 ++--- .../controller/CurrencyController.java | 2 +- .../controller/PreferenceController.java | 4 ++-- .../backup/tasks/DropboxBackupAsyncTask.java | 4 ++-- .../DropboxFetchBackupListAsyncTask.java | 2 +- .../tasks/DropboxRemoveBackupAsyncTask.java | 9 +------- .../tasks/DropboxRestoreBackupAsyncTask.java | 4 ++-- .../controller/base/BaseController.java | 6 ++--- .../controller/data/AccountController.java | 6 ++--- .../controller/data/CategoryController.java | 4 ++-- .../data/ExchangeRateController.java | 2 +- .../controller/data/RecordController.java | 6 ++--- .../controller/external/ImportController.java | 4 ++-- .../di/module/ControllerModule.java | 2 +- .../di/module/repo/CachedRepoModule.java | 2 +- .../di/module/repo/RepoModule.java | 2 +- .../moneytracker/entity/ExchangeRatePair.java | 2 +- .../moneytracker/entity/data/Record.java | 4 ++-- .../moneytracker/repo/base/BaseRepo.java | 6 ++--- .../moneytracker/repo/base/IRepo.java | 6 ++--- .../moneytracker/repo/cache/BaseCache.java | 6 ++--- .../moneytracker/repo/data/AccountRepo.java | 4 ++-- .../moneytracker/repo/data/CategoryRepo.java | 6 ++--- .../repo/data/ExchangeRateRepo.java | 6 ++--- .../moneytracker/repo/data/RecordRepo.java | 4 ++-- .../moneytracker/repo/data/TransferRepo.java | 6 ++--- .../report/ExchangeRateProvider.java | 6 ++--- .../moneytracker/report/ReportMaker.java | 6 ++--- .../report/account/AccountsReport.java | 2 +- .../report/account/IAccountsReport.java | 2 +- .../report/base/IExchangeRateProvider.java | 4 ++-- .../report/chart/BarChartConverter.java | 2 +- .../report/chart/IMonthReport.java | 2 +- .../report/chart/MonthReport.java | 2 +- .../report/record/IRecordReport.java | 4 ++-- .../report/record/RecordReport.java | 4 ++-- .../report/record/model/CategoryRecord.java | 4 ++-- .../moneytracker/ui/AddRecordUiDecorator.java | 8 +++---- .../moneytracker/ui/PeriodSpinner.java | 2 +- .../presenter/AccountsSummaryPresenter.java | 2 +- .../ui/presenter/ShortSummaryPresenter.java | 4 ++-- .../util/CategoryAutoCompleter.java | 4 ++-- .../util/ExchangeRatesSummarizer.java | 2 +- .../util/validator/AccountValidator.java | 6 ++--- .../util/validator/ClearErrorTextWatcher.java | 4 ++-- .../util/validator/EditAccountValidator.java | 4 ++-- .../validator/ExchangeRatePairValidator.java | 6 ++--- .../util/validator/RecordValidator.java | 6 ++--- .../util/validator/TransferValidator.java | 6 ++--- app/src/main/res/layout/activity_about.xml | 14 ++++++------ app/src/main/res/layout/activity_accounts.xml | 10 ++++----- .../main/res/layout/activity_add_account.xml | 10 ++++----- .../res/layout/activity_add_exchange_rate.xml | 22 +++++++++---------- .../main/res/layout/activity_add_record.xml | 12 +++++----- app/src/main/res/layout/activity_backup.xml | 10 ++++----- app/src/main/res/layout/activity_charts.xml | 14 ++++++------ .../main/res/layout/activity_edit_account.xml | 16 +++++++------- .../res/layout/activity_exchange_rates.xml | 10 ++++----- .../res/layout/activity_import_export.xml | 10 ++++----- app/src/main/res/layout/activity_main.xml | 18 +++++++-------- app/src/main/res/layout/activity_report.xml | 18 +++++++-------- app/src/main/res/layout/activity_settings.xml | 10 ++++----- app/src/main/res/layout/activity_transfer.xml | 10 ++++----- .../main/res/layout/content_add_account.xml | 12 +++++----- .../main/res/layout/content_add_record.xml | 14 ++++++------ app/src/main/res/layout/content_main.xml | 4 ++-- app/src/main/res/layout/content_transfer.xml | 12 +++++----- .../layout/fragment_account_operations.xml | 4 ++-- .../main/res/layout/fragment_edit_account.xml | 10 ++++----- .../main/res/layout/view_summary_accounts.xml | 4 ++-- .../main/res/layout/view_summary_records.xml | 6 ++--- .../moneytracker/util/CrashlyticsProxy.java | 2 +- .../controller/PeriodControllerTest.java | 2 +- .../data/AccountControllerTest.java | 4 ++-- .../data/CategoryControllerTest.java | 6 ++--- .../controller/data/RecordControllerTest.java | 6 ++--- .../data/TransferControllerTest.java | 6 ++--- .../report/ExchangeRateProviderTest.java | 6 ++--- .../moneytracker/report/ReportTest.java | 6 ++--- gradle.properties | 4 +++- 104 files changed, 311 insertions(+), 311 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 52008b6..5901efd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,6 +69,11 @@ android { } productFlavors { } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } apply plugin: 'com.getkeepsafe.dexcount' @@ -80,15 +85,15 @@ dependencies { transitive = true } - compile 'com.android.support:support-v4:27.1.1' - compile 'com.android.support:appcompat-v7:27.1.1' - compile 'com.android.support:design:27.1.1' - compile 'com.jakewharton:butterknife:8.5.1' // View annotation bindings - annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' // ButterKnife compiler + compile 'androidx.legacy:legacy-support-v4:1.0.0' + compile 'androidx.appcompat:appcompat:1.0.0' + compile 'com.google.android.material:material:1.0.0' + compile 'com.jakewharton:butterknife:10.2.3' // View annotation bindings + annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' // ButterKnife compiler compile 'com.google.dagger:dagger:2.11' // Dependency injection tool compile 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts compile 'com.jakewharton.timber:timber:4.1.2' // Advanced logging tool - compile 'com.android.support.constraint:constraint-layout:1.1.3' + compile 'androidx.constraintlayout:constraintlayout:1.1.3' compile 'com.dropbox.core:dropbox-core-sdk:3.0.5' // Dropbox Core API testCompile 'junit:junit:4.12' @@ -99,5 +104,5 @@ dependencies { annotationProcessor 'com.google.dagger:dagger-compiler:2.11' provided 'org.glassfish:javax.annotation:10.0-b28' compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.android.support:cardview-v7:27.1.1' + implementation 'androidx.cardview:cardview:1.0.0' } diff --git a/app/src/free/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java b/app/src/free/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java index df51466..ec7085b 100644 --- a/app/src/free/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java +++ b/app/src/free/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.util; import android.content.Context; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; /** diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26d811e..50d8f7d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ android:value="955ae4864ae2a833aeda5b62631512524288adf8" /> @@ -122,4 +122,4 @@ - \ No newline at end of file + diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java index aa8c50f..bc1b08c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.activity.account; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.ListView; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java index 706be80..e30836b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.activity.account; -import android.support.v7.widget.AppCompatSpinner; +import androidx.appcompat.widget.AppCompatSpinner; import android.view.Menu; import android.view.MenuItem; import android.view.View; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java index 8ccf29e..9ee11f9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.activity.account; -import android.support.v7.widget.AppCompatSpinner; +import androidx.appcompat.widget.AppCompatSpinner; import android.view.Menu; import android.view.MenuItem; import android.view.View; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/EditAccountActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/EditAccountActivity.kt index d3cd883..7168d97 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/EditAccountActivity.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/EditAccountActivity.kt @@ -4,7 +4,7 @@ import android.app.Activity import android.app.AlertDialog import android.content.Context import android.content.Intent -import android.support.v4.view.ViewPager.OnPageChangeListener +import androidx.viewpager.widget.ViewPager.OnPageChangeListener import android.view.Menu import android.view.MenuItem import android.view.View diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt index f61a226..2ee6289 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt @@ -2,7 +2,7 @@ package com.blogspot.e_kanivets.moneytracker.activity.account.edit.fragment import android.app.Activity import android.os.Bundle -import android.support.design.widget.FloatingActionButton +import com.google.android.material.floatingactionbutton.FloatingActionButton import android.view.View import com.blogspot.e_kanivets.moneytracker.R import com.blogspot.e_kanivets.moneytracker.R.layout diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java index 208e505..e48d7cb 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java @@ -2,12 +2,12 @@ import android.app.ProgressDialog; import android.os.Bundle; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.annotation.LayoutRes; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.widget.Toast; import com.blogspot.e_kanivets.moneytracker.MtApp; @@ -16,7 +16,7 @@ import butterknife.ButterKnife; /** - * Base implementation of {@link android.support.v7.app.AppCompatActivity} to describe some common + * Base implementation of {@link androidx.appcompat.app.AppCompatActivity} to describe some common * methods. * Created on 1/26/16. * diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseBackActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseBackActivity.java index 6d57430..b47246c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseBackActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseBackActivity.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.activity.base; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.view.MenuItem; import com.blogspot.e_kanivets.moneytracker.R; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java index a9a5f36..a0137c5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java @@ -1,12 +1,12 @@ package com.blogspot.e_kanivets.moneytracker.activity.base; import android.content.Intent; -import android.support.annotation.NonNull; -import android.support.design.widget.NavigationView; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.Toolbar; +import androidx.annotation.NonNull; +import com.google.android.material.navigation.NavigationView; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.widget.Toolbar; import android.view.MenuItem; import com.blogspot.e_kanivets.moneytracker.R; @@ -21,7 +21,7 @@ import butterknife.BindView; /** - * Base implementation of {@link android.support.v7.app.AppCompatActivity} to encapsulate Navigation + * Base implementation of {@link androidx.appcompat.app.AppCompatActivity} to encapsulate Navigation * Drawer logic. * Created on 3/16/16. * diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseFragment.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseFragment.kt index d3d5a73..269baee 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseFragment.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseFragment.kt @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.activity.base import android.os.Bundle -import android.support.v4.app.Fragment +import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java index 16b6136..f05c109 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.activity.charts; -import android.support.design.widget.TabLayout; -import android.support.v4.app.Fragment; -import android.support.v4.view.ViewPager; +import com.google.android.material.tabs.TabLayout; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java index f9222ec..0a50836 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java @@ -1,9 +1,9 @@ package com.blogspot.e_kanivets.moneytracker.activity.charts.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java index d71f919..425806f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.activity.charts.fragment; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java index bad88bc..3342274 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.activity.exchange_rate; -import android.support.annotation.Nullable; -import android.support.v7.widget.AppCompatSpinner; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatSpinner; import android.view.Menu; import android.view.MenuItem; import android.view.View; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java index d0a4ba3..addb503 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.activity.exchange_rate; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java index 3c5c29d..2a377da 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.activity.external; import android.content.DialogInterface; -import android.support.annotation.NonNull; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import android.view.View; import android.widget.ListView; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java index fb2f979..dc9ad47 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java @@ -3,9 +3,9 @@ import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.v4.content.FileProvider; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.core.content.FileProvider; +import androidx.appcompat.app.AlertDialog; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.kt index 39b87f4..546ebd8 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.kt @@ -5,7 +5,7 @@ import android.app.Activity import android.app.DatePickerDialog import android.app.TimePickerDialog import android.content.res.ColorStateList -import android.support.v4.content.ContextCompat +import androidx.core.content.ContextCompat import android.text.InputFilter import android.text.Spanned import android.text.format.DateFormat diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.kt index 242dbd2..2c605d3 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.kt @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.activity.record import android.content.Intent -import android.support.v7.app.AppCompatActivity -import android.support.v7.widget.RecyclerView +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.RecyclerView import android.widget.TextView import com.blogspot.e_kanivets.moneytracker.R import com.blogspot.e_kanivets.moneytracker.activity.ReportActivity @@ -196,4 +196,4 @@ class MainActivity : BaseDrawerActivity() { private const val REQUEST_ACTION_RECORD = 6 } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/GeneralViewPagerAdapter.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/GeneralViewPagerAdapter.kt index 68325c7..d128a34 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/GeneralViewPagerAdapter.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/GeneralViewPagerAdapter.kt @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.adapter -import android.support.v4.app.Fragment -import android.support.v4.app.FragmentManager -import android.support.v4.app.FragmentPagerAdapter +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter import java.util.ArrayList class GeneralViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java index 5a6f740..81afb5c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java @@ -2,7 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.kt index 86781ae..5d107fd 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordAdapter.kt @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.adapter import android.content.Context -import android.support.v4.content.ContextCompat -import android.support.v7.widget.RecyclerView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt index cc3f034..c3bec57 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/RecordReportAdapter.kt @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.adapter import android.content.Context -import android.support.v4.content.ContextCompat -import android.support.v7.widget.RecyclerView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -143,4 +143,4 @@ class RecordReportAdapter( private const val TYPE_CHILD = 2 } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java index 706d2e8..ec74ae4 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java index 16d9d14..4458c6a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java @@ -3,8 +3,8 @@ import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.R; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxBackupAsyncTask.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxBackupAsyncTask.java index 9174807..895961f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxBackupAsyncTask.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxBackupAsyncTask.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.controller.backup.tasks; import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxFetchBackupListAsyncTask.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxFetchBackupListAsyncTask.java index 1d35451..40ff182 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxFetchBackupListAsyncTask.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxFetchBackupListAsyncTask.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.backup.tasks; import android.os.AsyncTask; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRemoveBackupAsyncTask.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRemoveBackupAsyncTask.java index db42e7a..6bbe7e0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRemoveBackupAsyncTask.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRemoveBackupAsyncTask.java @@ -1,18 +1,11 @@ package com.blogspot.e_kanivets.moneytracker.controller.backup.tasks; import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; -import com.dropbox.core.v2.files.DeleteResult; -import com.dropbox.core.v2.files.FileMetadata; import com.dropbox.core.v2.files.Metadata; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; public class DropboxRemoveBackupAsyncTask extends AsyncTask { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRestoreBackupAsyncTask.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRestoreBackupAsyncTask.java index c0c5f3b..87048fd 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRestoreBackupAsyncTask.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/backup/tasks/DropboxRestoreBackupAsyncTask.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.controller.backup.tasks; import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.dropbox.core.DbxException; import com.dropbox.core.v2.DbxClientV2; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/base/BaseController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/base/BaseController.java index fde34f4..a8b4c8b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/base/BaseController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/base/BaseController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.base; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; @@ -55,4 +55,4 @@ public List readAll() { public List readWithCondition(String condition, String[] args) { return repo.readWithCondition(condition, args); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountController.java index e633460..f1f398b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.controller.base.BaseController; @@ -207,4 +207,4 @@ private Account substituteCurrency(Account account) { account.getDecimals(), account.getGoal(), account.isArchived(), account.getColor()); } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java index dd8bbca..1173cd5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/ExchangeRateController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/ExchangeRateController.java index 9154915..ab61e21 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/ExchangeRateController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/ExchangeRateController.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.base.BaseController; import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java index c15d524..47cd596 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -145,4 +145,4 @@ private Record validateRecord(@NonNull Record record) { return new Record(record.getId(), record.getTime(), record.getType(), record.getTitle(), category, record.getPrice(), record.getAccount(), record.getCurrency(), record.getDecimals()); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java index d21bb0d..132a843 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.external; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java index 05297ff..4229889 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.di.module; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.controller.backup.BackupController; import com.blogspot.e_kanivets.moneytracker.controller.external.ExportController; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java index 76d7bec..d17a3e5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.di.module.repo; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java index a6da065..34bf86c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.di.module.repo; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/ExchangeRatePair.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/ExchangeRatePair.java index 302e91c..9c868c0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/ExchangeRatePair.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/ExchangeRatePair.java @@ -2,7 +2,7 @@ import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java index 47e8d09..02506a0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java @@ -2,7 +2,7 @@ import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; import com.blogspot.e_kanivets.moneytracker.entity.base.BaseEntity; @@ -215,4 +215,4 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(currency); dest.writeLong(decimals); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/BaseRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/BaseRepo.java index 349d407..d68f7ab 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/BaseRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/BaseRepo.java @@ -3,8 +3,8 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; import com.blogspot.e_kanivets.moneytracker.entity.base.IEntity; @@ -116,4 +116,4 @@ public List readWithCondition(@Nullable String condition, @Nullable String[] return recordList; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/IRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/IRepo.java index 18e2740..dbb2b4b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/IRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/base/IRepo.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.repo.base; import android.database.sqlite.SQLiteOpenHelper; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.List; @@ -66,4 +66,4 @@ public interface IRepo { */ @NonNull List readWithCondition(@Nullable String condition, @Nullable String[] args); -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java index be0a879..af12c77 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.repo.cache; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.util.LruCache; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.collection.LruCache; import com.blogspot.e_kanivets.moneytracker.entity.base.IEntity; import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/AccountRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/AccountRepo.java index d657525..803c79e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/AccountRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/AccountRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/CategoryRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/CategoryRepo.java index 5a9d479..db47baa 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/CategoryRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/CategoryRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -66,4 +66,4 @@ protected List getListFromCursor(@Nullable Cursor cursor) { return categoryList; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/ExchangeRateRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/ExchangeRateRepo.java index 233ab2b..94c9de6 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/ExchangeRateRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/ExchangeRateRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -75,4 +75,4 @@ protected List getListFromCursor(@Nullable Cursor cursor) { return exchangeRateList; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java index d462d2b..60de34f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Record; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/TransferRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/TransferRepo.java index bd96329..e189f77 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/TransferRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/TransferRepo.java @@ -2,8 +2,8 @@ import android.content.ContentValues; import android.database.Cursor; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Transfer; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; @@ -84,4 +84,4 @@ protected List getListFromCursor(@Nullable Cursor cursor) { return accountList; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProvider.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProvider.java index a1bda5d..4df278c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProvider.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProvider.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.report; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; @@ -78,4 +78,4 @@ public int compare(ExchangeRate lhs, ExchangeRate rhs) { return rateMap; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ReportMaker.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ReportMaker.java index 261cacf..14ec88f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ReportMaker.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/ReportMaker.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.report; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; @@ -91,4 +91,4 @@ public List currencyNeededAccounts(String currency, List accoun return new ArrayList<>(currencies); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/AccountsReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/AccountsReport.java index 626cbbc..bd5410b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/AccountsReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/AccountsReport.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.account; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/IAccountsReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/IAccountsReport.java index e046e61..c1b7b5a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/IAccountsReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/account/IAccountsReport.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.account; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; /** * Interface that represents a contract of access to accounts report data. diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/base/IExchangeRateProvider.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/base/IExchangeRateProvider.java index 7183c9a..a174c15 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/base/IExchangeRateProvider.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/base/IExchangeRateProvider.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.base; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; @@ -30,4 +30,4 @@ public interface IExchangeRateProvider { */ @Nullable ExchangeRate getRate(@Nullable Account account); -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/BarChartConverter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/BarChartConverter.java index 8855acb..1052553 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/BarChartConverter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/BarChartConverter.java @@ -2,7 +2,7 @@ import android.annotation.SuppressLint; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.R; import com.github.mikephil.charting.data.BarDataSet; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java index e083604..a97ea40 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.report.chart; import android.os.Parcelable; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import java.util.List; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java index af15e03..31b31cd 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java @@ -2,7 +2,7 @@ import android.os.Parcel; import android.os.Parcelable; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; import com.blogspot.e_kanivets.moneytracker.entity.data.Record; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/IRecordReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/IRecordReport.java index 90d8e72..3a17591 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/IRecordReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/IRecordReport.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.record; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.Period; import com.blogspot.e_kanivets.moneytracker.report.record.model.CategoryRecord; @@ -43,4 +43,4 @@ public interface IRecordReport { * @return summary list */ @NonNull List getSummary(); -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java index 1e7dc8a..60366e9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.record; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; import com.blogspot.e_kanivets.moneytracker.entity.Period; @@ -211,4 +211,4 @@ private int compareDoubles(double lhs, double rhs) { else if (lhs < 0 && rhs > 0) return 1; else return -1 * Double.compare(Math.abs(lhs), Math.abs(rhs)); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/model/CategoryRecord.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/model/CategoryRecord.java index 3563c06..c92258b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/model/CategoryRecord.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/model/CategoryRecord.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.report.record.model; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.List; @@ -54,4 +54,4 @@ public boolean equals(Object o) { && this.summaryRecordList.equals(categoryRecord.getSummaryRecordList()); } else return false; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AddRecordUiDecorator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AddRecordUiDecorator.java index 5a855f0..3d19ee4 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AddRecordUiDecorator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/AddRecordUiDecorator.java @@ -4,10 +4,10 @@ import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.StyleRes; -import android.support.v7.app.ActionBar; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StyleRes; +import androidx.appcompat.app.ActionBar; import android.view.Window; import android.view.WindowManager; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/PeriodSpinner.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/PeriodSpinner.java index 2f276bc..857ee5d 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/PeriodSpinner.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/PeriodSpinner.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.ui; import android.content.Context; -import android.support.v7.widget.AppCompatSpinner; +import androidx.appcompat.widget.AppCompatSpinner; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/AccountsSummaryPresenter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/AccountsSummaryPresenter.java index bdb2fc5..d914cef 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/AccountsSummaryPresenter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/AccountsSummaryPresenter.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.ui.presenter; import android.content.Context; -import android.support.v7.widget.AppCompatSpinner; +import androidx.appcompat.widget.AppCompatSpinner; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/ShortSummaryPresenter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/ShortSummaryPresenter.java index 19229bb..9a6a539 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/ShortSummaryPresenter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/ui/presenter/ShortSummaryPresenter.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.ui.presenter; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -129,4 +129,4 @@ public void onClick(View v) { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java index b2cfb0c..b83b71f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.util; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.controller.data.CategoryController; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/ExchangeRatesSummarizer.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/ExchangeRatesSummarizer.java index f26be96..6b365b5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/ExchangeRatesSummarizer.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/ExchangeRatesSummarizer.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.util; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/AccountValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/AccountValidator.java index e05d6d1..6d39cc9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/AccountValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/AccountValidator.java @@ -1,9 +1,9 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatSpinner; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; +import androidx.appcompat.widget.AppCompatSpinner; import android.view.View; import android.widget.EditText; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ClearErrorTextWatcher.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ClearErrorTextWatcher.java index eb0c3f7..cb32af9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ClearErrorTextWatcher.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ClearErrorTextWatcher.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; import android.text.Editable; import android.text.TextWatcher; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/EditAccountValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/EditAccountValidator.java index fc2596a..1dc325d 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/EditAccountValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/EditAccountValidator.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; import android.view.View; import android.widget.EditText; import butterknife.BindView; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ExchangeRatePairValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ExchangeRatePairValidator.java index d9db7dc..9bd1617 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ExchangeRatePairValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/ExchangeRatePairValidator.java @@ -1,9 +1,9 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatSpinner; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; +import androidx.appcompat.widget.AppCompatSpinner; import android.view.View; import android.widget.EditText; import android.widget.Toast; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/RecordValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/RecordValidator.java index 8d9fd94..7afbc7a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/RecordValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/RecordValidator.java @@ -1,9 +1,9 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatSpinner; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; +import androidx.appcompat.widget.AppCompatSpinner; import android.view.View; import android.widget.EditText; import android.widget.Toast; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/TransferValidator.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/TransferValidator.java index ea01edf..0dbe89d 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/TransferValidator.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/validator/TransferValidator.java @@ -1,9 +1,9 @@ package com.blogspot.e_kanivets.moneytracker.util.validator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatSpinner; +import androidx.annotation.NonNull; +import com.google.android.material.textfield.TextInputLayout; +import androidx.appcompat.widget.AppCompatSpinner; import android.view.View; import android.widget.EditText; import android.widget.Toast; diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 0984b68..82a10e9 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -1,5 +1,5 @@ - - - - + - @@ -39,6 +39,6 @@ android:textColor="@color/text_black" android:textSize="18sp" /> - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_accounts.xml b/app/src/main/res/layout/activity_accounts.xml index f8e85d6..0bcafff 100644 --- a/app/src/main/res/layout/activity_accounts.xml +++ b/app/src/main/res/layout/activity_accounts.xml @@ -1,5 +1,5 @@ - - - - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_add_account.xml b/app/src/main/res/layout/activity_add_account.xml index df33c7c..a175e22 100644 --- a/app/src/main/res/layout/activity_add_account.xml +++ b/app/src/main/res/layout/activity_add_account.xml @@ -1,25 +1,25 @@ - - - - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_add_exchange_rate.xml b/app/src/main/res/layout/activity_add_exchange_rate.xml index 5011497..3a1729c 100644 --- a/app/src/main/res/layout/activity_add_exchange_rate.xml +++ b/app/src/main/res/layout/activity_add_exchange_rate.xml @@ -1,24 +1,24 @@ - - - - + - - @@ -64,7 +64,7 @@ android:maxLines="1" android:nextFocusDown="@+id/et_sell" android:singleLine="true" /> - + - - @@ -101,8 +101,8 @@ android:inputType="numberDecimal" android:maxLines="1" android:singleLine="true" /> - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_add_record.xml b/app/src/main/res/layout/activity_add_record.xml index 4833356..13b1560 100644 --- a/app/src/main/res/layout/activity_add_record.xml +++ b/app/src/main/res/layout/activity_add_record.xml @@ -1,5 +1,5 @@ - - - - + - - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_backup.xml b/app/src/main/res/layout/activity_backup.xml index a43c2fa..79b563d 100644 --- a/app/src/main/res/layout/activity_backup.xml +++ b/app/src/main/res/layout/activity_backup.xml @@ -1,5 +1,5 @@ - - - - + - + diff --git a/app/src/main/res/layout/activity_charts.xml b/app/src/main/res/layout/activity_charts.xml index ca2b2a2..158a5d1 100644 --- a/app/src/main/res/layout/activity_charts.xml +++ b/app/src/main/res/layout/activity_charts.xml @@ -1,24 +1,24 @@ - - - - - + - - + diff --git a/app/src/main/res/layout/activity_edit_account.xml b/app/src/main/res/layout/activity_edit_account.xml index 4a73f71..b1d2f64 100644 --- a/app/src/main/res/layout/activity_edit_account.xml +++ b/app/src/main/res/layout/activity_edit_account.xml @@ -1,6 +1,6 @@ - - - - - + - - - + diff --git a/app/src/main/res/layout/activity_exchange_rates.xml b/app/src/main/res/layout/activity_exchange_rates.xml index 01c1be3..0485a86 100644 --- a/app/src/main/res/layout/activity_exchange_rates.xml +++ b/app/src/main/res/layout/activity_exchange_rates.xml @@ -1,5 +1,5 @@ - - - - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_import_export.xml b/app/src/main/res/layout/activity_import_export.xml index f7ab14c..58888e6 100644 --- a/app/src/main/res/layout/activity_import_export.xml +++ b/app/src/main/res/layout/activity_import_export.xml @@ -1,5 +1,5 @@ - - - - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2b678d1..1a4a062 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,4 +1,4 @@ - - - - - + - + - + - - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_report.xml b/app/src/main/res/layout/activity_report.xml index faefa37..920b7dd 100644 --- a/app/src/main/res/layout/activity_report.xml +++ b/app/src/main/res/layout/activity_report.xml @@ -1,24 +1,24 @@ - - - - - + - + - + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index b697daa..648cf9e 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -1,5 +1,5 @@ - - - - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_transfer.xml b/app/src/main/res/layout/activity_transfer.xml index 1956c55..b0f787d 100644 --- a/app/src/main/res/layout/activity_transfer.xml +++ b/app/src/main/res/layout/activity_transfer.xml @@ -1,5 +1,5 @@ - - - - + - + diff --git a/app/src/main/res/layout/content_add_account.xml b/app/src/main/res/layout/content_add_account.xml index 52c5e30..c12bd5b 100644 --- a/app/src/main/res/layout/content_add_account.xml +++ b/app/src/main/res/layout/content_add_account.xml @@ -10,7 +10,7 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_add_account"> - @@ -24,9 +24,9 @@ android:maxLines="1" android:singleLine="true" /> - + - @@ -40,7 +40,7 @@ android:maxLines="1" android:singleLine="true" /> - + - - \ No newline at end of file + diff --git a/app/src/main/res/layout/content_add_record.xml b/app/src/main/res/layout/content_add_record.xml index df4e7db..b6923ed 100644 --- a/app/src/main/res/layout/content_add_record.xml +++ b/app/src/main/res/layout/content_add_record.xml @@ -71,7 +71,7 @@ android:text="@string/account" android:theme="@style/Text_Hint" /> - - @@ -94,9 +94,9 @@ android:inputType="numberDecimal" android:maxLines="1" android:singleLine="true" /> - + - @@ -108,9 +108,9 @@ android:hint="@string/title" android:maxLines="1" android:singleLine="true" /> - + - @@ -123,6 +123,6 @@ android:hint="@string/category" android:maxLines="1" android:singleLine="true" /> - + diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index 337223d..278e3be 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -7,7 +7,7 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_main"> - + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> - - @@ -46,7 +46,7 @@ android:maxLines="1" android:nextFocusDown="@+id/et_to_amount" android:singleLine="true" /> - + - - @@ -83,7 +83,7 @@ android:inputType="numberDecimal" android:maxLines="1" android:singleLine="true" /> - + diff --git a/app/src/main/res/layout/fragment_account_operations.xml b/app/src/main/res/layout/fragment_account_operations.xml index f56a485..0c62b24 100644 --- a/app/src/main/res/layout/fragment_account_operations.xml +++ b/app/src/main/res/layout/fragment_account_operations.xml @@ -4,10 +4,10 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> diff --git a/app/src/main/res/layout/fragment_edit_account.xml b/app/src/main/res/layout/fragment_edit_account.xml index b45d7ce..a8e6511 100644 --- a/app/src/main/res/layout/fragment_edit_account.xml +++ b/app/src/main/res/layout/fragment_edit_account.xml @@ -9,7 +9,7 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior" > - - + - - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/view_summary_accounts.xml b/app/src/main/res/layout/view_summary_accounts.xml index 6216df9..feb7eeb 100644 --- a/app/src/main/res/layout/view_summary_accounts.xml +++ b/app/src/main/res/layout/view_summary_accounts.xml @@ -26,7 +26,7 @@ android:layout_weight="1" android:text="@string/currency" /> - @@ -68,4 +68,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/view_summary_records.xml b/app/src/main/res/layout/view_summary_records.xml index 6bca902..0444dfc 100644 --- a/app/src/main/res/layout/view_summary_records.xml +++ b/app/src/main/res/layout/view_summary_records.xml @@ -9,7 +9,7 @@ android:paddingEnd="@dimen/half_margin" android:paddingBottom="@dimen/quarter_margin"> - - - \ No newline at end of file + + diff --git a/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java b/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java index 46b35ad..dd87ec2 100644 --- a/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java +++ b/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.util; import android.content.Context; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.crashlytics.android.Crashlytics; import com.crashlytics.android.answers.Answers; diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/PeriodControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/PeriodControllerTest.java index 9c050b7..d0b73e1 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/PeriodControllerTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/PeriodControllerTest.java @@ -1,6 +1,6 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.blogspot.e_kanivets.moneytracker.entity.Period; diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountControllerTest.java index 7e8d9af..f37a310 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountControllerTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/AccountControllerTest.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java index c961f01..46150ee 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; @@ -130,4 +130,4 @@ public List readWithCondition(@Nullable String condition, @Nullable St return new ArrayList<>(); } }; -} \ No newline at end of file +} diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java index 0e14b27..18d3873 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.entity.Period; @@ -201,4 +201,4 @@ public List readWithCondition(@Nullable String condition, @Nullable Stri return readAll(); } } -} \ No newline at end of file +} diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/TransferControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/TransferControllerTest.java index bdaa485..3c095c6 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/TransferControllerTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/TransferControllerTest.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.controller.data; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Transfer; import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; @@ -74,4 +74,4 @@ public List readWithCondition(@Nullable String condition, @Nullable St return null; } }; -} \ No newline at end of file +} diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProviderTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProviderTest.java index b44bcf0..bae75b7 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProviderTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ExchangeRateProviderTest.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.report; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; @@ -117,4 +117,4 @@ public List readWithCondition(String condition, String[] args) { return new ArrayList<>(); } } -} \ No newline at end of file +} diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ReportTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ReportTest.java index 42deb1a..ef11251 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ReportTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/report/ReportTest.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.report; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; @@ -262,4 +262,4 @@ public ExchangeRate getRate(@Nullable Account account) { return null; } } -} \ No newline at end of file +} diff --git a/gradle.properties b/gradle.properties index 5d08ba7..e956ceb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,6 @@ # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true \ No newline at end of file +# org.gradle.parallel=true +android.enableJetifier=true +android.useAndroidX=true From a62ea82edadf884f3b5e2cc32a0b7b48fd93f55e Mon Sep 17 00:00:00 2001 From: Yevhenii Kanivets Date: Sat, 3 Oct 2020 22:25:57 +0300 Subject: [PATCH 05/76] #2; Update gradle files. --- app/build.gradle | 36 +++++++++++++++++------------------- build.gradle | 34 +++++++++++++++++----------------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5901efd..5e9eac9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -79,30 +79,28 @@ android { apply plugin: 'com.getkeepsafe.dexcount' dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - - proprietaryCompile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') { + proprietaryImplementation('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') { transitive = true } - compile 'androidx.legacy:legacy-support-v4:1.0.0' - compile 'androidx.appcompat:appcompat:1.0.0' - compile 'com.google.android.material:material:1.0.0' - compile 'com.jakewharton:butterknife:10.2.3' // View annotation bindings + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'com.google.android.material:material:1.0.0' + implementation 'com.jakewharton:butterknife:10.2.3' // View annotation bindings annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' // ButterKnife compiler - compile 'com.google.dagger:dagger:2.11' // Dependency injection tool - compile 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts - compile 'com.jakewharton.timber:timber:4.1.2' // Advanced logging tool - compile 'androidx.constraintlayout:constraintlayout:1.1.3' - compile 'com.dropbox.core:dropbox-core-sdk:3.0.5' // Dropbox Core API + implementation 'com.google.dagger:dagger:2.11' // Dependency injection tool + implementation 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts + implementation 'com.jakewharton.timber:timber:4.1.2' // Advanced logging tool + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.dropbox.core:dropbox-core-sdk:3.0.5' // Dropbox Core API - testCompile 'junit:junit:4.12' - testCompile 'org.mockito:mockito-core:2.8.9' - androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4' - androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4' - androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4' + testImplementation 'junit:junit:4.12' + testImplementation 'org.mockito:mockito-core:2.8.9' + androidTestImplementation 'com.crittercism.dexmaker:dexmaker:1.4' + androidTestImplementation 'com.crittercism.dexmaker:dexmaker-dx:1.4' + androidTestImplementation 'com.crittercism.dexmaker:dexmaker-mockito:1.4' annotationProcessor 'com.google.dagger:dagger-compiler:2.11' - provided 'org.glassfish:javax.annotation:10.0-b28' - compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + compileOnly 'org.glassfish:javax.annotation:10.0-b28' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.cardview:cardview:1.0.0' } diff --git a/build.gradle b/build.gradle index 7b1f894..15d908c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,24 +1,24 @@ buildscript { ext.kotlin_version = '1.3.10' repositories { - google() - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' - classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' + classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } } allprojects { - repositories { - google() - jcenter() - mavenCentral() - maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } - maven { url "https://jitpack.io" } - maven { url "https://maven.google.com" } - } + repositories { + google() + jcenter() + mavenCentral() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + maven { url "https://jitpack.io" } + maven { url "https://maven.google.com" } + } } From ae461f7c4d31fd8f71f6cf52d271d56c4bbf29d3 Mon Sep 17 00:00:00 2001 From: Yevhenii Kanivets Date: Sat, 3 Oct 2020 22:28:59 +0300 Subject: [PATCH 06/76] #2; Remove dexcount. --- app/build.gradle | 2 -- build.gradle | 1 - 2 files changed, 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5e9eac9..80db254 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,8 +76,6 @@ android { } } -apply plugin: 'com.getkeepsafe.dexcount' - dependencies { proprietaryImplementation('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') { transitive = true diff --git a/build.gradle b/build.gradle index 15d908c..d5d3eea 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,6 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.5.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } From 29327f086c9282168404592b87ba4531d419ba50 Mon Sep 17 00:00:00 2001 From: Yevhenii Kanivets Date: Sat, 3 Oct 2020 22:37:40 +0300 Subject: [PATCH 07/76] #9; Drop Fabric. --- app/build.gradle | 19 ------------------- .../moneytracker/util/CrashlyticsProxy.java | 15 +++++---------- 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 80db254..079d616 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,21 +1,6 @@ -buildscript { - repositories { - maven { url 'https://maven.fabric.io/public' } - } - - dependencies { - classpath 'io.fabric.tools:gradle:1.+' - } -} apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' -apply plugin: 'io.fabric' - -repositories { - maven { url 'https://maven.fabric.io/public' } - mavenCentral() -} android { compileSdkVersion 29 @@ -77,10 +62,6 @@ android { } dependencies { - proprietaryImplementation('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') { - transitive = true - } - implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.appcompat:appcompat:1.0.0' implementation 'com.google.android.material:material:1.0.0' diff --git a/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java b/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java index dd87ec2..32711b5 100644 --- a/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java +++ b/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java @@ -3,11 +3,6 @@ import android.content.Context; import androidx.annotation.Nullable; -import com.crashlytics.android.Crashlytics; -import com.crashlytics.android.answers.Answers; -import com.crashlytics.android.answers.ContentViewEvent; -import io.fabric.sdk.android.Fabric; - /** * Util class that wraps all Crashlytics interactions to disable Answers in * Debug mode and allow not including Crashlytics in free (fdroid) builds. @@ -33,7 +28,7 @@ private CrashlyticsProxy() { private boolean enabled; public static void startCrashlytics(Context context) { - Fabric.with(context, new Crashlytics()); + // Fabric.with(context, new Crashlytics()); } public void setEnabled(boolean enabled) { @@ -46,9 +41,9 @@ public boolean isEnabled() { public boolean logEvent(@Nullable String eventName) { if (enabled) { - Answers.getInstance().logContentView(new ContentViewEvent() + /*Answers.getInstance().logContentView(new ContentViewEvent() .putContentName(eventName) - .putContentType("Event")); + .putContentType("Event"));*/ return true; } else { return false; @@ -57,9 +52,9 @@ public boolean logEvent(@Nullable String eventName) { public boolean logButton(@Nullable String buttonName) { if (enabled) { - Answers.getInstance().logContentView(new ContentViewEvent() + /*Answers.getInstance().logContentView(new ContentViewEvent() .putContentName(buttonName) - .putContentType("Button")); + .putContentType("Button"));*/ return true; } else { return false; From e687a5c11b1ca3ff688284525e7f1f73b61108c3 Mon Sep 17 00:00:00 2001 From: Yevhenii Kanivets Date: Sat, 3 Oct 2020 22:52:11 +0300 Subject: [PATCH 08/76] #9; Migrate to Firebase Crashlytics. --- app/.gitignore | 4 ++-- app/build.gradle | 5 +++++ app/fabric.properties | 3 --- .../moneytracker/util/CrashlyticsProxy.java | 12 +++++------- build.gradle | 2 ++ 5 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 app/fabric.properties diff --git a/app/.gitignore b/app/.gitignore index e0fccc9..7c61bf7 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1,3 +1,3 @@ /build - -*._.DS_Store \ No newline at end of file +google-services.json +*._.DS_Store diff --git a/app/build.gradle b/app/build.gradle index 079d616..d6f49db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' android { compileSdkVersion 29 @@ -82,4 +84,7 @@ dependencies { compileOnly 'org.glassfish:javax.annotation:10.0-b28' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.cardview:cardview:1.0.0' + + implementation 'com.google.firebase:firebase-analytics:17.5.0' + implementation 'com.google.firebase:firebase-crashlytics:17.2.1' } diff --git a/app/fabric.properties b/app/fabric.properties deleted file mode 100644 index 055320f..0000000 --- a/app/fabric.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. -#Wed Dec 14 10:33:29 EET 2016 -apiSecret=82d758bae86a87ef822afbfc6f3c016c28c0b43f1d46862ebf37405141fa3414 diff --git a/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java b/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java index 32711b5..d2cfb87 100644 --- a/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java +++ b/app/src/proprietary/java/com/blogspot/e_kanivets/moneytracker/util/CrashlyticsProxy.java @@ -2,6 +2,7 @@ import android.content.Context; import androidx.annotation.Nullable; +import com.google.firebase.analytics.FirebaseAnalytics; /** * Util class that wraps all Crashlytics interactions to disable Answers in @@ -26,9 +27,10 @@ private CrashlyticsProxy() { } private boolean enabled; + private static FirebaseAnalytics analytics; public static void startCrashlytics(Context context) { - // Fabric.with(context, new Crashlytics()); + analytics = FirebaseAnalytics.getInstance(context); } public void setEnabled(boolean enabled) { @@ -41,9 +43,7 @@ public boolean isEnabled() { public boolean logEvent(@Nullable String eventName) { if (enabled) { - /*Answers.getInstance().logContentView(new ContentViewEvent() - .putContentName(eventName) - .putContentType("Event"));*/ + analytics.logEvent(eventName, null); return true; } else { return false; @@ -52,9 +52,7 @@ public boolean logEvent(@Nullable String eventName) { public boolean logButton(@Nullable String buttonName) { if (enabled) { - /*Answers.getInstance().logContentView(new ContentViewEvent() - .putContentName(buttonName) - .putContentType("Button"));*/ + analytics.logEvent(buttonName, null); return true; } else { return false; diff --git a/build.gradle b/build.gradle index d5d3eea..152dd00 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,8 @@ buildscript { classpath 'com.android.tools.build:gradle:3.5.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.google.gms:google-services:4.3.4' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0' } } From 8ee38988a2f7259b99a7a5b6b54795494b592c8d Mon Sep 17 00:00:00 2001 From: Yevhenii Kanivets Date: Sun, 4 Oct 2020 11:38:22 +0300 Subject: [PATCH 09/76] #7. Limit the selected account to single line. --- app/src/main/res/layout/view_spinner_item.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/view_spinner_item.xml b/app/src/main/res/layout/view_spinner_item.xml index a96615c..8f6c383 100644 --- a/app/src/main/res/layout/view_spinner_item.xml +++ b/app/src/main/res/layout/view_spinner_item.xml @@ -3,8 +3,11 @@ android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" + android:ellipsize="end" android:gravity="center_vertical" + android:maxLines="1" android:minHeight="?android:attr/listPreferredItemHeightSmall" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingStart="@dimen/quarter_margin" - android:textAppearance="?android:attr/textAppearanceListItemSmall" /> \ No newline at end of file + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:textAppearance="?android:attr/textAppearanceListItemSmall" + /> From 17b417cb4cac2e63458fd2df93a8f59158067ab0 Mon Sep 17 00:00:00 2001 From: Yevhenii Kanivets Date: Sun, 4 Oct 2020 11:39:04 +0300 Subject: [PATCH 10/76] VersionCode 35, versionName '2.1.3'. --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d6f49db..dc642d7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { minSdkVersion 21 targetSdkVersion 29 - versionCode 34 - versionName '2.1.2' + versionCode 35 + versionName '2.1.3' } signingConfigs { releaseConfig { From 1a8b7389efb39c23fe88282597bf674608b47bbe Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sun, 10 Oct 2021 14:53:44 +0300 Subject: [PATCH 11/76] #22; Update dependencies. --- app/build.gradle | 26 +++++++++---------- app/src/main/AndroidManifest.xml | 3 +++ .../fragment/AccountOperationsFragment.kt | 2 +- .../edit/fragment/EditAccountFragment.kt | 4 +-- build.gradle | 13 +++++----- gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index dc642d7..d9ede3e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,12 +5,12 @@ apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion 29 - buildToolsVersion '27.0.3' + compileSdkVersion 31 + buildToolsVersion '30.0.3' defaultConfig { applicationId 'com.blogspot.e_kanivets.moneytracker' minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 31 versionCode 35 versionName '2.1.3' @@ -65,26 +65,26 @@ android { dependencies { implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.appcompat:appcompat:1.0.0' - implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'com.google.android.material:material:1.4.0' implementation 'com.jakewharton:butterknife:10.2.3' // View annotation bindings annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' // ButterKnife compiler - implementation 'com.google.dagger:dagger:2.11' // Dependency injection tool + implementation 'com.google.dagger:dagger:2.35.1' // Dependency injection tool implementation 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts - implementation 'com.jakewharton.timber:timber:4.1.2' // Advanced logging tool - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.jakewharton.timber:timber:4.7.1' // Advanced logging tool + implementation 'androidx.constraintlayout:constraintlayout:2.1.1' implementation 'com.dropbox.core:dropbox-core-sdk:3.0.5' // Dropbox Core API - testImplementation 'junit:junit:4.12' - testImplementation 'org.mockito:mockito-core:2.8.9' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.mockito:mockito-core:3.5.13' androidTestImplementation 'com.crittercism.dexmaker:dexmaker:1.4' androidTestImplementation 'com.crittercism.dexmaker:dexmaker-dx:1.4' androidTestImplementation 'com.crittercism.dexmaker:dexmaker-mockito:1.4' - annotationProcessor 'com.google.dagger:dagger-compiler:2.11' + annotationProcessor 'com.google.dagger:dagger-compiler:2.35.1' compileOnly 'org.glassfish:javax.annotation:10.0-b28' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.cardview:cardview:1.0.0' - implementation 'com.google.firebase:firebase-analytics:17.5.0' - implementation 'com.google.firebase:firebase-crashlytics:17.2.1' + implementation 'com.google.firebase:firebase-analytics:19.0.2' + implementation 'com.google.firebase:firebase-crashlytics:18.2.3' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 50d8f7d..873586d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ android:theme="@style/Theme.Default"> @@ -92,6 +93,7 @@ @@ -100,6 +102,7 @@ + diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt index 0de51ed..f6db123 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt @@ -35,7 +35,7 @@ class AccountOperationsFragment : BaseFragment() { override fun initData() { appComponent.inject(this@AccountOperationsFragment) - arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT) } + arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT)!! } } override fun initViews(view: View) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt index 2ee6289..7820378 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/EditAccountFragment.kt @@ -31,7 +31,7 @@ class EditAccountFragment : BaseFragment() { override fun initData() { appComponent.inject(this@EditAccountFragment) - arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT) } + arguments?.let { arguments -> account = arguments.getParcelable(KEY_ACCOUNT)!! } } override fun initViews(view: View) { @@ -42,7 +42,7 @@ class EditAccountFragment : BaseFragment() { val fabDone = view.rootView.findViewById(R.id.fabDone) fabDone.setOnClickListener { done() } - accountValidator = EditAccountValidator(context!!, view) + accountValidator = EditAccountValidator(requireContext(), view) } private fun done() { diff --git a/build.gradle b/build.gradle index 152dd00..3abc77e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,22 +1,21 @@ buildscript { - ext.kotlin_version = '1.3.10' + ext.kotlin_version = '1.5.31' repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' - classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' + classpath 'com.android.tools.build:gradle:7.0.2' + classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.4' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0' + classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' } } allprojects { repositories { google() - jcenter() mavenCentral() maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } maven { url "https://jitpack.io" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8068ee5..81ad8d9 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-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip From 432c04c434c5c88a35f957681078c677b70d743c Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sun, 10 Oct 2021 14:59:12 +0300 Subject: [PATCH 12/76] #22; Update icon. --- app/src/main/ic_launcher-playstore.png | Bin 0 -> 24288 bytes app/src/main/ic_launcher-web.png | Bin 46416 -> 0 bytes .../res/drawable/ic_launcher_foreground.xml | 19 ++++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +++++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +++++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3280 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2049 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4619 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7761 -> 0 bytes app/src/main/res/mipmap-xxxhdpi/Thumbs.db | Bin 17408 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 11426 -> 0 bytes .../res/values/ic_launcher_background.xml | 4 ++++ 12 files changed, 33 insertions(+) create mode 100644 app/src/main/ic_launcher-playstore.png delete mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/Thumbs.db delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values/ic_launcher_background.xml diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..84115515e3ac07272d28604b301093db72227ee9 GIT binary patch literal 24288 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

h0N2nmOJCWB0$Tnf1_-jdXj5RB)%;we%v zz?T{oQKrG(*WW@9nsz3Mv*I)Jqxd=r6&)J(+ctx2&UXzJXiJc4xtJk58(FeO=F$*{dpZj@cio7l%4kioyolgUkf`O9afjQmExKLA_Bv*s?G$ZU!Q zq;%>cXhSO*+@VyjXnoiW@_=4u!)9Ab?PqD9y=GzDNBBK@dGc#%>3A(zKY()X1nED| z7HJy*(q5Y|%FM!9#(8{?k~x@udbKCkCiz|kb{N-Mv1ywOf!>P03;pY!Y1eymU?c8T z&G)6D<2ALSBoPF(skF2E7G0Ka`%F*rRK3l0QlENdG{Strhl`3%2zG~@??rFke@*tw zrag9Yjyh&L7ld8~106k2+sVY=#^6kt&?Tldv*-1#XW7mH4Vlf4=V_Bpu9yXP-s4`B z%*i9B$0m-iwX&!+@IM@GP8ceFslJgzTtn@vpGI+a{b9&U+J!1SaCPD?QYt*U$(OCH zG-mv-MM+J;daDA48xQk0fyK3J@3Ic6>z@=+RFw!4J`#HUFG?UCeuFhE0i{ED%UYf; z0%;BZ!VpGo8{2QKVkEjWAgZ(ba*g+JC?RO&6w|QfX3}2_G5|$L954Xpuck>nft?6A ztC@WE(KpCAZ!jT0j(Q)b=G?_?Ve?CW&>A}_%^r~WdynwlRXKG2X z=bmYp5zBa(Pw}4;=rrN~L9Q*jw}z&%;wIHulG32K_yY%fgc)WZa;CLavtG_;56w^G zKqj4Y)yRUzv&q$h(v2|aNg7$v`5+rVvt2NGO9$}P`lVIw%2ZPF`vK{#4~;9iTY^Po z!X7pIVGWe}GeEayd_Q#25@is1#fQokBm%bqho8B?pR9c2n(UQut-bL8EJ4h{`|$oM zN77Dd#QXQR41J!NNX+g(Tm~&Xh{vrtZ?*68(;?3{ncm}~Zx`WTlrR~m708I9K&5^R z$zDra<)1Xo_Kf~D9USWQ^7cQK{n@%Mk9TV2DS!BgiTj9y*8{KfEM$X@-j!boI63g? z>-&JjSS!!t@o95?>o?nS9(nFn;!=jKG4(9cdVe<#-Z`6}o4086;_NOs6Ql0QA z_LxX9$w-DkTp>pwA}A0D3R(n$h6RCO5<(#Obr1;kBm^Ri|NqAi>>)4y7c;;5_xTqD O{9V&B)T~6?Mf@N0b+<;< z-7)cd_08kj{Yu^R{DEJi$z=^<*qu}ui z06+o;+8UO@f3_TmZL+K#`!(pU2L-km@{Rcw?~J!Mk?8i_N_y{Vt))dgb#-U=cH!#ZJ)f<-7$kg(ep@ z90rY4|NkHVPfai?4Uk_%-%6OYXkP3sY9Jqt7*upys%l=OoBv2jhqn;=g_V<;@#_ex zb|d1n`L2U6(?ysd%&@CRyOQ`gjNOIQ+DNHdCe9lZM|0&LW_6nzg4kO^1!umM_ISF) zpUzp9H(g4zZ%gaZ3fOAm5Y?94^W0X?`6o&D9TRVd=?gKj^P+;j*@~(1S|y03Ikji1 z9hT@uY>Q?mVfjew)nqQbEy#BSne zxeJc<&@T*HSK(1gEFmfRtVbl^r&IMZU1yHaQH9M7@*KnE(pNDtr$!7!tMK&;>Vxcb zylw_QRS<8|aOZg~U8xuks)p;1-iN$t3Rm_%pOgA0?;@TyY%~e2c?ES6`{!?{=)9jV zqY586>i9LHu10p4H{elLoE~w<-v25vJr^E1u9|q|1xvTx#k*Eh->rl@`n;w8nvOOS z2gPmC|cr$HBY1xS?Joe6GS6F4dk);Rm^;LAV|dBN{-Nba-?Jt z%S5{t^q`u4JL@_*c{Kx()>@DWD)3^ijO!{q`;cAN-Ioq!CFfATW^Qm_XHT4UPHb}R zan!Vg^wrP`bKR+a{_^yOg5ffi6phUwQU99PlRwdD3(oMT2M*8QTcIBbVQcc-^e*Ny zWlFp>rebO+R9|1Mbd9ZtxJ;1m){-3GL86m>)`e>TfrFt>*@;k(nc$t-mo1@UX`yJc zSXCyX?f1K%ZJLN6k4@J8jLNu9KL5btpcEE$6{TbMrbCm8wnaRon1!=hFvdOwcitbg zS_*7-N-5N0_Xi!1l>YJ#sudA0`fN6FIZwt^Cg@vbOWBS!ZQA!H;>*3Bo5^0KqEGzc zn`w!=M*oP2CIj|`H2F+pEK4n0ez017oUiWW2{Ylo_{u=k@xj>Bs`_sILyA|qGH<<% zCYiqgSMefm??6%9Xuv zH42Yx+zg8eFN{Y$qE&fq?jk|oK#}=J57u+F#fo%|j^O_G0`Z8&zmsU*buvxrS<8Qv ztwE}6OAn6j-b#YZYJj%t<~45-d(?lAf#+F4PNG5flF2est?C;yYCrh*xqf3ANc#nz}tf~pa-&{YhipihPfzM@>|#4ZY{yJ)>)yIrhyF>&*msu`8;&mk*$ ziEl=z!*kZ8bc#ifNUzRqymRrO+aBs+HGQJ@GLO=PdVbXW?8!|dr@;5*9Nog^>cuw_ zH9se*-aEQmHgau88H@*K$osa_XwmFH__XWVfrF5610lJAt)WMp22KrMx_Cnf*Q9id zWG;S;d8DdF=SnAl3nS3RG^Wfbhb>($tIumvt^`|c&OJ3=&|)j$>v=jM#bj2jaUt^4 zgEsccNk;_s55n-@&a89asK%bjD|`^X8OWJT#z6SqV=Pa#;E3hP7i9>zj^MEAI5t%e zw$jrY?Hd=SrPNMYLSIZexFh&v8Y9F-`9=i7b=MmVi|<}+Em7)nQ71T3t4WRP_|(N* ztC@d4S<@mB&6&LYFp8s*r+nl+l~iGZa_@E6f4Qv0-;yn_+b{9<=k(ckQI_?SlpiMa z{-#i`-7;_?KHSRi$W{F=yGYb~QxCWbNeKJg!?*N^!K3Ah`(df_{!|8>$z@is_Xe@9 zZB4fu^Hl%JmotMuwCppxth4)0(QL#}nx;3n_H{;;HMI}p$R+uM?~PM3JQQ@vyu=x0jq!g&($B_5Iqcw;H$zjlR6Y^=_k+R7JZgt}8?dDIA$#e| zvc&V92Q!Y!(_^C-jq&QzbJ35*OXWbn99>pBZB$(LY}=tU?IW=lW1}_<5QfL%wu6E% zDnjWxAmDYm>xBWYT0mRUZGCGBDH#XFn9P#$Vl zQnuJL6|c5wLz(7N0n=?QtzU58E|UX~w~UdWXfqe;@n15jBS)`cy4T)KI3mUTW9~C8)#c8qHdpdYo_kK1*CXm`c-f(*4^>)F*&! za^I^Ot+GcEPuK zsG)(EcCiWb0tIskHjK@O3_Th?>I0!dTgkZ;Db^9tiZvZSk*5lU2~LC+bd$Zm--s^c ze56a!tA(zvP5AM+vlph!!9A9mkzSam^2M!mVtjd0S0FPL_j|q7#4iKmaN(Qcco$-t zZnWq*9^hv%tsZgma7BhPbE>qqP0p2a`bNdgUBamtG&^j)sD*rTMD}>=9rVp> zNOd^SI2$i;X^`b=H^Ifp7vY%4yw&U8m7dGLkl)Cl{Ob*MS_nWtWu~q_c`NNcd;Gxc zA+^&QMI}FX+ASKAwuwaZ+b<#6$>-+g;S2{=HJTb$tn^k+(WUw1*K3BNGX8j9uWBD= z#>!w-EF-qB#0%6)64qGr^&EeL4OE#%{dg{%X3P5R^BuPuwvb02dqy+FOo<75 zpC9&qZV5D)83=VCJz10*9HNbd)G9-kPer11-nw@_Yd4NM#wWdvg2PhlNBswWWk~FM z+>TwN|GhA=cCgxcD+u!-V21KrKujwSmA<&OdVoLmn`|Mj79kSD&47~THv0UTjgtB% zMpoPRuPd8UFbIOiSYbHC<8}3ympnOJP$y4%W+-YQH`W{AtcZ#Y$kPF&P)>Wcr9`RUw%}@}SUU z*0{5b-6Sl1(^%11)6 zKR$XU40HnXgO>{d9~tDo)VovxJkvGUMUr@(DsV54FAK)}6CtpzK7J~kO9@Vg3zHoZ@_}1oqdN4zO z9YD|89kKrU<-|R#alpykKvvM7H52Q`85iTqdHub~y`{P1q3jo-mjW3P#R-wJ2M&|6 z*;@W40&Y1@k<*$~Prxs@Q9n0WG-`p8vMkmJxcNLSeMraPnTpQQFa^%vf5)*XkEs*P}BoL=uFL zq7D=LjU!^KT}e;)*1nQL1g^??)WlbxB2L5`QMk(Z@bOrqd#48pP#B)AcAta z<-b-(A&rR>hEaXvzvY@HmcVFuTGo+$L+eMa0g=wh4S9wRn!*|p0WVnsVe*S!Ixf07 zX{yohQYWk)uFJ2nR9E8~E&H-cFN#)bx*5v4b4%@l>o!XkC^~na)^e>^bIZ}w2sh%l zAWJm}n>FTnb3b0j*+Lb(8A4+fjoP6Um%*sT^IGSzascy!*9RUESVe8*3D6AZ<)A^mg_@E zYso7~TsUr(qEU*Sj;!jJMtTU5>DNcFufl4XGQ|la5ygB& z8Wzt&_)J{v!i^Z* ztaW?;SsMAli>LC0k%`eAw2+od*clCt-vdmis8|_31&n~Jkw_3R7!wX{oIZvMwY{5K zNVb~UqUE>3t%>nB=3#N)^|~XY@hDJ%kAX;2y&obUcAsVIc36A|AxEV(a!riJd8^E# zWBaFk5=Bi59lsM!qhWk~CzcoiM;r5h;UI-74eJb+#|NT~{KX$t5c{HMA5?T^zTRwagHe!PU7q z@-SMBjyVHg$le4*8$Z50RqjU#h6xm!+E5MhM=q=TY6oa-#xk!tzt_l85c|>KR#BM3 zA44@r;yhexPVa8s2zMf&xLJWU>HDn~lDeGIG6rZ6#ZOY;H-LIV;G!5M{ z57_z`o@wf66}{(F%V4qHO&;bRs5XY;tB4nEj(nYki~E(mTG2b=FhxQ5#%-FkPy2sXt`%*TsC2|W9P$bS)Mh<9p;^6EUd-5ae-^s3O5*SCp@N@CU*A5!35-5 zL$k*3FD7#)PhgNsf4rz4Z%b@tV52TSNbA8F&?g2$x^o{4Tt2a^lnvlZmcPM)ynk zsD`VL45uEYn!WzhZMwR zxsF@PKacSH^DbL{aWz3u`J_wpY3i}I(D1z8 z|JOfhEAacp)3?IaLvcMDj|Zv@BR_m())ym>6jpf2#kVaV%)cG^okVtl(F;;@Q@~I0 zp;F$Lk}PSoP{Fi@0fzLqrcP!5k%O#jZ_hi_azTm`Inp4ynarV z@4o)0%X?V#F1T!$=1`WyThwja_3-oJUiRDf0U9R5#G?fFd|wq5j3k>lJb8TNJr+>N zf~4j;_hNaVa-ZX!nz0a5C~c|l#8Ivq`|r)rM{@MzZ!`n#2xxm%?k;b$KN|fx38xU9 z0F%JCG@m;mKAC2`>c2x-(Sy}E-l1%o$O{&GR3&DCHNtMQ{Pe_$? zfW^!0Zr(x4t>rk@O~TepDv3^?j_;mdt@Ly|qZfe~XCFM9eUnp046BIs7p(7tgKe~e z4?kb_nTA(rQhz(Pvb}IVtKs`!E`cdBXe|e1%9Bq1x)WtP6u~9;OiSW4Umt#FcYmOh za}eKI+GUYSLpXj;U)l)^bho{E1Xg6-eMvHzdoy_> zrhiur2)h?DKXaPudK1N`IWeDhR8~N=PIPw^!;Q`ejB#^$>G876bhn&0?yGBeOZ&mG zgr>Sa&|-RGeGxbh+5mDm*XZ@``kOX-62b_-qi=?qajf!|*R>s3-vtI{R^2)Hc8^!U zMHPseS~i=r(Tyb9)pz3w(maxrK3?&yC?wsnuI54sZ8sy()T^osk{*fzW{oAtEC5P`e2clY*eb*kIy?JZzrkl`dV(}OE^xK1l;(96} z)fh|KtGW8?_4x8Dc;LB#hvEYSE$;Y853PDg!qXKzc3K_ z!H;&a@Onk`kFc@p_<68AT?6}v`i|(f1_U0#9HA%`-;%Rz%llRVQ473~%hR22xee<;-n zuMx}Bv_Y0xD)N@~6`xt3g%GeC=MD%y;oQ12JUVcvyMJD>uKT|6rD26joR(r0)GvT5 zin9e_h;xr1;-tw)9XCE;iq=}T*B3cqz*HCCxtTS!s&(5%!akuPYHqpQcSE7x?x)_t zZbx2-S9n*!08G!I}K+24UMuJX6OWFt~VFls%Q@1m|HvQ!?KD_3w z%-W43DAyUy>FLjBTBX#x{MzW*@L8u;C^BVFg|>lyiL4`+t)A=e#WInh*KDA0CYSPe zij??j;)eJ%)eMBw^GFgu5m$B#*Ic{2fe$(!wGfvTLUS5t&I=V9i0jZk^xY?zk3ZYg z$BXF%EwU}O5H>9cye1RRIjOkW$wfjV&ZX`2?!mHI{5e>(4ZYZVTVu=J?@`5?wD7Q= zHY|gx3pe`3n8(R1fpZX*nmkKs^7%`hQ!_m5_KDWR`a=JLmN`$x*+4x))8OF{KXc57 zTRdHbrW8j%BTZ^-zf`59*gy0PZoTr|n=AkW*AsHQL;u(~B@ zVOSg;za#k0T|Dc|Xfq(!HoV2gXqpWpl^e`@lzWzrxh%r8=U1M>rkO6J=r~GLh&-pX zU1Et9nQ6d-3`ucG>Ncd)27Ynr!`yM7>gK}3zW(`jj~=zd`TmL7gDc1!WRF)8+x&bZ zJ@M(BZ(pssFFp(7klEaG{65&z<LVa8ur)u4?mzDHr7rp8vqTiy{aUPVRhMH;ld0Qu6 zow0bA%A@pYRP0EW0Kpg` zuRg(sBq3}~Zg09cgU5eqF7AAi$^_^Dt_y?3>&Kk$)sm>gi~cjDMT=UoFOL2FvXElP zu4Z9Y;{I;yheI2X0Ui-OKpDYWVjIE79@(B zXJPYRt~6nTF^H?ldv|^#LxMX}szF@r+HUAIU?22w7T>EH_tMa- zzj!MzdAQB_wvcMD7_p29nm{t2#0?Xp$FauZ#Hy#%C7}`;+056EXf=eO#+b)0n_v9v zF4hJ{oxD*O)ExkP61>^Wk}*;t5>vCN#ne4loZ#On2|Daq{x;gbf&F2@cW&iPW%)tt z$Fh5EACi}AxxpA@D<2Z4 ziw)ZNMWT&EX3#TTur9`0e>~rtRwoM|{3S0U=1m4r-XYG}@Xl+H!YtiCXMH{h1yRw* zl9leF6+IPg;z+|>OWvF8`ReIi!`?b*ukQwP238N( zxPsOc$VcFxqM!vEObSf54WmmE+t~MOeH1(R$WvmfiRea1!VNL{xE?Nijr)oeBqgpk zu8N=3(X{>z2l?Fo8#gO^dZwwIXROSeNjQ+Wr zX`WPTG6C&90kY<{sUo}A@K`Z=JDB1N(@J$8B-^IVp$ zRGd-qd`74Oi6|%7CHgQb77>zt!|$eP&*S|~uO+<$Cb9D%88X!10;6xYCFx%E(%Vn< zFniZ#8X9MCjgYmkzNd&6R}@x_V#k zSwGbgxt3&4;2z<+mw@Y`1S0BE6$4{xH^WH@RbWC{BF@E_O(<`~bXb+Qt zPTOf2ysP}n&+G?Yw{yipFl#R+yN$QV^q)k{MIKsqT&82vF`;JQ=|A~NaG4gefS8~$ z-1r#$OF5xgrPG!tUdzQOPwbiI5zJh?%T)Z)^y52KPh)?<8cA#}jKjBNJFoUOmzRyVlxMpKJDyVgr zd(P1|h&{~WTK6{()(o`_JTe3IhYx4bEqI?3Bmx3et>bpqqc*Di6rTy_p0hrF292Sm zG=E8WvC*?~c+Xc%O@e1Bz6re7lvU3yLcj6YNEgo@2*-w91{ur(gff+*Ps?Ke?&D+! zYCn;_r1S3n7W54D<$t~xfR=Z^h22=T;tzC$jnWJ}cPpsWd zb)c=T}mT zlV+yvgsGC@d0x2nP;fg(aTt8bGryvbZcaS2GbrYo<@SA^6a(UO`ENNVULQHH z%*C5$T`{(-4&I0Z*OQhz;ar;N)At0tKnx$$hl-SEq|0{o*1x2uhz5gyguwyS!zAj; z8{3FqvHQCQnqN4;xP|YZh-aGtyN{LL`BpBpZhj=JVH74g7vHo7k3EPVDZqoT_r+CT zG)KcrsiocHjx1x;VfHZ?RY6MEx-JU=D;;3ScRDP>`|`OKFLY(+Y>5s8kIxt`TgYie zt(!0%{CzX{^_b(dyEI?cr}?*a(rz=868}R*rMHWLJ5ci&EY7cQ;kafg7Wt+}eL{je zMd0VtMh)9U+LJ*<=QatoW@5=FoxP_)<>Kn+w3jZM5=_AUKnsG`Y%cYK+mEi|r;F(* z=E71YO;A3PZnX4&_VKQFjocR5-BI6H*fcP1FP~#}699*4!Aq9Xz_~ouu$rA(kk^HO zS0!uKkV*tbJ49i@qEJf)$V2fi-*{cv4>>Hx=xP(jxVWk~6%U3tr&ZeAV%s|>BltI{ zb?W>;`VCtl`I*VA6poZnJCG9%HQJx!8lbsW3D2vNX*Y^SLzY=Ojf?&%rVJ0SAwOQ& zx8^z%GDgttp1}6xuayiFmN+71hRcMQW)KbTOFeSMdNjzjL?HOv+UK21ZG$4ZrEMo3 zIpAeqvbkl!@b9PPLqZ2F`^9s$d0-~d$6+;aEjq}Tl+&Or8kmtPT1$Nlm>{cb_#rhzFU< zA0-|3`UHwukuG&D`nOs}Jhx7n;P{_a@O`mbMJ=R1F$|{dpSI3++9QI>x!Rr^Q5NpCpw!mvyDlzt`=GiqvLlAf%g`tu)U<^ zkFX1BV9ta1*#XAV&kjS#Y%c^`XHamERMvbDF1s3sm2MtK`aZw6s_#^|5x-okv0S@D z!$pxxsai>CK4ssn;O}UYN%WP+I!G8eyTk6x!gE`WC<;7a&XGfD{I;(g0eT?#lJjW% zqL+8RF=IW1?9mb$H_(=LM{Lz?(m!}Ir0yV3SD$qd1XK+JD6fzbX+Op54I_Saa_Umr z{~U=7x-4-?NU`lmxmOcW{Glk4^QV6=@tWcQDN-<=r4u`AD(=Aknje2xSm0(Nq7g0E zqL|vG^)y5TygkRZ@wx7cQY6D)@}rdhN?(^8IV!kOdH+?%clx}FMa@Efo3n_dWwh`C zO6$#}Mx60|U`i8Wm8=6|t>I;nSu@z)TkTOvOU@q{CE*tlN|L2pdR5}(lz9o;kuupB zUpd^}y3GPqe*DG^-A7->pWAqCj1VZRyMEki`)j*}?Ah>IcymTEh@$%O2d@McZtk{% zzi4YB8&{f%^hL;FGhM&+aj6=(hf4I#NF(-UR zHwo&th&AFi2F8zzKdZpm2p;TggPK47*gP>58Y-*r+UVNitdO?|H7(`>Rv#+&C!!cm|Q)JsIi4G1-Cw29FJbj{EWe zor%h=kipY+f!a&fgwv|!7OJ@o3cdZR>!*iMh8ih&MtqEEB?v!ToJiCJ)jZyOQU|263Js9mem;D&;@zWv}~2p zRB;u|erj9p{$6Vs2~q)^`nWI}h_Oc(+24hh-ZDwVM^;I*&_yM2ik@5D`BoRFn~OBQ zwnUpVh73d$nua(dF%mb!;MSj3AKuq9i+!CzCdNblXFiTx5U;eRIYY832n*Ne4LX9k zS-x@_;=-sQ#>`#!ls_okd>`@}D@R;jbG}e)L;Fqxs&2ID6y4(R6Wf1V;DGM-I(jVk zZ48D@!P00J_MDu_ssp_KuRK$fpN(&!4%=pK^z&4+&~Rl^-h91`wu1TH6zqyxCx1s! zVBh3?-o1FRo2>eaRd#E8^%ETMrV?46!FwmA;=O6#q4ar}oR~6zfp-ZDmhAqzcj>oC ziqPWz2=9YlUkGv;?>EDs%vQtrUBRlq>WAtK?*U2_8m3^wUXoAS`f6(%osuGA>x`XX zt&ZL8c zdn#0#rt58A*XXdDIxCUQ6K}U|@n)y(YYLZ~h<*uV9bwn6ajY*5kD@^C3}Tsz+HRpc z@6+O+m4H@ikBQYeT-w!Dl!giQb?+ov$Z@8eNd9t-g~^`ab>1)+Mg9r62@4)|6|RIZ z6q|j2*OH2sxUo(53z7)dObFoyuHt49`_A9T{F1j`n7iUvGg`D<91K6T0fOO}X7Ul|?+P(bg&TV?Y5T1V)zdUjkIA}Tdt?KWM ze}}3Jm$VBO{;WvunKluBM;fGx0P+?*(=z0KZra~ResZs5@$T$Hotf1EC{pNC1x2zd zCh7jWdH>g~_|z|A@tYH~Ys{0Qw<#iS5O@CwCL<|`#tCz`uHx#^VC#( z&_lG{H7-b}tirYLU=S_lU5lXwULMK*t~Lll7!8!31# z!i<&s^l=V92DIYa{uP75+1S+F>o>Aw8wFL&rwY~^pU%DYdab?4&(WsvqfKM@2hRZy z6?%0iwR#C)OVj<>5jflU$VO={L-$S=W)~&U#(tEX=VD4P@gXatOQrwJ7lBAjPum4`f=!x?QGh%R z%2wva3+zyF8YjT0YLSMqa$iw_41dj++KCX8cGrY(i5yt7ZTB%{t_~(XxnB7_4*SiC zBMEbt0kR>{1tR06g}vvTCh;G3Xo=JzU0MgI?^xf~^~0$j1Uh%-vhn*jFV)KTXn(zk z#y&s{8UIHArM#s1F@&~&t-6}L&P`M6Ka1rBT6J+7AJr8Fkz{2kJ0EG}$V5k~3C^Jx zLXc0_^@C_M{*|L*-DHU6cj&q`rJ@ubx1!<#&_lwW;A?}%E^gD7A`+=1*wBQ?@H69g z4~1N9cRqIP|2@PySG03vpx!r*7_`v_2+_)qWswjf{lFWyyptzEcyC3UD(%I`g!og~ z8sr?!57i_#1U- zgkIMYurJ@~VtLLj$|(Fny;Z@VR|~=wc3@o)zD8v}*B6oG{D*nXZ9Gnu8($-v#)Fh4 z{1XtdRsAoe_i%+3(G2tgP(M6^_t~kLd&H;B1mN95DCVlcijVQKe*P@p9VaX~64f^4 z2D*Qzu3?(K z7}>EpDBk;X`LK6C;n@6^6Y`A+0O=Au*p+suBP*h~)%MbcN^MM{D{uOd^F|fgV_B_a z0`i(ig1ffqO7U{N^mX-kbneCz2RRc2e9UmXCm_6jbvI@!@N5UyViiUd!X&OOh@IDEE$_H<}i|GAVjB;P8KqbPF0i7Or&gU0|0abK& zt3@kBy=xhTU3~YV^g6L*PwG;W@j+=e)Cn;^0wG=22iBpGlfhLj!&~sG2934fSr#l* z?OLc^CdlZn0_43ipy=c}F$Q`rAK@Zf+Hj59gJAC_4nOnyHKz?xQpzkFezgpMgUzbt z&9;+*xO2W;P;Msx!(*EwkBV^Of&PFpBY+XWD`i4EEKciGSqty*wf3_e7XWL!v>J-n z5>5!fehSN9Wvk%(MSf<4Muz+yEz%VZhppoKFw-R>=70yg`-tir+*dIQ-*P+YwwW0Yp{p;BR=Th0Kjxdvr7wTp&8{K#|@ z9E+*G_D=GiqwmFM3)i1hQ4u0X2b>-?^3{FjPCX`xe3|({Nf35&j~U6z3%!sORG(nX z-PuM{roPMbIEa1lQW*fl{4K`!wc7wbk8qvyA{?uR0wn~V6?M&es;VKxnwKC$95Qe9 zKY;d`3DD$6Jj}smf;w34#9@>GS^R1tfx$vn1V4U;2RS=^c^f8y1(fsR)Q1k=Iu%LT zTohB)T}xBjL6l>5TgrOXc#~KR^--@zpbM55+pDh8Ct7mNlRdHW!dD3JY61a-yM9_K zrMn*2!SM;Ar2>|;=yo@PJey@G#^WB@2%KWx`pRd=+KO!E2# z`FGsrC*)4Y?SYLD#JBfA!qe!~3DrH+ko9%rE}o0y6r8DdNWg}k1uYCB;Y3M%`|;Gd zMk#gn!ChcF9zp!PFw-3U!{<~@r=LY4JmJ!bZjh4@K){gYX=*ZLcoMGfirqegeqJ(X z4o`sZ$Uy>4Tu>5Hm6@FW4e`w2-NVgD7psQm@aChx>Ec+HL*Q%->$~@ckP|y0qHfKT zp0s%;0(c%4Z+&CFLlWoSsub_5eV_;FvV)WuEY~*QOZOU>ufF%h*(NNKYK!!hit{ph zg2NhSL$ujTN%hEPUAol2W_>kY&)Ag~LX55u=8DpSF0|#@sa~{Sy&TXys}4)X|Jp*l zj7c`{c02mGiW{jiCTj0$)5l#0f^PuQ>6i%@;7@kyc7QqvG-J|^iLx-4JlE6@NnWfw zmt>aBL^R_h-DbBC_`p%@43t-%2keT*D`#@!J^1MaX@8==OwFK@m+baTTH+5r+21L6 zW*wJ4&*OAJz9DY>2d0lYCopH?H}@44kmF3`j$4B8<2$d@yulA=VP2Tj-18Ov zgME@SoVtstC{P9&4*MiLU1&u1ue#d7N2r969lXQ0b!rR0#0deZCqvnOs{Pll+^`En z3S^@G41ZzMG6}rlwW-BMOX#3Po&(7wD#UQMD!B4EDPHv(uOq|aj5ay>ub>kn18X|d8R6oJ_e9RC zxu#cr3Hr_ zkkQ4pFKM@)#eP{)+omqqBv^6GOvl^;_H+TRbM(zBq%XJP$g2sG$SL8!-5UE+UdwoS z1qkDN?Jfr5c)1bTi!E~|$R0T<;6n@gE>G+lsa?PHKbHpKlF*Mb zo6G0|T8)d-H8k4q&gLX^@a69;I|(Y}40Iv(R-Er=f%HVfGgU}ki9qZ`uS}Z+%p2p* z4c0gdpTRN*h1w>~BQ(&7{7^$jq2(8gG2!IDrcMVLM9+o!h=|nT-h(fdYjGwFSCDN2 z)`g~|;?y1Jd_F>gyd!y28tv(P6NexOv!IkHLx9S+2%tD%+jMi0)ua)m4bm{2t}8gY zE|7hxYS0GpKv#_La;;ftt; z`+)ckLnx>L7rvN&u{`1r84W0-k^ElDb#TF-FwoZZUgx88sOBoz`O;K@gHxNs0)zfR`-^#cJ#_qcV;GMYfC zvCI)%|Bz zC3SXa-b4`(?g6p99xf=BU?-DK{R_k)vuU{O4@&MFQ)mb{^KdcI0S|J@LlOpxcNwnU zdVHY7lYD*#GghHU!-QN1%jI+o!in-a4{U4Tq4n7ElCxX_gw< z=3Xppl?~*=2fh%g?;^01!Wrhbc#4IAHFD%ex$C6tLme$ht8PJ;DU}KzqKE{z5(jsF z^jT94_ivk1Fy7m=A0$2m2z)XSOzqY%bBMYUiBG^pRIx~B>&29rV;DOd)L$C1=g}ap z_K}pq;cp;e*LnPa@G}&%=vKfc6(L%Jjj~8D+}t#N@a9HDO%jT(|aGZ^cZ8; z%ef~u3R|0A8ue+ueN(M}s0U{_hfaw-%UbmCezOHNrnHklzl7R~-J#F+Sb zM>oMX^>7(c3pb}CwB3>a{A^{#>_r{FL<_9T`3Yf{DJOeirM>-EYY6z7h9Dy;dO|Hz3TzDe#oAOUeP(WmMj2OoepsBt`PxG~%kZ?0ycE$n@|x{q|E1Q~8hn zK|nwhmf~=i;>#134@U$gjzdR3C8qfchS&~JkB%;R(f{7xb+dZOzH~`{vXcnb|iPs!EtT&FIK7zMZklx8wM$ zwMg_a!TBs~K+1&l{;|S`7m&`edD29}NM||;vOyH6_IQFkjrjG03U?++vL({buamc) z$SS|kXn))Z>zdjAr+0L23=G(z*$^BDOKjquCuuod*8!p~EaD|F>V(0eM6|S@ z*FcfJ3;-mL7v-B-F!=e}D>V*$lJf6irc<)1-TS zra=w-9}iz07S;ECeP`%S=}x6XkdmRh6eUDTNogq&WCjEQ0V$OZK@_ALBxVq$q(Qnw zx*GWdFHw2-gEZZXYIAtKDLgEJ<{JdZ_)sYuvj*!gZ{H-8jxtR(*-2> z5l5mh+F;l&_v9Wew@Vd_IpP`5Ua`Hd&k-S?i zJa8@G++{ROr6KfVXga^m1y%$c9K;E(bH$QxB6OtBg#fk+41QA6n&lDjK$iYTRiz9l zE2v=I$p9AfLgu;KVJQ{kofgu!8~#ZD)NsBR;lLJk_tOz7t;+@i>d&U6Oie7ko6jvW zZa<>>EAQMc@Pe?SJD24u=S~i@?-t`s#i4-MrCs~oLIfD~Hz6U9K18$=Bl^o9!5;N! zHi6%6G#ty-Hk4UsmR(DP%2`DJH~KaiV9#P0UgjwjmUqls35uu^2g9J6j(7OA-uQry ze(bSh8N0V%&L!^&6zuXcEht3z@hqw}SHud6;T9Xjpo{W182_5&L8t*^@=YgFuCm{= zFYPf>F$NF1CumVmtA2CW@kO{N3z*3|tNJVGgnZ>i!=NBgScm`6xkXB_CcM?&XCAkV zOItSX7nr0jmo|k=xe(2glSGDAYAdILyMh4#-5~8tbGE7Q%Nd;P-8@DV-A&-a98j9d z1|~x-gR?aR#8yhKxg=64VV?BoO0u%fpf^43#oHtdXBddZ$PHe9!)!kAj+vrd4W$DC z#A{6PFn&wlp-aFtq@f{M-{_{?&DEo~m_Ja25&q+9XO}Yh7jJ}Zk2z#9xe{{tEyW@eFVT|0Fxr^42S?M*3I1_Kf&PJQq_m_W>U}{DpbXX! z3UPvE8toZrzi-AO@a)NgKocLN@&hU2mHO6~GVDnueJ43-celD?J~gGgn? zi*-@dMD5bAW{4p1(Q|uZ&^-aBKSWr|-Fj7qrX~(b+xDhqm9|9W^b%RfWY3OC9iB3M z)qC^hK_+zYjM%%^g_P>7U&<~g>tlfz90Y(Oba4t?DRIS?T7C^+?C2qoWh@)s+Zi%W zISIA^fD>|!SjqjEE$?b9H-@oC=@Fo{uwy@bA6r_fZ}!O3Hig?>uS05QyHwOC!_hk- z?#A+K-2DjZtDC^?GpGjRYxhp;`%R5iCBUK~qe?mx*c2Qd{;j0cqc5@c-*q)2XUndl zKl%7yoIDNbA}<(6bHLQ2j{IpiZ>47x+z;+z6LE9UykFiO+LS_&{X8d?XfUG0XBmJ{ z1tQ{&hQoV+&I;ioTPw?7thIAkTqJ! z2#^8{_^8EZ0>u11wTqn)dSLu*jJJX(FTI)VQ;(tS;K?kHP8eq&oU%CVM zw9d5uo)*u~KuCT*3vegG*OU<1rDax@uRs}dhH@411e=KL4S3;43UtKh%Fzu3)v-bl za{y5#g||6m|65G%E{WR39rR7Woj#>q#-50N!l|lW(mKDM_xk(eZ~S?TM}!s!CqN=~ zvP|TS*YkFnd14X5N5J`67_fc}%u3B3AKdx?yl4Ugj1Y|cdI(49F0_ai5VP*dwS_KP zf&Jep8(o9rok}!SB-hoPS7}=zY1WUAyy&wZMp|BW#=!06b~HX64?zCnzg@Ak=$%%z z!J7&O>Mu`x;0=T@k7URiiV!(w22Uigzo{|Nfv`}-a3eoJB!vAM4sblgtNk$?{qXud z*NW=E3D8tmZsgC96pcY^U^l6O8^D6c#d04WKClYO1J<*F>kjXHzyh>7k@?;)N37N> z@HxunOm%~q7(8Snz?kwj2ZlbzRis~RX74JHGN}UzOwj0A5FwEHz88$z$2s>jqzt-fK+6Sg-kJGCbfWEt zw-F*-5H5$qiD*6*T<8se9o$GEOB@gcUf3i9fE31i|CD)=HxLhLf_VCfPt0%BDP)d zSD35O>(6~&kUSC)=$&Y(_*g{))CX@dUV%_0iI%6+b5KAV>Z=N*z1ZU5`?=7$W`>G% zuZJ2{svhnYvd3C4IdKot+=)((?#W?GnyQRW9|q(IG_Yezrc>;Meo{_%rO6O?mKPjZ z7C{-g&d3UPpbD}9binR(K!gtKxdP?+`iC2d=IKA?i7r_aO>4w!st&n7Z;WZ1v_fzu)%ShOIv z`)64u6QQFI#%N3y47%umdDdOp2=&+zEp;Dg>2;7epapkmGB`b}PXXsAMZ`KCBPx`n zfS~~VSuKH=ndWV`Bi8%+4%d|vXao@jW;?;7dEtT4#R*&sO!ESOY!*vR1hs4EL;xy; z7U+7Cs{YLNX6?Mo6G2&RV*RB%>^(S1@DskwKkaM8PY*|2s6%vlbREm;UK5HiB6tiNL_K1N8;pGBwR95ZZtj0jP$2x^ufh zrqVRmDw7~M9Ikc}Vmq4eNI2$c#5$7`w7^^zV|to8s8Y4d=*Yq`0@ zbIRQ&2_{2#$nK?3;_nuAVjj5^iL(s5j&D13*xyl6b^Q(1L}jA(n}UP+QgP_J4; zG`n3ya5i6L-f_2w;aRlz@;9)k!nFo{o>T)Z2f|x_h8|I1H;7PD-q4C}TTx(~gVTSD z=%4s~?ZFq?O2knRAAMk5{CrQ4LG@)4xUisV^VmQt3N*WqFZps$WZ8ofa55a348OA~ zvwzyier)hc!&`Qo_?yK`8%_amlHp#pSDr&Mg5!sAU^_rGP_=8xs6v?p;|02<>%d+D ztD1T^%UR@l*{7SpBqQ*;nG}Hwy&3@p%aavwyfLMU>B^51TED5lJQ3b>26E?oaFBKe zNr`?TZ>fltEc;vTqmUaEL47x$v?alAh}=$f{_{7f!O0WLhuOhhjy9hWBig}d(*fdi z!6)c7qE=mo-c)Lw;XEngwwsfUEbAQL8t?f;l?&`5Q@eIzmi-@NmQCP8Ft4#q74lW@ zW${K9UgbyIWn+B+B+YbBw|doiJy|@@<)ZidGeLkPMGCwl2A;q{gN_gXPxxyv6+Ir2 z1uu3wkA-9HRzmEj0rSp|_WfV~r_-3PA?sUD$B6FLTONCExs9M?|`1fPl| z;z!&oNw<ntwE%(0(%45y#Z7VX!l1ILLo~u-AnXF(W~kf2RS~v79Q9{q0t$-Rk&YZK>KXd630!w~WfGDtnXdYR&G^ z2V`2S!nn}ah>aQ~hi2FnSd-s|r`;VeE2ygRnF#{BKk$bptx^LZ5qt44aWj3?3hLL)@lH`ltz+g8IuYR6w|6uQS_kUIg0YyvaL>_Qa40^0J_1$ zC84JcY4ZWK?ISz>HbCxf-eZ*bq4^oWHF!BqS71M0Z(Or*d9h-AYa$O=d;`45naqv8 ziWKYh9i+Hu4oVEA&m}-)KNq5(aI6d{GP_NWaEp^bA%1Z?39y`-|-W(SW6P(@jK!<1@FDPM}j~WHLeBG1KXqs*f)lM{!hHp z&(|Aimi9nWA@Ad3`k&KUg=iwMO%?1GMSzSP91d9&_J(j#gS^YGxYNu1nj5&UAMexl zDju4XA;7AxgY+v6`{;NGla9RBFB$kfA1YGd<4cI&4FGNi{(-S;C%N}mnRP4BLI?0~ zlK_u+*|N7tXpyeh2Iq`h06qwC){k3@TJ%fDa3!Mq)2j2}YZIZy$^O};cU0E*2*Z^A zXaX2Ci1h9P7A}Oxvv;A3{U?Ij72FNj&gLJ05*?sC5m2Sze79MNflUn#La;FA;Egb_ z4+HEeYJLjAa~na0-O0?`TfCnivBA!L6T&5N_%(oQo3UFc!Rf?6o~HF<;POHpzIW2x zME{Z|r_KWpL^CPChX1n~XuL}uEjGZ@?Dd82N5#JyV3Jcl;g9^5j3K|b)N{IIIF-Bk z5L=>S7QW-SrJ0CGCOg@nPh>4EL5b&zG9v)xgFpNFR94-eE;xr}8V@Dlr?A&;dzbLV zYcf;lXs;xl@}$neVuW+Y`zF*}2|VLIA!VmH`4X`yMd275JFmW{qdpD2U{< z`4I|W)2GXM`}xs#<4&B%`)_1+6RIkM_KYg0(-2som*QfoEeA$CminGpE&))N)oWp9 z9iSW84l-|aJviv5^k4Y zS6zxfdarz6;KL72B3aojTnr$Kg244S{``2RHYPyg~tbqNNIO;~(WZY|f z6}kVUNk|H;PMt>oQz=#$L_!(=XO2|{=S9~}khf5H2Rsqyf z?==b3-*tYFt>}2dp`!S6H7G1{&;fk<`wLLaD!zXD=%I}35Iv~$66%j?7O$A`{|Kuj zXyLtPwbp-psd?l_Z1OLnaBmMxPr;eMCjg`jmHrssQTf7%3h7B5C64)cbS>V1LoxAG_J^o5`45&aPP|(G48{pz-f!&EYKexjfVkeqQ4qmX77UwoT8`ysX z?1U!o!9ff|O@Ms^zy-{Lii}9QZ<%@)R-6jsN^(cU76gV%jOdajoFB5npF>j^=zVYl z@H(v|p(aH@=mG0Yh-549#_)1&&44FQZFayGA`ug_@NjIcrar8AOG0Yx$>0%iyRw55 ztTssi3LZEMj_S93$MRuioiZqQdUN-%i9jj90(O%U0m={!9lQ!o9#ts?Y;?%LFg9K1BGW z0x#BTCa^X0nr=}V0^e4T3=rTAR9u@EjxJA=>@ps0Eov+iUJHJh8vqMP@4VA2djpy{ z7)qiaaeo@3+FtQ}p^eSH0Vq^%%vzlPIxV@-{k^bov>FTtU5^k6i(jfQF4t6UE#^L0 zVTQ9Sy%>V6=_51jnM-X!wW|`mpXO$HZp8E|sTtKHG_E0#-R_>XVK6SFU86vf#i}$q zI{bM4b0AqjRsIuAn&7>Wsxyw@I{}(+?b>ZByBHJ$@T=_F(R=dEjN%i`zw>Vf2d=%! zIa zLt47%-jw;g5u;%kv{oG7HIUOBhwOiibE_mU`CtXHikCQkt8=U{NR1P$x&WR~$-bd* zeadzB=w;Qr$E`;gXrIAm94L{fJO)FyCpRmdNCCCu?E34x8BJ_lvxoXVT7bNDWh=6r zyG~)>2kVj^#O1BL%T+Lvx*YuOTBbD#_KZUjGbD)i-+z}+g7a)wS`ebnJlEt~v^L;!6P;4C@|fwU&xwBP7`bKquH(lTM?NoH z2uRz51!S^Dh}6OvB|6U&BLij3ZOFJ9@Bjh?DKQW#s3Nn~`Nu%ZDY<0zw5MlAucu()03`a22=#T$-8C7 ztlWC6g|#_I{hr0362uOcD8Ft3=lWsMRyA4)t{)*um#@l0|Kd?wGTT{Cdw;)QBggq{ z#5iPm)hVr|iwb0wRH``d(^`ePQzygQ=5d|g=d0hJuybe)%*ByaE?ZRI?14Qt!*RA$ z|NV;cjtv&u+48e*{4DSl57GSJHw8e4$`BrJGG9df3i{Q>cKn;hm%&c!nXsHMJg{ou z_~QV+9MKWgF^JM3CfiXWjg|qmpl@JJL~n=WPHv9SxM=yB%ilS}y*(EsdqO2|AknjH}G#P6FRv75>Nh%V|c_f3no9a9FL%jRa{Ggpkn z%Gaerg2e}3ODqw9Iwiy;ZtdQC7RPU)*ks%5NgFEIJ8Q)sZ z+3LZFeNDrel26B8T#pp8Hq!B0Lb?#-m+#I?;JoiNCgwaSEr9Em9G0!QN?e*a-%Ey} zz39$#ws3P_Ega8JM>21g;A+@`l}bDn4K0=X%^ULl3KBd$m$d4brYG4%Dg(9Z{eOr0 zW&GN;d~8|{;(o342uS(Rt|zh}=Ux85V)AAU7qnJ`t|= z^}mJ&hG6f+lT{LTB}EP%+K^w`*q|%iE_HSHuJw#$Cy_^{xfiz`paIES(n3`~=FPM3 z(Cg%tl^cxHJEdu*vO74i@w;i_V~e7a_CkTGqur92SG)k2U4PMC*%}y!$rCkmp``_R z=A-Jdh0Zpjrwje?!2uLzj0>DmBn~;HaEjMnd0o#J>&_77)3$V_DB*7%ED!wfn8~Hsk zmGgeezZ`ONesEEH)rg0`H|+|W&j+u^!rbHO{9>zm_jhf?-v+*YA+{q> zAsNs>wIrcFzZsS3tY$ybSN=tf>l#!BXg)$H&)XNYiQ12z>=NcRx7Bc>vX;62`$SkM z!>`C=hqOSsXl{M4ctQAcC(do+L7O?@(*+7$T!rG@xAns@?=Tw}xcE!XNHPEJ9f|g1 z+lEtxR}Lp|EU}&J)gV}Rt3&c0;e|D7schnTyOww;I@N4t6ge!gNs<8@Z%_f=8>*xs zeOD&iR972{!EMFlTmfLn?my-2BN8u1Wtj3NVU9*{ZMAD{=WrP3-_B7wgX0B*_shl; zI4Rhma}ulC#ombQPxNyVQFTvgbvQhys+vzXEA?g#-LZ1p&@Q2Uah z`5=K!Do6smfL`K*rvqF^d|IAG&Y3R^CCwVn&v-m(n+Rs&RBxy%D*^L;i z@85&pR+Z~I;y%epkt>+00+vz1@OJaoc+~*)59a5aI2Yi-J;;8I#=tYX`@au%^C!G# zDbLs)s1TC`s9JT=#i5fEp@V%G`~(=!W*byev0>2$M{7e)9V4Bc?Pt&~(MHGGhpE~7 zFE}j%oo@5S?H2vqi*d)s-q69thG8tvU>-OtcdD{C%D{+>nK0`=p_( zN00|ar?K;i4=KKmPz3WZf_svseOj9L@5;=YkdJO|D=X0`ouUgHxEs$yWmZzXa@%_p zXY8k{hB#Nx8S&8im)Mz(jb_D%JXg8dDG)c~1k978T#Ig)_!Y8;;AMYx*ca{#VLhCs znr$A|_RRzi2jhePp$CwMgwPc<@N%$v_ePH!5q$}j-Ea(7BN{``j*5`=!n$^51(zoql+o`&e^wd3!|&tW+>ArPDlW{j0Pru zsXTO)$yQJ|lNXJi-AfTZB?sh>-r@g1U+Vr+X3}}dtQ7Ssl|kj_ya0yZa+bm(%JJSCiyb^q7a{nI{&P|wj*B9#Z>FoXH6$k>($+a}99`lk3n{r|IPjs@szWa%zV`SmY2iFEX{i;P|=CoX?bwKsA@k#zC9+ z&alsiZfK&;?UPQe=oqia|2#BE&>5BG+Ed1Tf;{R5Y*mohIFU<6jAWm zT2W334bgCA|G}n}lTpt6i~8SS#6}KJcqgBW#nsP#`yp-A!s)P!t9?J7&kqkc#YLYC z4EcUPxpcxKA28%~v;li=^L&l*5!EWK<{D7#p!{i|?%ZjH>ZM?je75$Y)Gqj(>bTR+I1I zZ3<>%(^mFsk2uVJ^{h2~^W81m!UzbM>S(rbOJ|VEV8~%FfW+_=|NB!|zE%`p?vwP) zgb-{b?|^t?PGLgBj0OXlf#QGH;hEe#RlNVUuo?Fwrn~+dH=iN)?pZ1a?oa9k^hh-3RBM;ZVN;Eze!;4=?I# z7MxJMDX+Pgv?s8!iI~C-I2BX<0P{kgU@}X;-_q4I@$1u+*MRJQ(fL$=%I&iOu?opfG24ST8_0hNlRk2}4)ZK4f*KWd4}tCDQ6fB37Kc{RElsNwn-mG$v-c z%Ghf5n!+j$-L><;A(^VE!$IZw_!o)-yr2jC&$tF04_}(Gu|rb=f_c$y`5;3sKK2EP zOrS!r8XNt%OxSy{D&LkH#Qc$+islZwW))_+2XFTI!pN36vHkdqLCi(gDQp(|b=48k zQjA#T_}~HVGn*R>dnXyxNCjd9bCi`TW<^uzAIry&P@B>Cu$p8=aGZ?)#!2_j!`oR8 zDo`8T%M6_IUhLFMOP*C5TQ(lW^*KL3f9bp~Ij8V-imRjS#6!4I=g=6}ag5AJg?y`Y zL>$WK-&tpKrBSl~+BFx==T!$Ljfd^RMwE!H1mkZ%9|NZjZJ|GiQzEIYnP5ONvXKBt zhX38fUS@Xe>Px#$89cm?Tc&I}!mx?JB=@_Hui)B;g1oW1dpOj}yP;csm`~cy*)%Ic zsS-<{aV2&awpYJ_AX7+s!PcbSjN_PAs=EEbJSU6{@Cn2>P@JSaeVkQ7n+a`V?CI!Z zt;CMu6VGhLUh~^vNSc7)lxjSigW}BQvDvM^IoU^S$>pMNihD#g4YA8x#!kw-1vsDA zi}LkNWl^lzw|&c(^yO3zSB_x@xRNm7yci(`FrVj{wuZ_VDA%}m8O;7WkXmq1xz~Vy z(f*@gZsUu}!!-7RY#yy~l$h>L!gWHK#s+w=+OQc8)256kD0wX)!^x;lN8>|vunVCK zoD^>qnb#h^#l*nZdJEJm_jLk&Qef7Ye*|=C>+ney!F5{KgWiVb`S+xCdg;GMa5AJi zI9vo&dZ-K50aSSs;IYUA;bd?)?BA# z!_*%pb-*AffGeOuQd_(_s=gp@FYV=n6Tv{F$^|aa0OzK4N9EzvVwA!(1y*7QIcd+) zgvvh`4SOPs&+!aTaBth>Q$1>M1=tuzF@PWZ;>S`*+CSm5h`pmrPeJ!wD)kE+@MrHY zyI#68TMup>I?rH@7G@|$scOL(|2>X1a>()je(szhb9?hEvi_~nt&t1!s5=;>yjL~KEy@(TNbdV}_u+x|NFLb|b zR$5G&L{J^2nUy=U^wHDc?Z^qs759?h2FWmYMNZ8-Tg8tyb8D%;KDMQ->gm@s#x4gZ z4X$^`i-GkmMJ?O27qu_vl4aSBI4N<%l~O?Q!TW!ykZ7K5i762WjL{j}VLP`aqJ>=L zZ6igPFJ(ZO{sz%Qr%%Me(W(anM`V?|%NDNA0H|mn2@~NOE#jqjWoSL`8k^oq5mRhE znofCIx$ZK!*RU^mK$P?13D!5NU6@79E&{E1rZSh*XI&u<<}Sg1gkaRC6W{dKtn4Gs zcOI?H*y{El5d0%bMh&)BmMY4;J6$RncjUbRxs#I>9vO9UEzOkNMVofvl9au#dVFs1 z!ChTWStv z-SFWg8}FTidmlmw7vL|*oOgGgbR&}CIU&Sa#j5h2TMsmo&(Sm;DbIu8x9n zQ|r0bSFsy#8R6?u^?S2&Y||hyQpel*|L#0_{rlEx@+JL;r2+=B@X4A*Z}G;H+lDK8 zknN`Tp#TH>ZbvjAey!it@xZ12!4HP#z5lA__x{05jlr1JYL6{!>$q^y_^!t=J(er@ zGsWKXx1}e>#_!M-adE8PClxFKc>6WLVIRWZZ6j4?PkKfmU^d`vVnhT{G3@~P!sf0Q z+#qcWGt-469{r`rLgo_tQsGN}UIk$o*v+~O+w;Do6HKj5bhCJ=CiP_X*7o`0u?}yiU6AbMg99EO#^s(FMf(6fyQEqo9&l9|1N-3v?E~IR174u0p zgMtWC!`u~xCGC50GOp8nG)YM>^GiQ;2E-(lMmS5aA$ECjNA}@ZIY+yZ0BG7w` z+gIi|5fu^wClwD%xXTqH>5VGy9k9voy@Mx+Ssuk8T%#VL-o;k!pRb61m{JfJiw()5 zfk>w)zIrGRfMPGQaTLpUD7ajqSJH&WgXgq;CsPzRjGVmc9}CCm?!er01=%lItB1rI zt}IeADXb=TwRin=vA=ve{lFb`7I)~mQ7+!#pF{QXu#9Kels}|bcH{R$5SA=ixY9DcCK#FNT({_>T)Byca%>L|c z1voilrsfYZSjNd$q)cuv3+zj#xm(sb`{8K>=TB5kx_$A@f+z_!H0d4BLKi z!+svbsl80@{eA`Wx(Eig2H(Bu)_|RG!PAd&$FS*n6yZ-?cHqCg;4bOi`S5ad1&`o` z_EGMekC4U`$drgmn@oG(u$L^Va&+H+z`TcmttpomdLO)FZM#V>v#HXi%??&Kyzc~Xi&U}u0rgA@S*c1w#(h8P#BJ<#kx@KVN-CYse}KA z8~nE(y*O4Ck_WLw*z%K(HEyEZp8PhbuPK1P#OByEreVs{&wX$q~{h8iuY0#60|2 zsH}HD9|oln16QQ)m3o z9U-UVYU49sg=~)m*Z7YV&aM=xzVJ1e2pvCn45+PE(YqrS}NWvQ_lRE81{|r+};B?I8g1y9BUZsk@C41+9x9j-$&B@nJb$2zg>)xR~HLU4r z1LDNF^G9|ZS$_1z(W=X5L6CO!+|p4AY5J&)R_c%ufwq4Ovm$0)27nwx3cz(W_QrHlKTjC4jy(GAUH+tj#G(! z<@{W3FZtMy6BZhA+_zP^cL+_(9!ak!{V&`N$HdvUn)iB@9%&2a%1A2F?J2hudc^!T zj`+roPU)b$BC&o#l`W8d_i!^GtjJH2$CC$N!_S9df%{bE0EUwkI0nNnM4l-+lVGU8 z67jJPqsB1h#d(x4Bg| zvs@+uP#t^QNu?sDoP5ex7CtlhOU*#d_xcqo6sj&W*Xqu7ogG5x`+fJ9`qd}j%YJfU z!+q1j`ps1^#tCeNf*ExaB#G;-zA8NJHM{93R&upm9mG8Z|)4(f+W+2c+Msaui7k3fCnN}`>S+-8{i`!9>OXVbRur?0m3=1HGj z4{n8{Mr$CdEddYR`Ns&_H-_O`fy~DZPp2C_cAGv^$>b87)MP`XsT#swPfVa#lhUB* zDPYOb;yItjiXId^zqGOUVhrszhN&CVa>%{ronyaXPJ;UOgymia^BTa0v_yMyJueH? z;g7jryfgHiNzyWBv-(3S5Gd7!t`PltDlUGZZO5<}%dc7}&klL`!V+--e<13}AlKu* zH1x-a*+I=tBe@}i1!_q{t)i)NIzxW1Pz@#y(~ZKLFmDf6Z{<=drvafayp1k>l9=K1 zDPno+cX|;nXI*(=Ii0VpS=-AaJe>${EE%&=51T$+)0)957|Q-W-29?=btY6;>d*=E zJhqMehY^pjgKOBg0N|aVwtWP4@4~D{Hip8=$&6XU2UDQRe$^Y+Gl2NqoZJ;5K-g+OA9Pw&H7$LXEUm*y7U`A@ug>HiJ#na zUpkSyBe@?5LO;X6RyhCe+|QS(>||kMI9U^9^yIUv?Vt|gnc7PqurLt+K4%IxRA!&S zp3%u*RWA>|7_(bVuxRYs866MiUUX^U_$4p2>G^==euBgXUPNsMlM5@xbM)2sKT9-Q z*3Y{G6z-F94Oc6~A|i`hxpr(?Zq^eC(Lx(?bE8^QSAS&TS*Ph#(j+6_B*Gokc+-M! zQlHx7P&DKewu3Z>#-;oKdY@2C+2E6};@C$F-P9OTk^Ipvv2}sy{N+hWL)$kaW^K#k z3c*`1R$-@Cyrdt%x42dL-N1Dd4BFIzI;%*LdYIJ9SYZ$29&=I?bsFmaXvDALSBpPh zUyXT)kN-|#YS9VA3*y9m)$5*OMbz6^-5 z58ry%3g?E{oCJ9EoxD-q1o*8mwkHy%~FqFQPDQRo0U$cFA3i>n|UI zC*AeSa558{ahHRfmoGh=uA9~yS+xGa=?#Ra^Vp@u=%8og`dO3mkOGlU<#_Y#rt9~{jlx&+aVRk)3-|T@FAKE2?I4w|ucwoUe zKeZ%Hd>nH%=Cyb{Hzy%nNT;#uCNv|u7`ZGCJru0DETGH$vHhC8SlT9AIo06~k?v&* z=)kJv`LOxf)fYz|8jcIodjZ;vw+}(DNxq3k*kf^2F7%Dc zG=q*F#G@-Cjd(nQ?U(P3()m@pD(3dLUb@wYn@VcM~jIQDWren@U9Ct8d#SJ1ZmwF3^FN3+Y z7c>pXM-v$Na(MCu=WzqCUwrk8na{SZWp#$XgBgZSqsZXY3!-Fs-PGMqkYnAKy)`99 z&7ovF#_<+=he?k|k}^z4yEEyi`B)i_AIFO=4mv`XXh1E88I)x3$SBXkiES>y?v4ar z_{czmM4jMvlTz&Wi(H3=kA;`8Z-3U_8JzPLl8>xaoF*aN7pZ)%s6gOx_p8-fJ%^Lu zKyQT>o_|Z)lv!zm!B5@U z6-ExeVN0mAse+0_$WuNXj{vSnLG0J{)yN%p1VSn9KA<{@E}@{=c|=#OKdMbzOvmJskW_mYAx`eRvaAc2xBd=LszxO zF|8B-y#&!JG8w~5hp}T&zxZuT9{zqyc=5F6_NsFh_h!$l-kiQW3EUeOv~_cvg79&q zV)n^`+Z&l$Hc!8ja{oxJWw8$-@_WedZ2uO(4yovTdI;=54}v5GU(cI7Y}*|Wf?~qA z&Pc77_PxghCXDaH5O30;jy#CIY1`oEao7}e#!a-_)<}%YqI#WnWhfJkX$_0J z&sjCk9KJTGhH^>yN?BG*O7Ir4izu^@&xrs05u-S>{_aiO z1eIg>K|yDTS#;RJ#pu7vzuQdFb9)t%V4E){eu^ja^v)Ef(0K4W*>7_(SK*RN-(aj; z{sGk|p*JeKIf!01b-T9vh?p+hdC+^Z!&E)Jv2)J8OU+PW2`=`;{;Rgib#IBRwq_!m zH3!%C#CBFq(LssF&taiKWCL@?5wB9$I;K+!?699WKuR|p8wdJ7MqklxYGFSc!$fkT zRbg*tAE7WEckTL%?@8(F|qm?D@^UJhLpv|&Jqf`%8;KsCEIN7X_- z*L3vp2*sx2!s&4|g&3z!EEzlP`%>^DsAo#w5BOCYjb{oz^H{te!26d>V5Ie6nU4kNo zW9en!gca6&Zp29HkWueScoU6d?%}*Q`$px{eU*6x*ZonclhP$ddbc{~ZoRK({{mig zYamt~Ad|a5GKAargpp$x&v|z@tbxUe5|cp=xy76qN0P3i6KXRh&+KR3UQmi#oR9tO zy=BP)1_N!ml9EQ`k0cP;KA-pZQ2_aN3agPHcK^~zKua}~#jEG|>PxRTEITlJ{$IOL zoi%jpxl;p}DeKfP((ph@{?i)rs+5YLe;c|2$uNB+BRU6UASC#3S;9Pb0tF0`>cWKZgDM$uCR7U_o3>gt(3Jl@^wMW~3 zZa-d(1)Jg17?PMXsu|pC#AvdhO-C030-36NNnRS&40uRRO7ws8IpF}OmgT&||Ei`F zY0E!(lweYIU&Yn(<=bY-{n-0}Z(Qc-DAkVQ;OQwym*qy2XpJi19ri+ea_?-FDJjRr z+@=~0Q()3uy7zUPf;slpPR~6Hc))Q(!to7BbkrViN2pTKM#Z2=rm=@MGt6aDE10i| zZsjw!DHDsO_P%<$$@!_;8lr|5&eHw9+$S@sv+9ar62>FIB!&N4$st1k3a;e_54%@d zumtgaFVDOJ8(jrv68wZoYpk*DT;$V+22_5*UF55j+~`s4c5-ggmUZ5qlH$6={BgST zojLhFYnLDTS4TwHo6oO6{R_A^TL_589O8u^Y9Q)2IK{FBGsRdN`?z0=Ai4A7wsuge)8AlOoDoC2JoVe4nF;!B3ED(8iu^lW(`&zTw2aY2o)%Te{>3V_-8I?z9P#nv&-dnM&dyi9ra1RG4lRmzd>-3StN&!8 z&{bl~?lQmZEcQL-NERa+7?H>H`%IMZj+~JJyl>8#I|;U9JYNboxZ>3qzJU@Yxam&8 z$Ac;fZdGn|o_@^oefn0aoI~*~6FN;qsb*p@NPO9~|F!W8XWJ0%%6YEzjp-z%zEAor zpnc@&tJv~ZV~XzFQgzPiYHlA4{Mp^v{S51xj8BDnD@n-wkFe`e9+FZY;=O;^NtO3d z@5%0HjSViR#=V@%a^*N?o17~hK}>N2GHUZt*N{2SdzkB>qILYtr z;!?%;hUt(+Jqzq_D*WH%NSDIunC<;a?1gvi4Ny;SsbCKuVM%#F{~GZJddTdpFak8B z`?cNUVl&-lr`P12XE`3hUgrwVpkL^wj{0v1+f%OK|JU7h|5N$@Z|692>~j#(aBPyS zkdbrD>{&>0R94C;E9;zNA5;!1Bn~B%LS{Baj**qfmYJ<%9*%RqxA*72`1-{UJns87 zpW}L7*YlQWr!r4pUaoq6jxY>H3{GLC8#x`nSC z*lF}K$jqw?7>fU3U!M1N&aX?TdJ0{*-b>sCcq=e7X~1DLNpCX#HGaGW@;rU?=QtmE zj@epMw1>m0EVkSr&;aJSU`D)=e53T)h*0t_=VRJ3sEU1tl56ssR67GK=eK2>ZwQqd zHQf*`;CoATQ;pO$%vs5F*V>@|EP!fvL$xFAh*rzGOl$gQicLSbikD!^`6z^w1Dh_V z)0c*BM|O1f>F;KUs(fjN)LtPdiB1Cz`gaL!IyZY_zrEY$UFK>oW60hZ`AGyy;KiEi zkTE&EZ`+Jsja*BK8C0VZI^cgQ0ce>o>V z0*K)1RjY}nir0fk13I)n0cWj=M2Tk$A)2HuO}e_jH@OvEguB(9f)kWHQ)ROF3geZ) z(GHLpbD-#LA0h_XMIW7Bce@oG^p~sI1`Xnb>Tq+}tgyUtjcfnjb`hKcFtWin9-1>B>D|D1sPs*z$JkY(BnY=V(37P?RqJv- zgK|Sha8GgYTn3mT(roFLt{^OubH8Ff7ceD$1_~m$-S783)KE@|IrU26SPjF5n&je7 z;{9hrAe*F;f7m=?@@n;|;}TxFfK9V0b)%M%Dn@B)0e}eD_`ky ztM6ss@RQ?@LlV{nP{KJQtwey-?D$*P`UqfAM&FbE)Py!63Z`O#LYdG_PGwD>u{<|C z17%B}xvUUQt46quD4WKE`r z0pYVQKtr^Dlqa-WbBXO@{zicqt}FIZQKN-}f!r0-h;VvO48VU&z^LP%ify%?Yym2ZEf0n^8Q< zdR52Tm^r#va#MJhLzMB0fwGz8rh0{@1Qn_sLKQ=RzvMSRQoQ@5z6TcuxRLu4 zw23>X;H86qzDWhz!~AmZg(T*X=jg7%2=x}B1)+671JE0BKPf5K0#)%0b1$3@P?}-% zjW8g-=Wkv2F?buUbFivSmb+CX^ze|&g@nXErQRH})T4#9WA#VQwksd~>ku--LZ2!! zvBopddKk3fC~I%?wdHNrC#9Dsu(?MXfe(BIf)aCL<8d7i(Q*v?k_m9eA`A97AO+qs zjZ)h{-<8Qt7~1K$BUSv~XJX0f`F2e-(9|qoHoSwHtdQw=yP2DLdDlnnOG|K(gmNU) z0PPle_~o3>9*+q2%x+ZQZ)=>TJI+!9Fuv?HBF&$o%r}~$<+H+UYkqjBb2Zd659&NA z7rdb_4lab@eZT-)BW9x#JT)a#mmZ^~DM3#w9uJ2R{@h#1|8@9}G-U~*u<6sr1CO2SrAc1W z8oRSQq;xIf7QC4VNBn?523eOcb*wr!Q35wed@T<(#^38Y@f4gez%av6=Jv0-^dv4t zWJsSq^(KQs(%UC$thZNpXv}?+Hmh;NjUk+Isyy2Q^L@_U?1aX|k1q@b>+3k#MTu{# zx>>^N9YTPLU_M0);B#5iR&9~iPV9~kEJ*YQEcWQ_OU$p3ha}?EO0PK9yKZWO+n*{5 zV*)I9iX1<)v^aQ`3WWQ5DB~$gpikT<;M%DKd5&tsEu-V$*H`25J`gsW&~LkJHq)d} zW&oaU^_Wan33!zn|H$ySzH$;Wj%G@9n~DG=LpDlN#U?+UJ3c$dZfEiu0v{+uTWz>! zXR&Ai-9=9<**5k3Sx}?p9=!ivd|e&OL@8gxyaUWQzJwo?kk7Obk9)?`9mw4KIb7Ml zlIO|Da{lK-#)MlC08|K-*w~6q&s&hETL#(td5X0HGvY!9Wi0DlS|IFRJuZ{qCV#azjP#M9Blg zu|SD?9ul|^@Jyo+1uK0btT5Quz&I4Bya-g~#b^UE6W@b%?=L&6AN~KrUO|~|9SR{< z)@%$ey=xf>4RxmPxNi1Rp!R_mqN~>0pqGzNl@NvN<}AA@40KlVm76kWadl;c$vlIs ztSlSTTrZK_zIz}_0k#dw;OYk1WM=B%2RU&2-EHqQ8)a8=81jqVDc6?C6Txw^C+y{a z^SfjWA@M=OeaQTs?9uIq{Smr0d({!aagoy-vy8_)GvDPNbHm3N?Xor4~U)Q5CaU3KcGx}kGy(U4P|8WI>V08g+Q|56F9G$hw9KVuS5-RI8oZo+wRG0TC zs4$aH34}T)PVb3e-$B5BcTydi6K10jv`+9BLZeW&+f>X)Rg0ysBG&2%F(XqS7rqu| z3FDV9xwSszYg@Ptq&5x(ZC9r5q4?GadwRA?=&*Efyd8hbhg4l>Ph%P5ms7@@0GsXa zwgsVz0eIoXtaj6;p0(Fk%$XCk#r3Jy?fL}60|7AZ@} zwPD${)v>zC-_3@JD@XhqbI?++A~&Ei3P8)zEgMM@z(k~(+l;vpW>r&iDli*De9EbxlqE!&Vr-L z(d3*mVOYoMXH<7lMYp!o3WYfyASv4#?gt4!xU9sHtQJ43y|j}wgWv^ zO3mp#@P$RA%;{2PbNRs2)n=A{dbok_&36!3a&4n#_lD$W>F&#Y=lISpamZM(=gZ>r zo&eS#Y*_O-Ww(h~Umo>po)no0_y_CHzH+mQC)t-WhVOki0;FP(sbu8ndlWQNZ*Go2 zH=~`U_#`<^=3!q_&+7aI*qyOAdwaiDO17t$gfk4BTYdW}2r#Ko=JX9Sr*A!pHh=Fs z1mA&%KUL!L2O7&(a1n#Kf&l{kI}-BA@WQa{DA}7;II0hMgM___b-VQO$`!CJQP806`&7H`ZI-P{K1Fn@i^PKb)Ln_K2B54M0kD&V z6M{MZguUTcH>90^vCEa1s&+K2#>m5qa{fXoa$`K5H>&dfoX&azn1sG*L|)`P09fzG z8@K-x%q9wkw4X@Ln0QjVG2s2NW5`L#OOd3*wJwsY>F1nqB9Q@3z~)ASl|>Fn&*b!4 z4;A`}LZasc`+39y zQB};OFhC!Cs~{dB=K%TjgxbW**yamVL1L-#IigW5_T}i_Q$s}XcLC(?dT#YVbMc*( z6!FTBu5&&YtTe}nQ_Db7hN3#dEsdW+3#|yyzJU~b>h-#cRP;tje*~PbT8D3R@flG6 z2o5Wih-awMKW-v|{?swWCehiAiOL%T!u}-r+Swr^cZZneCiPSeZ5DD#E{3rE4TRZy`UJYA4<#xIRiopCftNo~~q+1g=?%xR1WKjg;=dH&e^ z=May?X)S;!fZY+r3huNA5702`BR-82fM#=R4{%kIUYWnn7_2kIZ~8YKl-228B?rIT zK$mIc*Xw=h6}nG@>M7tEg6kN848$%OTDn`*U%X>Dn>A73;2M4LA*t(x;V|ocAo{oh zIwt3M>e9-T8|hzK2roD~e2L?`vt~}0mTlzBReqx3l;M*IZ0^5C!~Z=r_j8M@S_VT| zZ22o-Cb9_dlP@BuvHJR;pR^Nfb$Slt%hk>6N2Qf{*DcEppf-0AJPJVYM@f7|bwF}My4OTz{d*_7#wu}JpH~V(RYrIfe*uM-R)?SNTPND!-CDgKuuleezS5@4jCIg zcwC;{pnMQtTgx2&I~o$*kJSEbdkV0$VS=AqVuoNyE>5x)7G4UdY&*~{b8;q>Bynl_ zb&lL&_7#h@_6(N;rs1*Me;g}AYmCLul9Vo5jW4tlSJ2vlY1E5W-k-TrkYFoz5uBsA z>G+qX4mfDMzh#^gG{le6KSp=To&^UJzlQ^l(j1{`#fupBZrbO@=t%!%`H!|`OHMP} z$t?YO)6e-Kf@gEzl}Gt>oIkWR?D>^|kLAxBjY42m(xIL%H;SuOHwX z5*Y?WfS$N>B{OqKqoFaR{|g>SZ)J>m>W`ceR8$vVqw>M?+u65obP_FSw+fKhTD15` zR*TP;F0gNU2(U2}&rqd{8{FPM3nqtwu0aO}0#l1pEZ}2+IMH27v7v|XnVSQ zvgi=f;&TrU2vEp$?>XXT@N2mnoBD1P<~DoGgDYSEes;H;aK-+TTWJ%;1n*#i&5v!Y z4u>9th73;NF=>;tQO)w|GdToSCCAe!Gz~YZ3pO|I;d_XLQmo6AF>lYf^9PCMQ;k6&}7HOb#~ix;*D2 z0?%G;S3bO+I>Dslg=spr9W&fu;D{jEfUCTK8sg9KaAHt~+7{Uj{g5r~`HNHdE`25c zM#JgSLHOTIL<+}mnX!w7v030w{C{&5k;Gmo$`c#m@z$RwNJ=@hs=!ttSM!&rQ+dt8Q@ z@BrnU*LLNOmSBCE@Dq`@(LooNT*mxQ)m zBuW)+afz?f)T)TJdg)C7B>eY7kmW>^*%jKdu*r^JJlbloL=+xKVXNG~-6<4-f+MQ0 z6VTjJrYg-(D4l%2wmWMznE$dr0P^pbJ+~LCLwn15PJQW4E|xx9V!#&Ln07orU9vj| zCiHRujVZ8C_B;7l%^oDUQ(XO{r)h}rA)qTH#obV3>W`e-PhQl9pc=n#vzIEVGHD-Mxj~x#xUXy%}M0xV&=^%{8b#Mu| z$H$&q?bw;L!>qEh5&-GwGLdQD22iM;K#x^cmXt!$#^P zE%Fxa0)-8Z1pGv9?g&t$n|=xT5*79Q$BDVq;-=;qWbrjTY;)Dx-MX&dAgxyaX8o$_ z)cQ}tb@SjYMm!8Jc9v0kh8L_q4|ohaQL+VLcgv3h!S;uYShLWXR%Ix8jA=fYv75{mL3|I} zWGk*lI6wLK)LY@DkAN_$I>So1v`cqL0b!11s6#;kuSn!ZD(?sPm8Er0GXwIydM^di z^hHA#})X?T-0Av(`Uda;&b6?RrK1VAJR^r{fyCkP#j$zrB!>7`->u4X+$X zzW0x)g>){VL9!@7mEvT-gK=xQU2kXZ~7jcHUnUl`U@lB~<(ST!^{5 z2rWLp#DUY>ce1Exo%L?o`3TJ!{)B^*?+z)PSj=Fr(CS;#-{X)M!Frv0+5$G`&iKWT zabJUJS>`4mLdHxsyeM#MsaUn(hvB!`2>8McmwNdT^~+%m{?D3QCuZParg*@;0Q^Z| zOv*(3T|73;-(+gD(&a(P6^PmAZZG8IwrhFBf#ihxQjgN^$I&c`=@_5Lgq#a`c6X=C zZ(ru;WL)d<+r=UKA~+(4vj)@e8jy}`R6;EixtEK;5~29QSY1HF&U_tz7DN{{9#MX#qt=ZObR(6{o$Z zW%mkOZZ9&dK^fyZ*Sem|EFn6Oq^tP-nDHZOgw}&k#I+T^*w1`|aLAaq!cQ&YP@P6>GR^_3TlZ$p$yf4u(uBd~EN^do9Xr zl{aw1o9g|W>W8#wQs`h#tUutW@BlxQ`T$oCtcM2EzH5X!*fjzigR?b~U3moiCstAib&KKS9e7!RaTXbczzE%YIE;MAW*K8~GVMAVH(`1HQ zPRNhaSo75GoL`pT3L390dzWp$A6k){n5rkaR}flz4UPgJ14lYa)cKvAyMw^iV7|cm ztPzmkWej%EYl|!qI_{A4yG953J0Ix}7S7qb8<$6%D9|v!^aD_R9)veBiOEdsm4jyk z4b7tdoUaPQdjavBofWyDzfsck_iT&aq4za=PKSQjK~H(qF~C3eOtHsf)PnxePa_MU zxt7*k7_GjRvd_V*M-7|d7o1I80_;$(q6o_4Gi+Flw8u<%E)j%>O$p^ZFhG=O=G=AY z>CL_VN!U!6eFhAOGS&rMGkyX2z|}i~XR5xl82C^$Z{e%B2f9)J56kmn#-smYGWjU5B9v24#Up=6e&C7oqdm6bjv-ZkX=)+z6Vuh`d*#Zh1&%dn| z>Mt?M#L+7GTw})uzxcq>@eQ7-11uuo^e``M_zErcbP(8Jl*ye>UbiOO^R0HWwXSTx ztPs4DK6>xX$V85PQMK5k(?G!Vbnd&iU+)S+%3A@|$@8bIP2P}(OsBf$S)`F+1MXSW zmDl&w-tRp)eXQwJajxiaq+1?|o^uRHb9ijG;@DMsOY~C;_vv`57VQlJgQ=z4FZqxRkD@`&-@8a!p)}&^CW_|lX zOlf?;-Ji_eLV8*pjEN|H?6V{yB60%bn=xIN00_?`jj%G3ZOAFk$b9?xKmniKk8RFx zl^UOt)8@w1&d~yxoyRJUb|Qe4a`}fyq=* z*joe|I(VG`w|st5ei+F6ulHSCdvn*JIN9r`V0eAqaMsmPmQxD8vhv;3fQ^x=!4b1S zSYQ9QCj#jtJZRK5y>&&*kkWV@|LUV?VFOc3fCs7RAG)G*kmugi?tkCekRDKU+h90z zyNEb9Qqu$W+xQS}>hEP(vE!&i5_&DQA_k%$@?9DFWSog6c)o?-HyA+kj&(@d?U~|?}%@Xh933*D|y!KIj)lysK}gj_+4Rroh3cgsXaTr!yWOjJK=$k zgob~~$^AnA{@<7jud5ud?klF6wWx$n#sD=P9Py-cHH`c;YJuF!a8LGK5nhz&!3ckJ#nwzo_Y}{f#3r~b_IP>AzU5d> zfR^=W{}jvI@ffnxlIH|V-4ze%Sm?!+0imxjjMSErJCx2SOa;Q{4A5QEflMw%&9$E< z8$!dJmF^=4!vd~<_w6Lf8rLGXYhtx{dKP1Z*8Jl3NG4l;W0d^`E&bLcDBE&XmB5?UlH`8)XwVt>;?o~LRA9eh#w^u4QI{0?pu8J zvcCKLeLMO}ky4Xr&t)f9(Qwzd;oh%^Uh_O6G$dgk4#Z}k1uPAq&>!&WY8XwNQtyK* z48 zu4}a|du`sTOA<4Y2f!0$zOpws7gmpz+-?h0Obdpni3UkC!IEJY6Y=_h2J1CGdjcmQ z`E;43KXni3eR`yD(V&gnXr9Yq-Ow!E)SsTr{%~1yK7+Wc++b!Is-A%lj^ali-1W% z#3+ZEFW>+)1E!K0kTT73@X|ZYhAaxs7k#zZA{CKia8Mufo zW)LLrd5O}Wb{Em%Z&2`>MbZ7sBgya9JHTfLB2_VQ8sX>x-bS{p1{6NK!fE$d9XxEB z$<^IEC(AR^%Cklh|g7guP{dti09*$s#LyJrwFh#4gn6i@C!>kmY zohrpoiP+@Y-Wxv70f!W&7Vj@ODU;qgu1NzvyowUHOnji$y6Ln6H@E@BT<9PHA959d z18@p|YusA%V^K@7)l>YMeiG_Z0?M#Ko#1~;X@9X>l{B^fop3=x#P|n3+CN?(1cu*`JCmDro$BCjTp~&j!TGh zpX&8B5)7wIwLOWam)L&o)JS76Uc{9JU{MkyfpQ*j!dXG$F$`#S-#w1f8=&AjxSJw{ zvhZ~g*m)jkB_E$TjHHI8?iATD78qxpbr^d6ck)J%f+%O8LiFQ`d-#@+WQU7F$(}V>G1z%kvEPKc`(4K z>K~x%a8;=486GO>`9`!dKtyamjv89F{*pR!`^mIG4@?a%D^orgBHi4VFpDHS`Ak0}AvO|GGrORYn(m7H3nmxR32u zn4~a5P6pv3_}orpy62>G8_v=Vmw6V(4Y{RYNkCXS@EYb7xyp9vsYk`WPzR!Mg)g^H zuR-_B1Ndv1my36ygA>am*HyEHf9W<}**4$bDGn+&LLPO=o>2KR`N$*c<`d^HK(op@ z?YhqrN$DPkMu-30dI2!I>#yd>sy@)yk3ZtiLPmE704ww^bKldZcbp+_IQerb0nH02 z<=w$U58sTWa?Y9wRi3_okn=+-H58yNPk90-v=&>~;@UKQuoxD)oV9t|DT;r~fpq`T zT3+3#TF$Nx06mF*3@hSL@h$9&sAt|i3S%7U5)H%DolD!Sv1-&*B36lEry4C2(An=T zoGOxz^D~&f6l8xT?xZV|y>RmnR$mjy$A<*D6Z;vU^-|&7Rh*`F&d1zR`N(Ouht1h3 zu9zyi$zG6;V`9Rmr)P@%mG?dl3`Yv1GxL?Nj;a)?wM;evtfDRl1%QrUpjI`Q-Ct_< zV~JyI=+#7N zT#%^}nMw`wp{-Cl_wpY2`&cvlVbiCKS6#_9B#MU*^|f34^D_&7$BN%Q`Ds!AINZaF zz`)cV0Kx&2je(tPmg5d=MDv@yQks|F{O2y=cQ2)NNx3^&+@YVEQz)=3V4hC>V46plMdd z+$SJ3VpCs7`_7+Gq1@p+w-{PZlPAj~P%gb@i~KJ)i#8338hLRh2Vwlk{QsPySq!f1 z&a`Sa!nq9ng7HNBpQ$rq722LEKGOB+oBZ3yl*jlKFw0E6)e^( zc@P5DE5WZ8vB9)dzq)4~j(3EOI~{!`{O`UM0-1^dyVT9|zzusLPN`$#jR)sG0LifL z-(W08O(#H#E#(QKg1jvF$Y=E>qT5$?m`GU`n<20F3S=Zd*y-)ws>Zl7MVFX*qHhdb zJ>F`lG9M#=mxEl(8FeCYCz-~}BHoxrXx?t_6@;=tiVb1hY~<)D#jBIUf3U~~Ftm|# z@dyfUctgt0>?vucP&!4ak#EAZmgrCNj(6piIOO>cc2XCo6gMQH4Dv$kD+X*U;M)dL zz2AHi`q6Njm8sZ%n)O7kO*QWA-;E(SBH(P#O8){}Q}xwiil*v^#o;xXlduUHk+5JZ z+OWZaAr%Tl(zhe0CB-2vC66H5xAl%km%!MFD(vBbQZMMpszquWYLYa_v~%>8;ko2c zj-HiSo_b5YUh#vkga+6j`Ul7#dUW*h@bErAV7_e(NL|F7@N^^H2siERMD~kmi^Y8}EGJfNwt)B-D0)K#$0-3q$$~@-^HRctu zv2@V>jyuUrhUhRkNkqu;eR=ce{* z6OmvFg~o$|BT-iQC_{nGwiX}Fhs{6E`Nl+Qwpf~@GV2ZjKS*!PZ{#)20Y!HP^eu8?4GL?|XzRKS=GA6Ifk2fd{VvR*tV z9GRBZX!mlJ?ex6p|3)6idVJe-zT#v!S-Dwsbbuin^C8Z$swXrKm9XL+;Wcc@^<{eW zRBmJt@Dd;=HDD+4K*)L#1bKoaY>tH~_;`kIN@O>7NTEk`8OR7dZ?2aQ_)i$LpB3WT z`gIr@8yT&uU6509(_V+ZB!fA3JY1B=N2%i*X?sa3v~eL6vvvr?RlpzGwBgxAG2}~9 o@*Lo4kKg#;?EXLg8idffl(fGdy?RwD!2tXi>6_~n>o`aLAN8Nx6#xJL diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..f947fa4 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 41e15012751d3809ba2262d6f0d8745cfaa1ebc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3280 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 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 5a0f3a69ec301443fb0c313ea2a790bdea286b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4619 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 B-24Cl diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index cd786c7543c18c6461883a0aa43fb9be06f76798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7761 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 Q->4XXP|%RClr<0hAFv3og#Z8m diff --git a/app/src/main/res/mipmap-xxxhdpi/Thumbs.db b/app/src/main/res/mipmap-xxxhdpi/Thumbs.db deleted file mode 100644 index 31ceb236e145bfc1b4d9fd073ceb6eaf4f653ab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17408 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 diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..8c3a0e7 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #8BC34A + \ No newline at end of file From b54b99f84e54adf935363e91520fcf0696c10a6a Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sun, 10 Oct 2021 15:00:32 +0300 Subject: [PATCH 13/76] #22; Fix French translation. --- app/src/main/res/values-fr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 51eb90d..2d865dd 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -88,7 +88,7 @@ Restauration effectuée Attention Êtes-vous sûr de vouloir écraser les données courantes avec celles du fichier %1$s ? Assurez-vous d\'avoir une sauvegarde des données courantes. - Restaurer maintenant + Sauvegarder maintenant Éditer le revenu Éditer la dépense From e630e771f5647879aacc4401d051a9c2ca085220 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sun, 10 Oct 2021 15:09:40 +0300 Subject: [PATCH 14/76] #21; Upgrade Dropbox dependency. --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index d9ede3e..86f09fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,7 +73,7 @@ dependencies { implementation 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts implementation 'com.jakewharton.timber:timber:4.7.1' // Advanced logging tool implementation 'androidx.constraintlayout:constraintlayout:2.1.1' - implementation 'com.dropbox.core:dropbox-core-sdk:3.0.5' // Dropbox Core API + implementation 'com.dropbox.core:dropbox-core-sdk:4.0.0' // Dropbox Core API testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-core:3.5.13' From c692374fc3065f89eaa7ae957b15c6c7e2e8c956 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sun, 10 Oct 2021 15:13:52 +0300 Subject: [PATCH 15/76] VersionCode 36, versionName '2.1.4'. --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 86f09fa..8b39c53 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { minSdkVersion 21 targetSdkVersion 31 - versionCode 35 - versionName '2.1.3' + versionCode 36 + versionName '2.1.4' } signingConfigs { releaseConfig { From 72278bdec2a50df371e9c9990e054cdd71e9e6fd Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Mon, 10 Jan 2022 10:40:48 +0200 Subject: [PATCH 16/76] #31; Update links. --- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2d865dd..6893338 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -101,7 +101,7 @@ Version %1$s (Android %2$s) À propos - Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn. + Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn. Champ obligatoire. Impossible d\'être si riche ou pauvre. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9008578..2d3078c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -115,7 +115,7 @@ pref_about Versão %1$s (Android %2$s) Sobre - Open Money Tracker (OMT) é uma aplicação contábil. Você pode gerenciar suas receitas e despesas de uma forma fácil. Contas e taxas de câmbio também são suportadas.\n\nPara nos ajudar a tornar o OMT melhor, por favor, reporte bugs no fórum 4PDA; novas ideias de funções também são muito bem vindas. Pesquise respostas ou inicie uma discussão nofórum.\n\nO OMT é um software de código aberto, então todo mundo é encorajado a se tornar um contribuidor. Não desenvolvedores também podem ajudar. Por exemplo, você pode ajudar a traduzir o OMT, fornecer capturas de tela ou publicar sobre o OMT.\n\nEste software é disponibilizado sobre a licença GNU-GPL v3 e o seu código fonte está disponível no GitHub.\n\nPerfil do desenvolvedor no LinkedIn. + Open Money Tracker (OMT) é uma aplicação contábil. Você pode gerenciar suas receitas e despesas de uma forma fácil. Contas e taxas de câmbio também são suportadas.\n\nPara nos ajudar a tornar o OMT melhor, por favor, reporte bugs no fórum 4PDA; novas ideias de funções também são muito bem vindas. Pesquise respostas ou inicie uma discussão nofórum.\n\nO OMT é um software de código aberto, então todo mundo é encorajado a se tornar um contribuidor. Não desenvolvedores também podem ajudar. Por exemplo, você pode ajudar a traduzir o OMT, fornecer capturas de tela ou publicar sobre o OMT.\n\nEste software é disponibilizado sobre a licença GNU-GPL v3 e o seu código fonte está disponível no GitHub.\n\nPerfil do desenvolvedor no LinkedIn. Este campo não pode ficar vazio Você não pode ser tão rico ou tão pobre. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0796ac7..3c2b2c3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -105,7 +105,7 @@ Версия %1$s (Android %2$s) О приложении - Open Money Tracker (OMT) это приложения для ведения личных финансов. Вы легко можете управлять доходами и расходами. Также доступны счета и курсы обмена.\n\nДля того чтобы помочь сделать OMT лучше, пишите о багах на форуме 4PDA; идеи новых функций также приветствуются. Ищите ответы или начинайте обсуждение на форуме.\n\nOMT это проект с открытым исходным кодом, так что каждый может помочь с его разработкой. Не-разработчики также могут помочь. Например, вы можете помочь с переводом, предоставить скриншоты или написать статью в блоге о OMT.\n\nOMT выпущен под GNU-GPL v3 лицензией и исходный код доступен на GitHub.\n\nПрофиль разработчика на LinkedIn. + Open Money Tracker (OMT) это приложения для ведения личных финансов. Вы легко можете управлять доходами и расходами. Также доступны счета и курсы обмена.\n\nДля того чтобы помочь сделать OMT лучше, пишите о багах на форуме 4PDA; идеи новых функций также приветствуются. Ищите ответы или начинайте обсуждение на форуме.\n\nOMT это проект с открытым исходным кодом, так что каждый может помочь с его разработкой. Не-разработчики также могут помочь. Например, вы можете помочь с переводом, предоставить скриншоты или написать статью в блоге о OMT.\n\nOMT выпущен под GNU-GPL v3 лицензией и исходный код доступен на GitHub.\n\nПрофиль разработчика на LinkedIn. Поле не может быть пустым. Вы не можете быть настолько богаты или бедны. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index c2312ba..495a091 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -105,7 +105,7 @@ Версія %1$s (Android %2$s) Про додаток - Open Money Tracker (OMT) це додаток для обліку персональних фінансів. Ви можете з легкістю керувати доходами та витратами. Також доступні рахунки та курси обміну.\n\nДля того щоб допомогти нам зробити OMT краще, пишіть про баги на форумі 4PDA; ідеї нових функцій також підтримуються. Знайдіть відповіді або розпочніть бесіду на форумі.\n\nOMT це додаток з відкритим сирцевим кодом, тож будь-хто може стати учасником. Не-розробники також можуть допомогти. Наприклад, Ви можете допомогти з перекладом OMT, надати знімки екранів або написати у блозі про OMT.\n\nOMT випущено під GNU-GPL v3 ліцензією і сирцевий код доступний на GitHub.\n\nПрофiль розробника на LinkedIn. + Open Money Tracker (OMT) це додаток для обліку персональних фінансів. Ви можете з легкістю керувати доходами та витратами. Також доступні рахунки та курси обміну.\n\nДля того щоб допомогти нам зробити OMT краще, пишіть про баги на форумі 4PDA; ідеї нових функцій також підтримуються. Знайдіть відповіді або розпочніть бесіду на форумі.\n\nOMT це додаток з відкритим сирцевим кодом, тож будь-хто може стати учасником. Не-розробники також можуть допомогти. Наприклад, Ви можете допомогти з перекладом OMT, надати знімки екранів або написати у блозі про OMT.\n\nOMT випущено під GNU-GPL v3 ліцензією і сирцевий код доступний на GitHub.\n\nПрофiль розробника на LinkedIn. Поле не може бути порожнім. Ви не можете бути настільки багаті чи бідні. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9f31824..8c8e480 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -115,7 +115,7 @@ pref_about Version %1$s (Android %2$s) About - Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn. + Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn. Field can\'t be empty. You can\'t be so rich or so poor. From 3f7f1fe60d81aff459e1ae670212fc9f469e11c9 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Mon, 10 Jan 2022 10:41:28 +0200 Subject: [PATCH 17/76] VersionCode 37, versionName '2.1.5'. --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8b39c53..b3a139d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { minSdkVersion 21 targetSdkVersion 31 - versionCode 36 - versionName '2.1.4' + versionCode 37 + versionName '2.1.5' } signingConfigs { releaseConfig { From 24a5694c75b069ed9082af25d42634f289e39672 Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Tue, 28 Feb 2023 22:10:32 +0530 Subject: [PATCH 18/76] Export account_id as well. to fix not able to edit imported records --- .../controller/external/ExportController.java | 7 +++++++ .../moneytracker/controller/external/Head.java | 3 ++- .../controller/external/ImportController.java | 12 +++++++----- app/src/main/res/values/strings.xml | 6 +++--- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java index 8493275..ef03757 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java @@ -31,6 +31,7 @@ public List getRecordsForExport(long fromDate, long toDate) { @SuppressWarnings("StringBufferReplaceableByString") StringBuilder sb = new StringBuilder(); sb.append(Head.TIME).append(Head.DELIMITER); + sb.append(Head.ACCOUNT_ID).append(Head.DELIMITER); sb.append(Head.TITLE).append(Head.DELIMITER); sb.append(Head.CATEGORY).append(Head.DELIMITER); sb.append(Head.PRICE).append(Head.DELIMITER); @@ -46,6 +47,12 @@ public List getRecordsForExport(long fromDate, long toDate) { for (Record record : recordList) { sb = new StringBuilder(); sb.append(record.getTime()).append(Head.DELIMITER); + + long account_id = -1; + if (record.getAccount() != null) + account_id = record.getAccount().getId(); + + sb.append(account_id).append(Head.DELIMITER); sb.append(record.getTitle()).append(Head.DELIMITER); Category category = null; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java index 396c9a3..5bc450f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java @@ -8,10 +8,11 @@ */ public interface Head { String TIME = "time"; + String ACCOUNT_ID = "account_id"; String TITLE = "title"; String CATEGORY = "category"; String PRICE = "price"; String CURRENCY = "currency"; String DELIMITER = ";"; - int COLUMN_COUNT = 5; + int COLUMN_COUNT = 6; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java index 132a843..bc4c86b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java @@ -35,13 +35,15 @@ public List importRecordsFromCsv(@Nullable String csv) { if (words.length != Head.COLUMN_COUNT) continue; String timeCol = words[0]; - String titleCol = words[1]; - String categoryCol = words[2]; - String priceCol = words[3]; - String currencyCol = words[4]; + String accountIdCol = words[1]; + String titleCol = words[2]; + String categoryCol = words[3]; + String priceCol = words[4]; + String currencyCol = words[5]; try { long time = Long.parseLong(timeCol); + long accountId = Long.parseLong(accountIdCol); String title = titleCol.trim(); String categoryName = categoryCol.trim(); double price = Double.parseDouble(priceCol); @@ -55,7 +57,7 @@ public List importRecordsFromCsv(@Nullable String csv) { else type = Record.TYPE_INCOME; Category category = new Category(categoryName); - Account account = new Account(-1, "MOCK", -1, currency, 0, -1, false, 0); + Account account = new Account(accountId, "MOCK", -1, currency, 0, -1, false, 0); Record record = new Record(time, type, title, category, Math.abs(price), account, currency); Record createdRecord = recordController.create(record); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c8e480..fa92ee4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,12 +78,12 @@ Help To import records into application:\n 1. Create CSV file in format - \n - time;title;category;price;currency.\n + time;account_id;title;category;price;currency.\n 2. Copy its content to text field.\n 3. Press import button. In few seconds you will see how much records has been imported.\n \n - Note: time - timestamp value in milliseconds; currency - 3 symbols code of currency.\n - Example: 1466948795712;metro;transport;-20.0;UAH + Note: time - timestamp value in milliseconds; Default account_id is 1 and for every new account it increases by 1; Make sure all the accounts already exists; currency - 3 symbols code of currency.\n + Example: 1466948795712;1;metro;transport;-20.0;UAH / Bank sells From 06445a8fe7fbb804ebcb6aa22acffc118034aac4 Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Wed, 1 Mar 2023 21:45:40 +0530 Subject: [PATCH 19/76] Added Translation --- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6893338..226979e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -70,7 +70,7 @@ 2. Copier son contenu dans le champ de saisie.\n 3. Appuyer sur importer. Au bout de quelques secondes, le nombre d\'opérations importées est affiché.\n \n - Note : date - horodatage en millisecondes ; devise - code devise à 3 lettres.\n + Note : date - horodatage en millisecondes ;Le account_id par défaut est 1 et pour chaque nouveau compte, il augmente de 1;Assurez-vous que tous les comptes existent déjà; devise - code devise à 3 lettres.\n Exemple : 1466948795712;métro;transport;-20.0;EUR Banque achète diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2d3078c..a911fc3 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -82,7 +82,7 @@ 2. Copie o seu conteúdo para o campo de texto.\n 3. Pressione o botão de importar. Em alguns segundos você verá quantos registros foram importados.\n \n - Nota: hora - o valor deve ser em milissegundos; moeda - código de 3 símbolos da moeda.\n + Nota: hora - o valor deve ser em milissegundos;Account_id padrão é 1 e para cada nova conta aumenta em 1; Verifique se todas as contas já existem; moeda - código de 3 símbolos da moeda.\n Exemplo: 1466948795712;metrô;transporte;-20.0;BRL / diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3c2b2c3..b3cab4c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -74,7 +74,7 @@ 2. Скопируйте его контент в текстовое поле.\n 3. Нажмите кнопку импорта. Через несколько секунд Вы увидите сколько записей было импортировано.\n \n - Важно: время - метка времени в миллисекундах; валюта - 3-х символьный код валюты.\n + Важно: время - метка времени в миллисекундах;По умолчанию account_id равен 1, и для каждой новой учетной записи он увеличивается на 1; Убедитесь, что все учетные записи уже существуют; валюта - 3-х символьный код валюты.\n Пример: 1466948795712;метро;транспорт;-20.0;UAH Банк продает diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 495a091..57cabb1 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -74,7 +74,7 @@ 2. Скопіюйте його контент до текстового поля.\n 3. Натисніть кнопку імпорту. Через дікілька секунд Ви побачите скільки записів було імпортовано.\n \n - Важливо: час - мітка часу у мілісекундах; валюта - 3-х символьний код валюти.\n + Важливо: час - мітка часу у мілісекундах;За замовчуванням account_id дорівнює 1 і для кожного нового облікового запису він збільшується на 1; Переконайтеся, що всі облікові записи вже існують; валюта - 3-х символьний код валюти.\n Приклад: 1466948795712;метро;транспорт;-20.0;UAH Банк продає From bb5de74748b6b9bb77824c8ec5f3ca153b73d90d Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Tue, 28 Feb 2023 22:35:58 +0530 Subject: [PATCH 20/76] DbHelper | created db version 6 with notes as a column in records table --- .../moneytracker/repo/DbHelper.java | 59 ++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java index 8c6a38a..8bcf8a0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java @@ -15,7 +15,7 @@ public class DbHelper extends SQLiteOpenHelper { /* DB_VERSION = 1 */ public static final String DB_NAME = "database"; - public static final int DB_VERSION = 5; + public static final int DB_VERSION = 6; public static final String TABLE_RECORDS = "records"; public static final String TABLE_CATEGORIES = "categories"; @@ -59,6 +59,9 @@ public class DbHelper extends SQLiteOpenHelper { public static final String ARCHIVED_COLUMN = "archived"; public static final String COLOR_COLUMN = "color"; + /* DB_VERSION = 6 */ + public static final String NOTES_COLUMN = "notes"; + public DbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @@ -69,7 +72,8 @@ public void onCreate(SQLiteDatabase db) { //createDbVersion2(db); //createDbVersion3(db); //createDbVersion4(db); - createDbVersion5(db); + //createDbVersion5(db); + createDbVersion6(db); } @Override @@ -158,6 +162,14 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.setTransactionSuccessful(); db.endTransaction(); } + + if (oldVersion < 6) { + db.beginTransaction(); + + /* Add notes column to the records table */ + db.execSQL("ALTER TABLE " + TABLE_RECORDS + " ADD COLUMN " + + NOTES_COLUMN + " TEXT;"); + } } @SuppressWarnings("unused") @@ -325,6 +337,49 @@ private void createDbVersion5(SQLiteDatabase db) { insertDefaultAccount(db); } + private void createDbVersion6(SQLiteDatabase db) { + db.execSQL("CREATE TABLE " + TABLE_RECORDS + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + TIME_COLUMN + " INTEGER," + + TYPE_COLUMN + " INTEGER," + + TITLE_COLUMN + " TEXT," + + CATEGORY_ID_COLUMN + " INTEGER," + + NOTES_COLUMN + "TEXT," + + PRICE_COLUMN + " INTEGER," + + ACCOUNT_ID_COLUMN + " INTEGER," + + CURRENCY_COLUMN + " TEXT," + + DECIMALS_COLUMN + " INTEGER);"); + + db.execSQL("CREATE TABLE " + TABLE_CATEGORIES + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + NAME_COLUMN + " TEXT" + ");"); + + db.execSQL("CREATE TABLE " + TABLE_ACCOUNTS + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + CREATED_AT_COLUMN + " INTEGER," + + TITLE_COLUMN + " TEXT," + + CUR_SUM_COLUMN + " INTEGER," + + CURRENCY_COLUMN + " TEXT," + + DECIMALS_COLUMN + " INTEGER," + + GOAL_COLUMN + " REAL," + + ARCHIVED_COLUMN + " INTEGER," + + COLOR_COLUMN + " INTEGER);"); + + db.execSQL("CREATE TABLE " + TABLE_TRANSFERS + "(" + + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + + TIME_COLUMN + " INTEGER," + + FROM_ACCOUNT_ID_COLUMN + " INTEGER," + + TO_ACCOUNT_ID_COLUMN + " INTEGER," + + FROM_AMOUNT_COLUMN + " INTEGER," + + TO_AMOUNT_COLUMN + " INTEGER," + + DECIMALS_FROM_COLUMN + " INTEGER," + + DECIMALS_TO_COLUMN + " INTEGER);"); + + createRatesTable(db); + + insertDefaultAccount(db); + } + private void createRatesTable(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_RATES + "(" + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," From 584af9bc122405aea8cd31343ba42f3c116b7924 Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Wed, 1 Mar 2023 22:09:49 +0530 Subject: [PATCH 21/76] Updated Record obj to add new variable notes --- .../moneytracker/entity/data/Record.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java index 02506a0..3c12caf 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java @@ -19,57 +19,62 @@ public class Record extends BaseEntity implements Parcelable { private final int type; private final String title; private final Category category; + private final String notes; private final long price; private final Account account; private final String currency; private final long decimals; - public Record(long id, long time, int type, String title, long categoryId, long price, - long accountId, String currency, long decimals) { + public Record(long id, long time, int type, String title, long categoryId, String notes, + long price, long accountId, String currency, long decimals) { this.id = id; this.time = time; this.type = type; this.title = title; this.category = new Category(categoryId, null); + this.notes = notes; this.price = price; this.account = new Account(accountId, null, -1, null, 0, -1, false, -1); this.currency = currency; this.decimals = decimals; } - public Record(long id, long time, int type, String title, Category category, long price, - Account account, String currency, long decimals) { + public Record(long id, long time, int type, String title, Category category, String notes, + long price, Account account, String currency, long decimals) { this.id = id; this.time = time; this.type = type; this.title = title; this.category = category; + this.notes = notes; this.price = price; this.account = account; this.currency = currency; this.decimals = decimals; } - public Record(long id, long time, int type, String title, Category category, double price, - Account account, String currency) { + public Record(long id, long time, int type, String title, Category category, String notes, + double price, Account account, String currency) { this.id = id; this.time = time; this.type = type; this.title = title; this.category = category; + this.notes = notes; this.account = account; this.currency = currency; this.price = getLong(price); this.decimals = getDecimal(price); } - public Record(long time, int type, String title, Category category, double price, Account account, - String currency) { + public Record(long time, int type, String title, Category category, String notes, double price, + Account account, String currency) { this.id = -1; this.time = time; this.type = type; this.title = title; this.category = category; + this.notes = notes; this.account = account; this.currency = currency; this.price = getLong(price); @@ -82,6 +87,7 @@ protected Record(Parcel in) { type = in.readInt(); title = in.readString(); category = in.readParcelable(Category.class.getClassLoader()); + notes = in.readString(); price = in.readLong(); account = in.readParcelable(Account.class.getClassLoader()); currency = in.readString(); @@ -118,6 +124,9 @@ public Category getCategory() { return category; } + @Nullable + public String getNotes() { return notes; } + public long getPrice() { return price; } @@ -173,6 +182,7 @@ public String toString() { sb.append("time = ").append(time).append(", "); sb.append("category = ").append(category).append(", "); + sb.append("notes = ").append(notes).append(", "); sb.append("price = ").append(price).append(", "); sb.append("account = ").append(account).append(", "); sb.append("currency = ").append(currency).append(", "); @@ -191,6 +201,7 @@ public boolean equals(Object o) { && this.type == record.getType() && equals(this.title, record.getTitle()) && this.category.equals(record.getCategory()) + && equals(this.notes, record.getNotes()) && this.price == record.getPrice() && this.account.equals(record.getAccount()) && equals(this.currency, record.getCurrency()) @@ -210,6 +221,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(type); dest.writeString(title); dest.writeParcelable(category, 0); + dest.writeString(notes); dest.writeLong(price); dest.writeParcelable(account, 0); dest.writeString(currency); From 9c8391ad330b405cc63cef252af49403e22d4792 Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Wed, 1 Mar 2023 22:12:12 +0530 Subject: [PATCH 22/76] Updated RecordRepo to handle notes --- .../blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java index 60de34f..c9096ac 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/data/RecordRepo.java @@ -44,6 +44,7 @@ protected ContentValues contentValues(@Nullable Record record) { contentValues.put(DbHelper.TYPE_COLUMN, record.getType()); contentValues.put(DbHelper.TITLE_COLUMN, record.getTitle()); contentValues.put(DbHelper.CATEGORY_ID_COLUMN, record.getCategory().getId()); + contentValues.put(DbHelper.NOTES_COLUMN, record.getNotes()); contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccount().getId()); contentValues.put(DbHelper.CURRENCY_COLUMN, record.getCurrency()); @@ -64,6 +65,7 @@ protected List getListFromCursor(Cursor cursor) { int typeColIndex = cursor.getColumnIndex(DbHelper.TYPE_COLUMN); int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); int categoryColIndex = cursor.getColumnIndex(DbHelper.CATEGORY_ID_COLUMN); + int notesColIndex = cursor.getColumnIndex(DbHelper.NOTES_COLUMN); int priceColIndex = cursor.getColumnIndex(DbHelper.PRICE_COLUMN); int accountIdColIndex = cursor.getColumnIndex(DbHelper.ACCOUNT_ID_COLUMN); int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); @@ -75,6 +77,7 @@ protected List getListFromCursor(Cursor cursor) { cursor.getInt(typeColIndex), cursor.getString(titleColIndex), cursor.getLong(categoryColIndex), + cursor.getString(notesColIndex), cursor.getLong(priceColIndex), cursor.getLong(accountIdColIndex), cursor.getString(currencyColIndex), From 6ea699287cce45e2396e54606434c330988d9c2d Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Thu, 2 Mar 2023 14:37:18 +0530 Subject: [PATCH 23/76] Fixed a typo in DbHelper --- .../com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java index 8bcf8a0..4351a8a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java @@ -344,7 +344,7 @@ private void createDbVersion6(SQLiteDatabase db) { + TYPE_COLUMN + " INTEGER," + TITLE_COLUMN + " TEXT," + CATEGORY_ID_COLUMN + " INTEGER," - + NOTES_COLUMN + "TEXT," + + NOTES_COLUMN + " TEXT," + PRICE_COLUMN + " INTEGER," + ACCOUNT_ID_COLUMN + " INTEGER," + CURRENCY_COLUMN + " TEXT," From 2d2bc9ecbffadecaa1932969909a056479051ad5 Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Thu, 2 Mar 2023 17:07:43 +0530 Subject: [PATCH 24/76] Export Import notes as well --- .../controller/external/ExportController.java | 2 ++ .../moneytracker/controller/external/Head.java | 3 ++- .../controller/external/ImportController.java | 14 +++++++++----- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java index 8493275..fa5cf21 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java @@ -33,6 +33,7 @@ public List getRecordsForExport(long fromDate, long toDate) { sb.append(Head.TIME).append(Head.DELIMITER); sb.append(Head.TITLE).append(Head.DELIMITER); sb.append(Head.CATEGORY).append(Head.DELIMITER); + sb.append(Head.NOTES).append(Head.DELIMITER); sb.append(Head.PRICE).append(Head.DELIMITER); sb.append(Head.CURRENCY); @@ -53,6 +54,7 @@ public List getRecordsForExport(long fromDate, long toDate) { category = categoryController.read(record.getCategory().getId()); sb.append(category == null ? "NONE" : category.getName()).append(Head.DELIMITER); + sb.append(record.getNotes()).append(Head.DELIMITER); sb.append(record.getType() == 0 ? record.getFullPrice() : -record.getFullPrice()).append(Head.DELIMITER); sb.append(record.getCurrency() == null ? DbHelper.DEFAULT_ACCOUNT_CURRENCY diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java index 396c9a3..ab1ea19 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java @@ -10,8 +10,9 @@ public interface Head { String TIME = "time"; String TITLE = "title"; String CATEGORY = "category"; + String NOTES = "notes"; String PRICE = "price"; String CURRENCY = "currency"; String DELIMITER = ";"; - int COLUMN_COUNT = 5; + int COLUMN_COUNT = 7; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java index 132a843..552c32a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java @@ -35,15 +35,19 @@ public List importRecordsFromCsv(@Nullable String csv) { if (words.length != Head.COLUMN_COUNT) continue; String timeCol = words[0]; - String titleCol = words[1]; - String categoryCol = words[2]; - String priceCol = words[3]; - String currencyCol = words[4]; + String accountIdCol = words[1]; + String titleCol = words[2]; + String categoryCol = words[3]; + String notesCol = words[4]; + String priceCol = words[5]; + String currencyCol = words[6]; + try { long time = Long.parseLong(timeCol); String title = titleCol.trim(); String categoryName = categoryCol.trim(); + String notes = notesCol.trim(); double price = Double.parseDouble(priceCol); String currency = currencyCol.trim(); @@ -57,7 +61,7 @@ public List importRecordsFromCsv(@Nullable String csv) { Category category = new Category(categoryName); Account account = new Account(-1, "MOCK", -1, currency, 0, -1, false, 0); - Record record = new Record(time, type, title, category, Math.abs(price), account, currency); + Record record = new Record(time, type, title, category, notes, Math.abs(price), account, currency); Record createdRecord = recordController.create(record); if (createdRecord != null) recordList.add(createdRecord); } catch (Exception e) { From e491766d967d2d068f23ace3c81394e1aa43535b Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Fri, 3 Mar 2023 12:59:08 +0530 Subject: [PATCH 25/76] Added Notes feature --- app/src/main/AndroidManifest.xml | 2 +- .../edit/fragment/AccountOperationsFragment.kt | 3 ++- .../activity/record/AddRecordActivity.kt | 7 +++++-- .../controller/data/RecordController.java | 4 ++-- .../e_kanivets/moneytracker/entity/RecordItem.kt | 4 ++-- .../moneytracker/entity/data/Record.java | 2 +- .../moneytracker/report/record/RecordReport.java | 4 ++-- app/src/main/res/layout/content_add_record.xml | 14 ++++++++++++++ app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 14 files changed, 35 insertions(+), 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 873586d..beec760 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,7 +30,7 @@ android:name=".activity.record.AddRecordActivity" android:screenOrientation="portrait" android:theme="@style/Theme.Default" - android:windowSoftInputMode="adjustResize" /> + android:windowSoftInputMode="adjustPan" /> etTitle.setText(record.title) etCategory.setText(record.category?.name.orEmpty()) + etNotes.setText(record.notes) etPrice.setText(formatController.formatPrecisionNone(record.fullPrice)) } } @@ -102,6 +103,7 @@ class AddRecordActivity : BaseBackActivity() { // Restrict ';' for input, because it's used as delimiter when exporting etTitle.filters = arrayOf(SemicolonInputFilter()) etCategory.filters = arrayOf(SemicolonInputFilter()) + etNotes.filters = arrayOf(SemicolonInputFilter()) tvDate.setOnClickListener { selectDate() } tvTime.setOnClickListener { selectTime() } @@ -262,6 +264,7 @@ class AddRecordActivity : BaseBackActivity() { var title = etTitle.text.toString().trim() val category = etCategory.text.toString().trim() + val notes = etNotes.text.toString().trim() val price = etPrice.text.toString().toDouble() val account = accountList[spinnerAccount.selectedItemPosition] @@ -271,10 +274,10 @@ class AddRecordActivity : BaseBackActivity() { if (mode == Mode.MODE_ADD) { recordController.create(Record(timestamp, type, title, - Category(category), price, account, account.currency)) + Category(category), notes, price, account, account.currency)) } else if (mode == Mode.MODE_EDIT) { recordController.update(Record(record?.id ?: -1, - timestamp, type, title, Category(category), price, account, account.currency)) + timestamp, type, title, Category(category), notes, price, account, account.currency)) } autoCompleter.addRecordTitleCategoryPair(title, category) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java index 47cd596..1bd2b70 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java @@ -115,7 +115,7 @@ record = validateRecord(record); completedRecordList.add( new Record(record.getId(), record.getTime(), record.getType(), record.getTitle(), category, - record.getPrice(), account, currency, record.getDecimals())); + record.getNotes(), record.getPrice(), account, currency, record.getDecimals())); } return completedRecordList; @@ -143,6 +143,6 @@ private Record validateRecord(@NonNull Record record) { Category category = categoryController.readOrCreate(record.getCategory().getName()); return new Record(record.getId(), record.getTime(), record.getType(), record.getTitle(), category, - record.getPrice(), record.getAccount(), record.getCurrency(), record.getDecimals()); + record.getNotes(), record.getPrice(), record.getAccount(), record.getCurrency(), record.getDecimals()); } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordItem.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordItem.kt index 9a4f625..bd9bc42 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordItem.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/RecordItem.kt @@ -4,7 +4,7 @@ sealed class RecordItem { data class Header(val date: String) : RecordItem() - data class Record(val title: String, val categoryName: String, val fullPrice: Double, val currency: String, val isIncome: Boolean) : RecordItem() { - constructor(record: com.blogspot.e_kanivets.moneytracker.entity.data.Record) : this(record.title, record.category?.name?.toString().orEmpty(), record.fullPrice, record.currency, record.isIncome) + data class Record(val title: String, val categoryName: String, val notes: String, val fullPrice: Double, val currency: String, val isIncome: Boolean) : RecordItem() { + constructor(record: com.blogspot.e_kanivets.moneytracker.entity.data.Record) : this(record.title, record.category?.name?.toString().orEmpty(), record.notes, record.fullPrice, record.currency, record.isIncome) } } \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java index 3c12caf..8bdafbd 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/entity/data/Record.java @@ -124,7 +124,7 @@ public Category getCategory() { return category; } - @Nullable + public String getNotes() { return notes; } public long getPrice() { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java index 60366e9..e276aa7 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReport.java @@ -141,8 +141,8 @@ private List convertRecordList(List recordList) { int decConvertedPrice = (int) Math.round(convertedPrice * 100 - intConvertedPrice * 100); Record convertedRecord = new Record(record.getId(), record.getTime(), record.getType(), - record.getTitle(), record.getCategory(), intConvertedPrice, record.getAccount(), - currency, decConvertedPrice); + record.getTitle(), record.getCategory(), record.getNotes(), intConvertedPrice, + record.getAccount(), currency, decConvertedPrice); convertedRecordList.add(convertedRecord); } diff --git a/app/src/main/res/layout/content_add_record.xml b/app/src/main/res/layout/content_add_record.xml index b6923ed..76385d1 100644 --- a/app/src/main/res/layout/content_add_record.xml +++ b/app/src/main/res/layout/content_add_record.xml @@ -125,4 +125,18 @@ android:singleLine="true" /> + + + + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6893338..5531af9 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -130,4 +130,5 @@ Êtes-vous sûr de vouloir supprimer le fichier %1$s ? Il ne pourra plus être restauré. La date de fin ne peut être antérieure à celle de début + Notes diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2d3078c..b39c764 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -146,4 +146,5 @@ %1$s (%2$d) A data final não pode ser anterior a data inicial + anotações diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3c2b2c3..618b754 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -131,5 +131,6 @@ Операции Дата конца не может быть раньше даты начала + примечания diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 495a091..2e2ae25 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -131,4 +131,5 @@ Операції Дата початку не може бути раніше за дату кінця + Нотатки diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 7874beb..b684ba2 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -120,5 +120,6 @@ 操作 开始日期不能早于结束日期 + 笔记 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c8e480..2252e41 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ Money Tracker Title Category + Notes Price Add income Add expense From abfe7038194b61e69fa5eb42c158a3bee0ca592a Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Mon, 6 Mar 2023 20:00:29 +0530 Subject: [PATCH 26/76] Fixed spacing issue --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 618b754..f0e0421 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -131,6 +131,6 @@ Операции Дата конца не может быть раньше даты начала - примечания + примечания From 0669331f398ff184dd02ee2ef21904b2ddad6d2f Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Mon, 6 Mar 2023 20:02:32 +0530 Subject: [PATCH 27/76] Capitalized notes in Portuguese strings.xml --- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b39c764..557b4f5 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -146,5 +146,5 @@ %1$s (%2$d) A data final não pode ser anterior a data inicial - anotações + Anotações From 610cc4834b30bc81351585fc0b4588bca33a69a2 Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Mon, 6 Mar 2023 20:32:38 +0530 Subject: [PATCH 28/76] Fix app crash on upgrade. --- .../blogspot/e_kanivets/moneytracker/repo/DbHelper.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java index 4351a8a..0806bd5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/DbHelper.java @@ -169,6 +169,14 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /* Add notes column to the records table */ db.execSQL("ALTER TABLE " + TABLE_RECORDS + " ADD COLUMN " + NOTES_COLUMN + " TEXT;"); + + /* Set the notes as empty string for all the record*/ + ContentValues contentValues = new ContentValues(); + contentValues.put(NOTES_COLUMN, ""); + db.update(DbHelper.TABLE_RECORDS, contentValues, null, null); + + db.setTransactionSuccessful(); + db.endTransaction(); } } From 867e68d9e08d432740b509c95ca7a605cde3ba00 Mon Sep 17 00:00:00 2001 From: Jana Hoch Date: Mon, 6 Mar 2023 20:40:26 +0530 Subject: [PATCH 29/76] Localized Account Transfer string and added all the translation. --- .../activity/account/edit/fragment/AccountOperationsFragment.kt | 2 +- app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt index c7f0734..0b549d3 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/edit/fragment/AccountOperationsFragment.kt @@ -59,7 +59,7 @@ class AccountOperationsFragment : BaseFragment() { val type = if (it.fromAccountId == account.id) Record.TYPE_EXPENSE else Record.TYPE_INCOME val title = constructRecordTitle(type, it) val category = Category(getString(R.string.transfer).toLowerCase()) - val notes = "Account Transfer" + val notes = getString(R.string.account_transfer) val price = if (type == Record.TYPE_EXPENSE) it.fromAmount else it.toAmount val decimals = if (type == Record.TYPE_EXPENSE) it.fromDecimals else it.toDecimals diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5531af9..466cc75 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -131,4 +131,5 @@ La date de fin ne peut être antérieure à celle de début Notes + Transfert de compte diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 557b4f5..e98da5f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -147,4 +147,5 @@ %1$s (%2$d) A data final não pode ser anterior a data inicial Anotações + Transferência de Conta diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f0e0421..6cbba6c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -132,5 +132,6 @@ Дата конца не может быть раньше даты начала примечания + Перевод счета diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2e2ae25..72fa5f9 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -132,4 +132,5 @@ Дата початку не може бути раніше за дату кінця Нотатки + Переказ рахунку diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index b684ba2..edf82e3 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -121,5 +121,6 @@ 开始日期不能早于结束日期 笔记 + 账户转账 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2252e41..3c65b9b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -147,4 +147,5 @@ %1$s (%2$d) End date can\'t be earlier than start date + Account Transfer From 3a187c996006535ec647cff41d9fe2a72e51d737 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sun, 12 Mar 2023 15:03:32 +0100 Subject: [PATCH 30/76] Raise compile and target SDK versions to 33. --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b3a139d..cf6771a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,12 +5,12 @@ apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion 31 + compileSdkVersion 33 buildToolsVersion '30.0.3' defaultConfig { applicationId 'com.blogspot.e_kanivets.moneytracker' minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 33 versionCode 37 versionName '2.1.5' From 3e57ea43fb847deb2ed92915639ffbe97a03f78f Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sun, 12 Mar 2023 15:04:41 +0100 Subject: [PATCH 31/76] Version 2.2.0, build 38. --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cf6771a..f7461d9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { minSdkVersion 21 targetSdkVersion 33 - versionCode 37 - versionName '2.1.5' + versionCode 38 + versionName '2.2.0' } signingConfigs { releaseConfig { From 6e17f267a9b853b5d67b67252341a9490475ce7a Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Thu, 9 Jan 2025 15:12:53 +0100 Subject: [PATCH 32/76] 36 - Upgrade Gradle to 8.9 --- gradle/wrapper/gradle-wrapper.jar | Bin 49896 -> 43504 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 310 +++++++++++++++-------- gradlew.bat | 88 ++++--- 4 files changed, 250 insertions(+), 153 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 8c0fb64a8698b08ecc4158d828ca593c4928e9dd..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch literal 43504 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 TZiJi*F`$tkWLn) literal 49896 zcmagFb986H(k`5d^NVfUwr$(C?M#x1ZQHiZiEVpg+jrjgoQrerx!>1o_ul)D>ebz~ zs=Mmxr&>W81QY-S1PKWQ%N-;H^tS;2*XwVA`dej1RRn1z<;3VgfE4~kaG`A%QSPsR z#ovnZe+tS9%1MfeDyz`RirvdjPRK~p(#^q2(^5@O&NM19EHdvN-A&StN>0g6QA^VN z0Gx%Gq#PD$QMRFzmK+utjS^Y1F0e8&u&^=w5K<;4Rz|i3A=o|IKLY+g`iK6vfr9?+ z-`>gmU&i?FGSL5&F?TXFu`&Js6h;15QFkXp2M1H9|Eq~bpov-GU(uz%mH0n55wUl- zv#~ccAz`F5wlQ>e_KlJS3@{)B?^v*EQM=IxLa&76^y51a((wq|2-`qON>+4dLc{Oo z51}}o^Zen(oAjxDK7b++9_Yg`67p$bPo3~BCpGM7uAWmvIhWc5Gi+gQZ|Pwa-Gll@<1xmcPy z|NZmu6m)g5Ftu~BG&Xdxclw7Cij{xbBMBn-LMII#Slp`AElb&2^Hw+w>(3crLH!;I zN+Vk$D+wP1#^!MDCiad@vM>H#6+`Ct#~6VHL4lzmy;lSdk>`z6)=>Wh15Q2)dQtGqvn0vJU@+(B5{MUc*qs4!T+V=q=wy)<6$~ z!G>e_4dN@lGeF_$q9`Ju6Ncb*x?O7=l{anm7Eahuj_6lA{*#Gv*TaJclevPVbbVYu z(NY?5q+xxbO6%g1xF0r@Ix8fJ~u)VRUp`S%&rN$&e!Od`~s+64J z5*)*WSi*i{k%JjMSIN#X;jC{HG$-^iX+5f5BGOIHWAl*%15Z#!xntpk($-EGKCzKa zT7{siZ9;4TICsWQ$pu&wKZQTCvpI$Xvzwxoi+XkkpeE&&kFb!B?h2hi%^YlXt|-@5 zHJ~%AN!g_^tmn1?HSm^|gCE#!GRtK2(L{9pL#hp0xh zME}|DB>(5)`iE7CM)&_+S}-Bslc#@B5W4_+k4Cp$l>iVyg$KP>CN?SVGZ(&02>iZK zB<^HP$g$Lq*L$BWd?2(F?-MUbNWTJVQdW7$#8a|k_30#vHAD1Z{c#p;bETk0VnU5A zBgLe2HFJ3032$G<`m*OB!KM$*sdM20jm)It5OSru@tXpK5LT>#8)N!*skNu1$TpIw zufjjdp#lyH5bZ%|Iuo|iu9vG1HrIVWLH>278xo>aVBkPN3V$~!=KnlXQ4eDqS7%E% zQ!z^$Q$b^6Q)g#cLpwur(|<0gWHo6A6jc;n`t(V9T;LzTAU{IAu*uEQ%Ort1k+Kn+f_N`9|bxYC+~Z1 zCC1UCWv*Orx$_@ydv9mIe(liLfOr7mhbV@tKw{6)q^1DH1nmvZ0cj215R<~&I<4S| zgnr;9Cdjqpz#o8i0CQjtl`}{c*P)aSdH|abxGdrR)-3z+02-eX(k*B)Uqv6~^nh** z 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum -warn ( ) { +warn () { echo "$*" -} +} >&2 -die ( ) { +die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -77,84 +133,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec9973..9b42019 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,22 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -8,26 +26,30 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -35,54 +57,36 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From b2e7229e610f422d1f5a4504ee604a04d21c7332 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sat, 11 Jan 2025 16:36:21 +0100 Subject: [PATCH 33/76] 36 - Upgrade Kotlin to 2.0.0 --- app/build.gradle | 20 +++++++++++--------- build.gradle | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b3a139d..887dfdf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,6 +15,7 @@ android { versionCode 37 versionName '2.1.5' } + signingConfigs { releaseConfig { storeFile file('mt_keystore.jks') @@ -23,6 +24,7 @@ android { keyPassword 'moneytracker' } } + buildTypes { release { debuggable false @@ -47,19 +49,19 @@ android { } } - lintOptions { - checkReleaseBuilds false + lint { abortOnError false - } - dexOptions { - preDexLibraries = false - } - productFlavors { + checkReleaseBuilds false } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + } + + buildFeatures { + viewBinding true + buildConfig true } } diff --git a/build.gradle b/build.gradle index 3abc77e..570cd19 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.5.31' + ext.kotlin_version = '2.0.0' repositories { google() mavenCentral() From 0dd1b5931f883cb13e7d29698741dec12d96c0ed Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sat, 11 Jan 2025 16:36:36 +0100 Subject: [PATCH 34/76] 36 - Upgrade AGP to 8.7.3 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 570cd19..5f77a98 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.2' + classpath 'com.android.tools.build:gradle:8.7.3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.10' From 2d15c714577f81e06842b50c896146def7394c7e Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sat, 11 Jan 2025 16:37:03 +0100 Subject: [PATCH 35/76] 36 - Upgrade targetSskVersion to 34 --- app/build.gradle | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 887dfdf..91de23a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,12 +5,13 @@ apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion 31 - buildToolsVersion '30.0.3' + namespace = "com.blogspot.e_kanivets.moneytracker" + + compileSdkVersion 34 defaultConfig { applicationId 'com.blogspot.e_kanivets.moneytracker' minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 34 versionCode 37 versionName '2.1.5' From 3764578a30ac125dde0275d668791de8d00b0148 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sat, 11 Jan 2025 16:37:17 +0100 Subject: [PATCH 36/76] 36 - Upgrade Dagger to 2.35.1 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 91de23a..ce8f850 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -83,7 +83,7 @@ dependencies { androidTestImplementation 'com.crittercism.dexmaker:dexmaker:1.4' androidTestImplementation 'com.crittercism.dexmaker:dexmaker-dx:1.4' androidTestImplementation 'com.crittercism.dexmaker:dexmaker-mockito:1.4' - annotationProcessor 'com.google.dagger:dagger-compiler:2.35.1' + annotationProcessor 'com.google.dagger:dagger-compiler:2.51.1' compileOnly 'org.glassfish:javax.annotation:10.0-b28' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.cardview:cardview:1.0.0' From 2dba3c557226fcdfa2e47c9bbf666873e97aa112 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sat, 11 Jan 2025 16:38:12 +0100 Subject: [PATCH 37/76] 36 - Disable nonFinalResIds --- gradle.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle.properties b/gradle.properties index e956ceb..a63fd15 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,3 +18,4 @@ # org.gradle.parallel=true android.enableJetifier=true android.useAndroidX=true +android.nonFinalResIds=false \ No newline at end of file From 4b321c691fd3527b472cdbfe6d60ff339590692b Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sat, 11 Jan 2025 16:39:24 +0100 Subject: [PATCH 38/76] 36 - Migrate AboutActivity to ViewBinding --- .../moneytracker/activity/AboutActivity.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java index 59c0960..05293a3 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java @@ -1,25 +1,26 @@ package com.blogspot.e_kanivets.moneytracker.activity; import android.text.method.LinkMovementMethod; -import android.widget.TextView; -import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; - -import butterknife.BindView; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAboutBinding; public class AboutActivity extends BaseBackActivity { - @BindView(R.id.tv_about) - TextView tvAbout; + + private ActivityAboutBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_about; + protected void onCreate(android.os.Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityAboutBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initToolbar(); + initViews(); } - @Override - protected void initViews() { - super.initViews(); - tvAbout.setMovementMethod(LinkMovementMethod.getInstance()); + private void initViews() { + binding.tvAbout.setMovementMethod(LinkMovementMethod.getInstance()); } } From 835a754d67c3ddda4d22b7fe6d3e4aad8c7327c1 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sat, 11 Jan 2025 16:39:50 +0100 Subject: [PATCH 39/76] 36 - Migrate AccountAdapter to ViewBinding --- .../moneytracker/adapter/AccountAdapter.java | 48 ++++++------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/AccountAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/AccountAdapter.java index 5015d6d..2f329c8 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/AccountAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/AccountAdapter.java @@ -6,26 +6,17 @@ import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; -import android.widget.TextView; import com.blogspot.e_kanivets.moneytracker.MtApp; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.controller.FormatController; +import com.blogspot.e_kanivets.moneytracker.databinding.ViewAccountBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import java.util.List; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Custom adapter class for Account entity. - * Created on 6/3/15. - * - * @author Evgenii Kanivets - */ public class AccountAdapter extends BaseAdapter { @Inject FormatController formatController; @@ -71,16 +62,18 @@ public long getItemId(int position) { @SuppressLint("SetTextI18n") @Override public View getView(final int position, View convertView, ViewGroup parent) { - ViewHolder viewHolder; + ViewAccountBinding binding; if (convertView == null) { LayoutInflater layoutInflater = LayoutInflater.from(context); - convertView = layoutInflater.inflate(R.layout.view_account, parent, false); - viewHolder = new ViewHolder(convertView); + binding = ViewAccountBinding.inflate(layoutInflater, parent, false); + convertView = binding.getRoot(); - convertView.setTag(viewHolder); - } else viewHolder = (ViewHolder) convertView.getTag(); + convertView.setTag(binding); + } else { + binding = (ViewAccountBinding) convertView.getTag(); + } Account account = accounts.get(position); @@ -90,26 +83,13 @@ public View getView(final int position, View convertView, ViewGroup parent) { convertView.setBackgroundColor(account.getFullSum() >= 0.0 ? whiteGreen : whiteRed); } - viewHolder.tvCurSum.setTextColor(account.getFullSum() >= 0.0 ? green : red); - viewHolder.tvCurrency.setTextColor(account.getFullSum() >= 0.0 ? green : red); + binding.tvCurSum.setTextColor(account.getFullSum() >= 0.0 ? green : red); + binding.tvCurrency.setTextColor(account.getFullSum() >= 0.0 ? green : red); - viewHolder.tvTitle.setText(account.getTitle()); - viewHolder.tvCurSum.setText(formatController.formatSignedAmount(account.getFullSum())); - viewHolder.tvCurrency.setText(account.getCurrency()); + binding.tvTitle.setText(account.getTitle()); + binding.tvCurSum.setText(formatController.formatSignedAmount(account.getFullSum())); + binding.tvCurrency.setText(account.getCurrency()); return convertView; } - - public static class ViewHolder { - @BindView(R.id.tvTitle) - TextView tvTitle; - @BindView(R.id.tv_cur_sum) - TextView tvCurSum; - @BindView(R.id.tvCurrency) - TextView tvCurrency; - - public ViewHolder(View view) { - ButterKnife.bind(this, view); - } - } -} \ No newline at end of file +} From 00767e1fa9083d237b116a0580fbf8503f354552 Mon Sep 17 00:00:00 2001 From: Yev Kanivets Date: Sat, 11 Jan 2025 16:40:58 +0100 Subject: [PATCH 40/76] 36 - Migrate AccountsActivity to ViewBinding --- .../activity/account/AccountsActivity.java | 45 ++++++------- app/src/main/res/layout/activity_accounts.xml | 64 ++++++++++++++----- app/src/main/res/layout/content_accounts.xml | 35 ---------- 3 files changed, 71 insertions(+), 73 deletions(-) delete mode 100644 app/src/main/res/layout/content_accounts.xml diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java index bc1b08c..b76b89f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java @@ -1,26 +1,26 @@ package com.blogspot.e_kanivets.moneytracker.activity.account; import android.content.Intent; + +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; -import android.widget.ListView; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.account.edit.EditAccountActivity; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter; import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController; +import com.blogspot.e_kanivets.moneytracker.databinding.ActivityAccountsBinding; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.ui.presenter.AccountsSummaryPresenter; import com.blogspot.e_kanivets.moneytracker.util.CrashlyticsProxy; import javax.inject.Inject; -import butterknife.BindView; -import butterknife.OnClick; -import butterknife.OnItemClick; - public class AccountsActivity extends BaseBackActivity { @SuppressWarnings("unused") private static final String TAG = "AccountsActivity"; @@ -34,29 +34,32 @@ public class AccountsActivity extends BaseBackActivity { private AccountsSummaryPresenter summaryPresenter; - @BindView(R.id.listView) - ListView listView; + private ActivityAccountsBinding binding; @Override - protected int getContentViewId() { - return R.layout.activity_accounts; + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityAccountsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + initData(); + initToolbar(); + initViews(); } - @Override - protected boolean initData() { - boolean result = super.initData(); + private boolean initData() { getAppComponent().inject(AccountsActivity.this); summaryPresenter = new AccountsSummaryPresenter(AccountsActivity.this); - return result; + return true; } - @Override - protected void initViews() { - super.initViews(); - - listView.addHeaderView(summaryPresenter.create()); + private void initViews() { + binding.listView.addHeaderView(summaryPresenter.create()); + binding.listView.setOnItemClickListener((adapterView, view, i, l) -> onAccountClick(i)); + binding.btnAddAccount.setOnClickListener(view -> addAccount()); - registerForContextMenu(listView); + registerForContextMenu(binding.listView); update(); } @@ -75,7 +78,6 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - @OnItemClick(R.id.listView) public void onAccountClick(int position) { Account account = accountController.readAll().get(position - 1); startActivityForResult(EditAccountActivity.Companion.newIntent(this, account), REQUEST_EDIT_ACCOUNT); @@ -86,7 +88,6 @@ public void makeTransfer() { startActivityForResult(new Intent(AccountsActivity.this, TransferActivity.class), REQUEST_TRANSFER); } - @OnClick(R.id.btn_add_account) public void addAccount() { CrashlyticsProxy.get().logButton("Add Account"); Intent intent = new Intent(AccountsActivity.this, AddAccountActivity.class); @@ -117,7 +118,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } private void update() { - listView.setAdapter(new AccountAdapter(AccountsActivity.this, accountController.readAll())); + binding.listView.setAdapter(new AccountAdapter(AccountsActivity.this, accountController.readAll())); summaryPresenter.update(); } } diff --git a/app/src/main/res/layout/activity_accounts.xml b/app/src/main/res/layout/activity_accounts.xml index 0bcafff..4475d8b 100644 --- a/app/src/main/res/layout/activity_accounts.xml +++ b/app/src/main/res/layout/activity_accounts.xml @@ -1,26 +1,58 @@ + + + + + + + + - + - + - +