From 0557679e9cbed13b2aef7d09fa8f393bdedadc5b Mon Sep 17 00:00:00 2001 From: oqba26 Date: Fri, 31 Jul 2026 21:40:27 +0330 Subject: [PATCH] Add auto-release and update system --- .../analysis_results.artifact.md | 68 + .../implementation_plan.artifact.md | 57 + .../walkthrough.artifact.md | 30 + .../implementation_plan.artifact.md | 55 + .github/workflows/release.yml | 45 + .gitignore | 2 + .idea/appInsightsSettings.xml | 27 - .idea/deploymentTargetSelector.xml | 7 - .idea/gradle.xml | 1 - .idea/inspectionProfiles/Project_Default.xml | 39 +- .idea/kotlinc.xml | 6 - .idea/markdown.xml | 8 + .idea/misc.xml | 5 +- .idea/planningMode.xml | 11 + .idea/vcs.xml | 2 +- PersianDate/build.gradle.kts | 8 +- .../results.bin | 1 + .../persiandate/PersianDate$Dialect.dex | Bin 0 -> 2080 bytes .../saman/zamani/persiandate/PersianDate.dex | Bin 0 -> 23420 bytes .../persiandate/PersianDateFormat$1.dex | Bin 0 -> 1616 bytes ...nDateFormat$PersianDateNumberCharacter.dex | Bin 0 -> 2032 bytes .../zamani/persiandate/PersianDateFormat.dex | Bin 0 -> 8372 bytes .../desugar_graph.bin | Bin 0 -> 1081 bytes .../results.bin | 1 + .../classes/classes_dex/classes.dex | Bin 0 -> 31688 bytes .../results.bin | 1 + .../classes/classes_dex/classes.dex | Bin 0 -> 31688 bytes .../results.bin | 1 + .../persiandate/PersianDate$Dialect.dex | Bin 0 -> 2076 bytes .../saman/zamani/persiandate/PersianDate.dex | Bin 0 -> 23420 bytes .../persiandate/PersianDateFormat$1.dex | Bin 0 -> 1616 bytes ...nDateFormat$PersianDateNumberCharacter.dex | Bin 0 -> 2032 bytes .../zamani/persiandate/PersianDateFormat.dex | Bin 0 -> 8372 bytes .../desugar_graph.bin | Bin 0 -> 931 bytes .../aapt/AndroidManifest.xml | 10 + .../aapt/output-metadata.json | 18 + .../aar-metadata.properties | 6 + .../annotationProcessors.json | 1 + .../bundleLibCompileToJarDebug/classes.jar | Bin 0 -> 43885 bytes .../debug/generateDebugRFile/R.jar | Bin 0 -> 888 bytes .../debug/generateDebugRFile/R.txt | 1 + .../compile-file-map.properties | 1 + .../merged.dir/values/values.xml | 4 + .../debug/packageDebugResources/merger.xml | 2 + .../mergeDebugJniLibFolders/merger.xml | 2 + .../incremental/mergeDebugShaders/merger.xml | 2 + .../incremental/packageDebugAssets/merger.xml | 2 + .../persiandate/PersianDate$Dialect.class | Bin 0 -> 1454 bytes .../zamani/persiandate/PersianDate.class | Bin 0 -> 28856 bytes .../persiandate/PersianDateFormat$1.class | Bin 0 -> 975 bytes ...ateFormat$PersianDateNumberCharacter.class | Bin 0 -> 1472 bytes .../persiandate/PersianDateFormat.class | Bin 0 -> 9014 bytes .../debug/parseDebugLocalResources/R-def.txt | 3 + .../manifest-merger-blame-debug-report.txt | 12 + .../processDebugManifest/AndroidManifest.xml | 10 + .../extractDeepLinksDebug/navigation.json | 1 + .../nestedResourcesValidationReport.txt | 1 + .../packageDebugResources/values/values.xml | 4 + .../persiandate/PersianDate$Dialect.class | Bin 0 -> 1454 bytes .../zamani/persiandate/PersianDate.class | Bin 0 -> 28856 bytes .../persiandate/PersianDateFormat$1.class | Bin 0 -> 975 bytes ...ateFormat$PersianDateNumberCharacter.class | Bin 0 -> 1472 bytes .../persiandate/PersianDateFormat.class | Bin 0 -> 9014 bytes .../bundleLibRuntimeToJarDebug/classes.jar | Bin 0 -> 43019 bytes .../generateDebugRFile/package-aware-r.txt | 2 + .../logs/manifest-merger-debug-report.txt | 20 + .../previous-compilation-data.bin | Bin 0 -> 13334 bytes PersianDate/src/main/AndroidManifest.xml | 9 + .../saman/zamani/persiandate/PersianDate.java | 1550 +++++++++++++++++ .../zamani/persiandate/PersianDateFormat.java | 303 ++++ PersianDate/src/main/res/values/strings.xml | 3 + .../zamani/persiandate/PersianDateTest.java | 667 +++++++ app/build.gradle.kts | 69 +- .../ExampleInstrumentedTest.kt | 24 - app/src/main/AndroidManifest.xml | 14 + .../oqba26/monthlypaymentapp/MainActivity.kt | 387 +++- .../core/PaymentApplication.kt | 58 +- .../core/di/DatabaseModule.kt | 33 + .../core/di/RepositoryModule.kt | 42 + .../core/manager/ExportManager.kt | 87 + .../core/manager/SmsManager.kt | 47 + .../monthlypaymentapp/data/dao/PaymentDao.kt | 3 + .../monthlypaymentapp/data/dao/PersonDao.kt | 3 + .../data/model/AuthModels.kt | 5 + .../data/model/AuthRequest.kt | 6 +- .../data/model/AuthResponse.kt | 1 + .../data/model/BackupData.kt | 3 + .../data/model/PaymentRecord.kt | 29 +- .../monthlypaymentapp/data/model/Person.kt | 23 +- .../data/remote/ApiClient.kt | 68 +- .../data/remote/ApiService.kt | 2 + .../data/remote/AuthInterceptor.kt | 1 + .../data/repository/LocalPersonRepository.kt | 12 +- .../data/repository/NetworkRepository.kt | 192 +- .../data/repository/SettingsRepository.kt | 40 + .../ui/components/PermissionDialogs.kt | 59 + .../ui/components/UpdateDialog.kt | 112 ++ .../ui/screens/ArchiveScreen.kt | 167 +- .../ui/screens/AuthScreen.kt | 41 +- .../ui/screens/PaidListScreen.kt | 125 +- .../ui/screens/PersonDetailScreen.kt | 703 +++++--- .../ui/screens/PersonScreen.kt | 1107 ++++++++---- .../ui/screens/SettingsScreen.kt | 390 +++-- .../ui/screens/SharedComponents.kt | 273 ++- .../monthlypaymentapp/ui/theme/Color.kt | 2 + .../PersianNumberVisualTransformation.kt | 39 +- .../monthlypaymentapp/utils/ShamsiUtils.kt | 1 + .../monthlypaymentapp/utils/StringUtils.kt | 54 + .../monthlypaymentapp/utils/UpdateManager.kt | 197 +++ .../viewmodel/AuthViewModel.kt | 65 + .../viewmodel/ContactViewModel.kt | 186 ++ .../viewmodel/PersonViewModel.kt | 502 ++---- .../viewmodel/SettingsViewModel.kt | 47 +- .../monthlypaymentapp/viewmodel/UiModels.kt | 86 +- app/src/main/res/values/strings.xml | 30 + app/src/main/res/xml/file_paths.xml | 4 + .../monthlypaymentapp/ExampleUnitTest.kt | 17 - build.gradle.kts | 6 +- gradle.properties | 25 +- gradle/gradle-daemon-jvm.properties | 3 + gradle/libs.versions.toml | 31 +- gradle/wrapper/gradle-wrapper.properties | 3 +- keystore.properties.example | 4 + settings.gradle.kts | 40 +- update.json | 2 +- 125 files changed, 6799 insertions(+), 1680 deletions(-) create mode 100644 .artifacts/15926d7b-894e-47f6-892f-6114218cde2d/analysis_results.artifact.md create mode 100644 .artifacts/15926d7b-894e-47f6-892f-6114218cde2d/implementation_plan.artifact.md create mode 100644 .artifacts/15926d7b-894e-47f6-892f-6114218cde2d/walkthrough.artifact.md create mode 100644 .artifacts/b6b8bd31-26e8-4cfd-8648-5c332ef07ef3/implementation_plan.artifact.md create mode 100644 .github/workflows/release.yml delete mode 100644 .idea/appInsightsSettings.xml delete mode 100644 .idea/kotlinc.xml create mode 100644 .idea/markdown.xml create mode 100644 .idea/planningMode.xml create mode 100644 PersianDate/build/.transforms/804ae9461bc36181bb932ccf21e80d26/results.bin create mode 100644 PersianDate/build/.transforms/804ae9461bc36181bb932ccf21e80d26/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDate$Dialect.dex create mode 100644 PersianDate/build/.transforms/804ae9461bc36181bb932ccf21e80d26/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDate.dex create mode 100644 PersianDate/build/.transforms/804ae9461bc36181bb932ccf21e80d26/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDateFormat$1.dex create mode 100644 PersianDate/build/.transforms/804ae9461bc36181bb932ccf21e80d26/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDateFormat$PersianDateNumberCharacter.dex create mode 100644 PersianDate/build/.transforms/804ae9461bc36181bb932ccf21e80d26/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDateFormat.dex create mode 100644 PersianDate/build/.transforms/804ae9461bc36181bb932ccf21e80d26/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin create mode 100644 PersianDate/build/.transforms/91dd66fd99e1bf96d3a5dda255469897/results.bin create mode 100644 PersianDate/build/.transforms/91dd66fd99e1bf96d3a5dda255469897/transformed/classes/classes_dex/classes.dex create mode 100644 PersianDate/build/.transforms/99c70c53220c636dd34a74b4e5874025/results.bin create mode 100644 PersianDate/build/.transforms/99c70c53220c636dd34a74b4e5874025/transformed/classes/classes_dex/classes.dex create mode 100644 PersianDate/build/.transforms/f7fb0ddd5afd91b957e9024aed94e90b/results.bin create mode 100644 PersianDate/build/.transforms/f7fb0ddd5afd91b957e9024aed94e90b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDate$Dialect.dex create mode 100644 PersianDate/build/.transforms/f7fb0ddd5afd91b957e9024aed94e90b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDate.dex create mode 100644 PersianDate/build/.transforms/f7fb0ddd5afd91b957e9024aed94e90b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDateFormat$1.dex create mode 100644 PersianDate/build/.transforms/f7fb0ddd5afd91b957e9024aed94e90b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDateFormat$PersianDateNumberCharacter.dex create mode 100644 PersianDate/build/.transforms/f7fb0ddd5afd91b957e9024aed94e90b/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/saman/zamani/persiandate/PersianDateFormat.dex create mode 100644 PersianDate/build/.transforms/f7fb0ddd5afd91b957e9024aed94e90b/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin create mode 100644 PersianDate/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml create mode 100644 PersianDate/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json create mode 100644 PersianDate/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties create mode 100644 PersianDate/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json create mode 100644 PersianDate/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar create mode 100644 PersianDate/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar create mode 100644 PersianDate/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt create mode 100644 PersianDate/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties create mode 100644 PersianDate/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml create mode 100644 PersianDate/build/intermediates/incremental/debug/packageDebugResources/merger.xml create mode 100644 PersianDate/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml create mode 100644 PersianDate/build/intermediates/incremental/mergeDebugShaders/merger.xml create mode 100644 PersianDate/build/intermediates/incremental/packageDebugAssets/merger.xml create mode 100644 PersianDate/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/saman/zamani/persiandate/PersianDate$Dialect.class create mode 100644 PersianDate/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/saman/zamani/persiandate/PersianDate.class create mode 100644 PersianDate/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/saman/zamani/persiandate/PersianDateFormat$1.class create mode 100644 PersianDate/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/saman/zamani/persiandate/PersianDateFormat$PersianDateNumberCharacter.class create mode 100644 PersianDate/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/saman/zamani/persiandate/PersianDateFormat.class create mode 100644 PersianDate/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt create mode 100644 PersianDate/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt create mode 100644 PersianDate/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml create mode 100644 PersianDate/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json create mode 100644 PersianDate/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt create mode 100644 PersianDate/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml create mode 100644 PersianDate/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/saman/zamani/persiandate/PersianDate$Dialect.class create mode 100644 PersianDate/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/saman/zamani/persiandate/PersianDate.class create mode 100644 PersianDate/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/saman/zamani/persiandate/PersianDateFormat$1.class create mode 100644 PersianDate/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/saman/zamani/persiandate/PersianDateFormat$PersianDateNumberCharacter.class create mode 100644 PersianDate/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/saman/zamani/persiandate/PersianDateFormat.class create mode 100644 PersianDate/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar create mode 100644 PersianDate/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt create mode 100644 PersianDate/build/outputs/logs/manifest-merger-debug-report.txt create mode 100644 PersianDate/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin create mode 100644 PersianDate/src/main/AndroidManifest.xml create mode 100644 PersianDate/src/main/java/saman/zamani/persiandate/PersianDate.java create mode 100644 PersianDate/src/main/java/saman/zamani/persiandate/PersianDateFormat.java create mode 100644 PersianDate/src/main/res/values/strings.xml create mode 100644 PersianDate/src/test/java/saman/zamani/persiandate/PersianDateTest.java delete mode 100644 app/src/androidTest/java/com/oqba26/monthlypaymentapp/ExampleInstrumentedTest.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/core/di/DatabaseModule.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/core/di/RepositoryModule.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/core/manager/ExportManager.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/core/manager/SmsManager.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/ui/components/PermissionDialogs.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/ui/components/UpdateDialog.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/utils/UpdateManager.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/viewmodel/AuthViewModel.kt create mode 100644 app/src/main/java/com/oqba26/monthlypaymentapp/viewmodel/ContactViewModel.kt create mode 100644 app/src/main/res/xml/file_paths.xml delete mode 100644 app/src/test/java/com/oqba26/monthlypaymentapp/ExampleUnitTest.kt create mode 100644 gradle/gradle-daemon-jvm.properties create mode 100644 keystore.properties.example diff --git a/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/analysis_results.artifact.md b/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/analysis_results.artifact.md new file mode 100644 index 0000000..69bcff6 --- /dev/null +++ b/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/analysis_results.artifact.md @@ -0,0 +1,68 @@ +# گزارش تحلیل و پیشنهادات بهبود پروژه MonthlyPaymentApp + +این گزارش شامل بررسی فنی ساختار پروژه و ارائه راهکارهای عملی برای بهبود کیفیت کد، نگهداری آسان‌تر و رعایت استانداردهای توسعه اندروید است. + +## ۱. معماری و مدیریت وابستگی‌ها (DI) + +### وضعیت فعلی +پروژه از DI دستی در کلاس `PaymentApplication` استفاده می‌کند. با رشد پروژه، مدیریت کارخانه‌های ViewModel (Factories) دشوار و مستعد خطا خواهد بود. + +### پیشنهاد +استفاده از **Hilt (Dagger)** برای مدیریت وابستگی‌ها. +- **مزیت:** حذف کد‌های تکراری در `Application` و `Activity` و ساده‌سازی فرآیند تست واحد. +- **اقدام:** افزودن کتابخانه‌های Hilt به `build.gradle.kts` و استفاده از آنوتیشن‌های `@HiltAndroidApp` و `@HiltViewModel`. + +--- + +## ۲. بازنگری در ViewModels (اصل Single Responsibility) + +### وضعیت فعلی +فایل [PersonViewModel.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/viewmodel/PersonViewModel.kt) با حدود ۱۰۰۰ خط کد، تبدیل به یک **God Object** شده است. این کلاس همزمان وظایف زیر را انجام می‌دهد: +- مدیریت احراز هویت (Auth) +- مدیریت لیست افراد و پرداخت‌ها +- ارسال پیامک‌های گروهی و تکی +- خروجی اکسل (Excel Export) +- جستجو در مخاطبین گوشی + +### پیشنهاد +تقسیم `PersonViewModel` به کلاس‌های تخصصی‌تر: +- `AuthViewModel`: برای لاگین و ثبت‌نام. +- `PersonListViewModel`: برای نمایش و فیلتر لیست افراد. +- `SmsService` یا `SmsHelper`: برای منطق ارسال پیامک. +- `ExportManager`: برای تولید فایل‌های گزارش. + +--- + +## ۳. جداسازی Context از لایه منطق + +### وضعیت فعلی +در متدهایی مانند `processNextBulkSms(Context)` یا `exportYearlyReport(..., Context)` در ViewModel، از `Context` استفاده شده است. +- **مشکل:** این کار باعث نشت حافظه (Memory Leak) احتمالی می‌شود و تست‌نویسی (Unit Testing) را غیرممکن می‌کند. + +### پیشنهاد +ViewModel نباید هیچ دانشی از `Context` داشته باشد. +- **راهکار:** برای مواردی مثل نمایش Toast یا شروع Intent، از یک `SharedFlow` برای ارسال **UI Events** به Activity استفاده کنید. + +--- + +## ۴. بهبود لایه UI و Compose + +### وضعیت فعلی +فایل‌هایی مثل `PersonScreen.kt` و `MainActivity.kt` بسیار طولانی هستند. کامپوننت‌های UI و منطق ناوبری در هم تنیده شده‌اند. + +### پیشنهاد +- **شکستن کامپوننت‌ها:** بخش‌های مختلف صفحه (مانند SearchBar، PersonItem، Dialogs) را به فایل‌های جداگانه در پکیج `ui.components` منتقل کنید. +- **String Resources:** تمام رشته‌های فارسی هاردکد شده (مانند "آیا از حذف قطعی... مطمئن هستید؟") را به فایل `res/values/strings.xml` منتقل کنید. + +--- + +## ۵. پیشنهادات فنی تکمیلی + +- **نوسازی پکیج‌ها:** پکیج‌های `util` و `utils` را ادغام کنید تا ساختار پروژه تمیزتر شود. +- **Supabase Realtime:** با توجه به استفاده از Supabase، مطمئن شوید که از قابلیت Realtime برای همگام‌سازی آنی داده‌ها بین دستگاه‌های مختلف استفاده می‌کنید. +- **Room Migrations:** برای دیتابیس محلی، استراتژی مهاجرت (Migration) را مشخص کنید تا در آپدیت‌های بعدی، داده‌های کاربر پاک نشود. + +--- + +> [!TIP] +> اگر مایل باشید، می‌توانیم با **راه‌اندازی Hilt** یا **انتقال متون به strings.xml** شروع کنیم که تغییراتی کم‌ریسک اما بسیار موثر در تمیزی پروژه هستند. diff --git a/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/implementation_plan.artifact.md b/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/implementation_plan.artifact.md new file mode 100644 index 0000000..07574bd --- /dev/null +++ b/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/implementation_plan.artifact.md @@ -0,0 +1,57 @@ +# برنامه اجرایی: مدرن‌سازی و استانداردسازی پروژه (فاز ۱) + +این برنامه روی دو محور اصلی تمرکز دارد: پیاده‌سازی **Hilt** برای مدیریت وابستگی‌ها و **استانداردسازی متون** برنامه با استفاده از `strings.xml`. + +## Proposed Changes + +### ۱. زیرساخت و مدیریت وابستگی‌ها (Hilt) + +#### [MODIFY] [libs.versions.toml](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/gradle/libs.versions.toml) +- افزودن نسخه‌ها و کتابخانه‌های مورد نیاز برای Hilt. +- افزودن پلاگین Hilt. + +#### [MODIFY] [build.gradle.kts (Project)](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/build.gradle.kts) +- اعمال پلاگین Hilt. + +#### [MODIFY] [build.gradle.kts (App)](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/build.gradle.kts) +- اعمال پلاگین `dagger.hilt.android.plugin`. +- افزودن وابستگی‌های `hilt-android` و `hilt-navigation-compose`. +- تنظیم KSP برای کامپایلر Hilt. + +#### [MODIFY] [PaymentApplication.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/core/PaymentApplication.kt) +- افزودن آنوتیشن `@HiltAndroidApp`. +- حذف مدیریت دستی Repositoryها و Factoryها. + +#### [NEW] [DatabaseModule.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/core/di/DatabaseModule.kt) +- ایجاد ماژول Hilt برای ارائه (Provide) دیتابیس Room و DAOها. + +#### [NEW] [RepositoryModule.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/core/di/RepositoryModule.kt) +- ایجاد ماژول Hilt برای ارائه Repositoryها. + +#### [MODIFY] [ViewModels](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/viewmodel/) +- افزودن `@HiltViewModel` به `PersonViewModel` و `SettingsViewModel`. +- استفاده از `@Inject constructor` برای تزریق وابستگی‌ها. + +#### [MODIFY] [MainActivity.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/MainActivity.kt) +- افزودن آنوتیشن `@AndroidEntryPoint`. +- استفاده از `hiltViewModel()` به جای دستی ساختن ViewModelها. + +--- + +### ۲. استانداردسازی متون (String Resources) + +#### [MODIFY] [strings.xml](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/res/values/strings.xml) +- استخراج و تعریف متون فارسی از UI به فایل XML. + +#### [MODIFY] [Compose Screens](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/ui/screens/) +- جایگزینی متون هاردکد شده با `stringResource(R.string.id)`. + +## Verification Plan + +### Automated Tests +- اجرای `gradle build` برای اطمینان از صحت پیکربندی Hilt. +- بررسی عدم وجود خطای کامپایل در کدهای تولید شده توسط KSP. + +### Manual Verification +- اجرای برنامه و اطمینان از لود شدن صحیح داده‌ها از دیتابیس و شبکه (تایید کارکرد صحیح DI). +- بررسی نمایش صحیح متون در صفحات مختلف. diff --git a/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/walkthrough.artifact.md b/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/walkthrough.artifact.md new file mode 100644 index 0000000..bce8804 --- /dev/null +++ b/.artifacts/15926d7b-894e-47f6-892f-6114218cde2d/walkthrough.artifact.md @@ -0,0 +1,30 @@ +# گزارش نهایی: بازنگری معماری و بهبود زیرساخت (فاز ۲) + +در این فاز، معماری پروژه از حالت یکپارچه و سنگین به حالتی ماژولار و تفکیک‌شده تغییر یافت. فایل `PersonViewModel` که حدود ۱۰۰۰ خط بود به چندین بخش تخصصی تقسیم شد. + +## تغییرات کلیدی + +### ۱. تفکیک وظایف (ViewModel Splitting) +- **AuthViewModel:** مسئولیت کامل احراز هویت (Login/Register/Logout) را بر عهده گرفت. +- **ContactViewModel:** مدیریت جستجوی مخاطبین گوشی، پیشنهادات شماره تماس و ارسال پیامک (SMS) به این کلاس منتقل شد. +- **PersonViewModel:** اکنون فقط بر روی مدیریت داده‌های افراد، پرداخت‌ها و داشبورد تمرکز دارد (حجم کد حدود ۵۰٪ کاهش یافت). + +### ۲. جداسازی منطق از پلتفرم (Android Context Cleanup) +- **SmsManager:** منطق ایجاد Intentهای پیامک و مدیریت صف ارسال گروهی (Bulk SMS) به این کلاس کمکی منتقل شد. +- **ExportManager:** فرآیند تولید گزارش اکسل (CSV) و اشتراک‌گذاری رسیدها مستقل شد. +- **نتیجه:** ViewModelها اکنون مستقل از `Context` اندروید هستند که تست‌نویسی آن‌ها را بسیار آسان می‌کند. + +### ۳. یکپارچه‌سازی و نظم‌دهی (Cleanup) +- **ادغام پکیج‌ها:** پکیج‌های `util` و `utils` در یک پکیج واحد ادغام شدند. +- **مدل‌های متمرکز:** تمام `Events` و `UiStates` به فایل `UiModels.kt` منتقل شدند تا دسترسی به آن‌ها یکپارچه شود. +- **رفع خطاهای UI:** تمام صفحات برنامه (`AuthScreen`, `PersonScreen`, `PaidListScreen`, `PersonDetailScreen`) برای انطباق با ViewModelهای جدید بازنویسی شدند. + +## وضعیت نهایی پروژه +- **Build Status:** موفقیت‌آمیز (تایید شده با `assembleDebug`). +- **Dependency Injection:** استفاده کامل از Hilt در تمام لایه‌ها. +- **Readability:** افزایش چشمگیر خوانایی کد و سهولت در عیب‌یابی. + +--- + +> [!TIP] +> با این ساختار جدید، افزودن ویژگی‌های جدید (مثل ارسال یادآور از طریق پیام‌رسان‌های دیگر یا افزودن فیلترهای جدید به لیست) بسیار سریع‌تر و با ریسک کمتر انجام خواهد شد. diff --git a/.artifacts/b6b8bd31-26e8-4cfd-8648-5c332ef07ef3/implementation_plan.artifact.md b/.artifacts/b6b8bd31-26e8-4cfd-8648-5c332ef07ef3/implementation_plan.artifact.md new file mode 100644 index 0000000..8c4afa9 --- /dev/null +++ b/.artifacts/b6b8bd31-26e8-4cfd-8648-5c332ef07ef3/implementation_plan.artifact.md @@ -0,0 +1,55 @@ +# سیستم آپدیت اجباری و مدیریت دسترسی‌ها + +این طرح شامل پیاده‌سازی مکانیزم بررسی نسخه جدید اپلیکیشن از طریق فایل JSON در گیتهاب و همچنین الزامی کردن دسترسی‌های مورد نیاز برنامه (مشابه پروژه ابزار فروش) در بدو ورود کاربر است. + +## User Review Required + +- **لینک فایل آپدیت:** فعلاً از لینک `https://raw.githubusercontent.com/oqba26/MonthlyPaymentApp/main/update.json` استفاده شده است. لطفاً مطمئن شوید این فایل در مخزن شما وجود دارد. +- **دسترسی‌های اجباری:** دسترسی‌های Contacts، Camera و Storage (برای نسخه‌های قدیمی) به صورت پیش‌فرض اجباری در نظر گرفته شده‌اند. + +## Proposed Changes + +### [Dependencies] + +#### [MODIFY] [libs.versions.toml](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/gradle/libs.versions.toml) +افزودن کتابخانه‌های Ktor برای Content Negotiation و Serialization جهت پردازش فایل JSON آپدیت. + +#### [MODIFY] [build.gradle.kts](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/build.gradle.kts) +اضافه کردن وابستگی‌های جدید به ماژول اپلیکیشن. + +--- + +### [Update System] + +#### [NEW] [UpdateManager.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/util/UpdateManager.kt) +کلاسی برای چک کردن نسخه جدید، دانلود APK و اجرای فرآیند نصب. + +#### [NEW] [UpdateDialog.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/ui/components/UpdateDialog.kt) +رابط کاربری نمایش وجود نسخه جدید و گزارش پیشرفت دانلود. + +--- + +### [Permissions & Manifest] + +#### [NEW] [PermissionDialogs.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/ui/components/PermissionDialogs.kt) +دیالوگ‌های نمایش دسترسی‌های الزامی و اخطار عدم دسترسی. + +#### [MODIFY] [AndroidManifest.xml](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/AndroidManifest.xml) +افزودن مجوز `REQUEST_INSTALL_PACKAGES` و تعریف `FileProvider` برای نصب خودکار فایل APK. + +#### [NEW] [file_paths.xml](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/res/xml/file_paths.xml) +تعریف مسیرهای مجاز برای `FileProvider`. + +--- + +### [Integration] + +#### [MODIFY] [MainActivity.kt](file:///E:/AndroidStudioProjects/MonthlyPaymentApp/app/src/main/java/com/oqba26/monthlypaymentapp/MainActivity.kt) +یکپارچه‌سازی فرآیند بررسی آپدیت و چک کردن دسترسی‌ها در زمان اجرای برنامه. + +## Verification Plan + +### Manual Verification +1. اجرای برنامه و مشاهده دیالوگ دسترسی‌ها (در صورت عدم تایید قبلی). +2. شبیه‌سازی وجود آپدیت جدید با تغییر دستی `versionCode` در کد و بررسی نمایش دیالوگ آپدیت. +3. تست فرآیند دانلود و باز شدن صفحه نصب اندروید. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a8c0049 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,45 @@ +name: Android Release + +on: + push: + tags: + - 'v*' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Decode Keystore + run: | + echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -di > app/release-key.jks + + - name: Build Release APK + env: + RELEASE_STORE_FILE: release-key.jks + RELEASE_STORE_PASSWORD: ${{ secrets.RELEASE_STORE_PASSWORD }} + RELEASE_KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }} + RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }} + run: ./gradlew assembleRelease + + - name: Rename APK + run: | + mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/MonthlyPaymentApp-${{ github.ref_name }}.apk + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + files: app/build/outputs/apk/release/MonthlyPaymentApp-${{ github.ref_name }}.apk + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index aa724b7..0b7c68d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ .externalNativeBuild .cxx local.properties +keystore.properties +*.jks diff --git a/.idea/appInsightsSettings.xml b/.idea/appInsightsSettings.xml deleted file mode 100644 index eca3fe9..0000000 --- a/.idea/appInsightsSettings.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index defe597..ca16a99 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,13 +4,6 @@ diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 0f2d2fa..9180c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -6,7 +6,6 @@