├── .gitignore ├── .idea ├── .gitignore ├── appInsightsSettings.xml ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── compiler.xml ├── deploymentTargetDropDown.xml ├── deploymentTargetSelector.xml ├── gradle.xml ├── kotlinc.xml ├── migrations.xml ├── misc.xml ├── render.experimental.xml ├── sonarlint │ ├── issuestore │ │ ├── 0 │ │ │ ├── 2 │ │ │ │ └── 02e0f91b43914e56b381c75cb14d7fcf19b7e9f8 │ │ │ └── d │ │ │ │ └── 0d8e7838d3f2fe234a3a10839b35ee80b98898f3 │ │ ├── 1 │ │ │ └── c │ │ │ │ └── 1c4dbca9b746ae36cb0065aef0ba358e08c49629 │ │ ├── 2 │ │ │ ├── 1 │ │ │ │ └── 210a312d03a8d19caf92482c6fdf494972b5dcf2 │ │ │ ├── 5 │ │ │ │ ├── 253007b49ba2b6e3446ccf42a363b26d1f0b0270 │ │ │ │ └── 25c8d8e7b764c7dc9fb14a8205c5bd1e7284cccd │ │ │ ├── 9 │ │ │ │ └── 296a5ad6b065ec44a939e2f0e99b8c3d27bdbf75 │ │ │ └── a │ │ │ │ ├── 2ad93705bd93b6449d6930a1fda214b880184abb │ │ │ │ └── 2afbb999f001938c88fa43fc2ef52abf0f8213e4 │ │ ├── 3 │ │ │ ├── 3 │ │ │ │ └── 33358db0268713122a671868ef0f61963cf3cf86 │ │ │ ├── 5 │ │ │ │ └── 35303e02cc755bc2e1b34e9212c4053372231719 │ │ │ └── f │ │ │ │ ├── 3f45aad625da66a26477fa6dfe3228dd240ec1b8 │ │ │ │ └── 3f487939db9c336161b0391ecc164a671a2cfc2d │ │ ├── 4 │ │ │ ├── 3 │ │ │ │ └── 438e405fef7b151d753207de31ac937cf8564aaf │ │ │ ├── 5 │ │ │ │ └── 45cbd57f967fdb4100d570b3623e1fd5722910b9 │ │ │ └── b │ │ │ │ └── 4b9ffac9af65df6df8fb94b3fda3f6f4fac37d7b │ │ ├── 5 │ │ │ ├── 1 │ │ │ │ └── 51e1c5d383dfaa35e0e7e5873a0a99355a86880f │ │ │ ├── 2 │ │ │ │ └── 520450718610a82dd08b2563d6fefe0d651a4a75 │ │ │ ├── 4 │ │ │ │ ├── 5407d55d022116c76b939f7e4e2f8eba0b0f1090 │ │ │ │ └── 54a847b41bc19919791015ac1aed774f41f67b1a │ │ │ ├── a │ │ │ │ └── 5adefc958a038a525982c0d80a80a96131edffe9 │ │ │ └── e │ │ │ │ └── 5e81893db4cd8c30ae320a25bb0719755990d2e9 │ │ ├── 6 │ │ │ ├── 4 │ │ │ │ └── 648cd56f3142e3943d7d11e0ab01ff8dd2e24d26 │ │ │ ├── 8 │ │ │ │ └── 68bf16f3daa9abe470b11f6e2b2e5d6680f7cec6 │ │ │ └── a │ │ │ │ └── 6a179026b0e638423208992f4792382cc930e798 │ │ ├── 7 │ │ │ ├── 4 │ │ │ │ └── 749edfcc96398253e5b3416184e95c46621da850 │ │ │ └── b │ │ │ │ └── 7bcf07d4b97525ce7633414494b39ef1b26df3d0 │ │ ├── 8 │ │ │ ├── 4 │ │ │ │ └── 84d5549a23982257046a8171cef604e68c48468f │ │ │ ├── 7 │ │ │ │ └── 878774a3ed10a02551ba950734dec5395738bfa7 │ │ │ ├── 8 │ │ │ │ └── 883d120fbf9e90346c268ecde616b8843ed87852 │ │ │ ├── c │ │ │ │ └── 8c55c3ccc257e5907959013f99656e4c8ec3903e │ │ │ └── f │ │ │ │ └── 8f0539679561f32ee390b9fa9e8fec5542fa3ffb │ │ ├── 9 │ │ │ ├── 3 │ │ │ │ ├── 933b44566cbfaa88b4d3605f26ff1c10fbab2a94 │ │ │ │ └── 936f66fc2c396ba3193b8172b969828a8f7759ad │ │ │ ├── 5 │ │ │ │ └── 952629cc1c5c2af726b4b692279268db37dd4c70 │ │ │ ├── 9 │ │ │ │ └── 996bca3e8e716a564059d1cb0a6d001f214d27f7 │ │ │ ├── b │ │ │ │ └── 9bb676feabf05972eb353e22953c514f1f578efa │ │ │ ├── d │ │ │ │ └── 9d2a483979ea340ca7cfc5be334b42c41e1a274b │ │ │ └── e │ │ │ │ └── 9e08934d811afe28fbc77aaa3c0d747b94348db9 │ │ ├── a │ │ │ ├── 2 │ │ │ │ └── a206f8bc798024f379b5bc2faebb6d41b300781a │ │ │ ├── 3 │ │ │ │ └── a3869c82993c20101f60bc20b05c68ff89ddca1d │ │ │ ├── 9 │ │ │ │ └── a9a551cb9e61da0ffc819e9df71e8101a760972e │ │ │ ├── a │ │ │ │ └── aa52df6638ac58a910fb6c993bb38a8f0e60263a │ │ │ └── b │ │ │ │ └── ab1fb631156f8ba8fce2d8aeb86bfcab2b39350e │ │ ├── b │ │ │ ├── 5 │ │ │ │ ├── b51b012dd70163ab0473fe877b73db9c0ebf76a9 │ │ │ │ └── b54f4943f66bc017d444d74d56088fa3887e303d │ │ │ └── 8 │ │ │ │ └── b88e7830d497616a16df1ad49085d63106426f67 │ │ ├── c │ │ │ ├── 0 │ │ │ │ └── c0971254e10c963e98e50c3543fe7c1fa44de6ea │ │ │ └── a │ │ │ │ └── ca967bac267fc759b5b94c3ba955e0f767c3bce6 │ │ ├── d │ │ │ ├── 2 │ │ │ │ └── d2a4383452aad84a18429a5844d31330a012a9e6 │ │ │ ├── 7 │ │ │ │ └── d7595319a0658be6f1ed500ad590d42e4b28bc4f │ │ │ ├── 8 │ │ │ │ ├── d85656949e62ba767241b3f9220ee151e32fdc37 │ │ │ │ └── d88a47face5a2a2aae7af6c928a80431efc1c37a │ │ │ ├── a │ │ │ │ └── daba9b6a308b70c919d304894f9117031ac304ca │ │ │ ├── b │ │ │ │ └── dbcff70658daf80b53ce624f6adcaa529df5ed8d │ │ │ ├── d │ │ │ │ └── dd034960c4ee3392bf3cf3bf24a564ddf5461c30 │ │ │ └── f │ │ │ │ └── df215d3d7c2ebb578b989f2aa59dc1efe43747cd │ │ ├── e │ │ │ ├── 5 │ │ │ │ └── e54c33c5ec8ea091807dfb72a15207a9f006d80a │ │ │ ├── 8 │ │ │ │ └── e81f59da05db51bb06566e55cd3df7f99d427ecc │ │ │ ├── 9 │ │ │ │ └── e90031a2ef29d48c1ffa3e6f57047a8512110936 │ │ │ └── a │ │ │ │ ├── ea3eac3f3d7d973e9a35849373358abb538f9a4c │ │ │ │ └── eaa67818a4dd5bd67a7f441c6937483cc65fb2f9 │ │ ├── f │ │ │ └── b │ │ │ │ └── fbe448ebfc3eb2d4e308f6b8b043666f5b57235e │ │ └── index.pb │ └── securityhotspotstore │ │ ├── 0 │ │ ├── 2 │ │ │ └── 02e0f91b43914e56b381c75cb14d7fcf19b7e9f8 │ │ └── d │ │ │ └── 0d8e7838d3f2fe234a3a10839b35ee80b98898f3 │ │ ├── 1 │ │ └── c │ │ │ └── 1c4dbca9b746ae36cb0065aef0ba358e08c49629 │ │ ├── 2 │ │ ├── 1 │ │ │ └── 210a312d03a8d19caf92482c6fdf494972b5dcf2 │ │ ├── 5 │ │ │ ├── 253007b49ba2b6e3446ccf42a363b26d1f0b0270 │ │ │ └── 25c8d8e7b764c7dc9fb14a8205c5bd1e7284cccd │ │ ├── 9 │ │ │ └── 296a5ad6b065ec44a939e2f0e99b8c3d27bdbf75 │ │ └── a │ │ │ ├── 2ad93705bd93b6449d6930a1fda214b880184abb │ │ │ └── 2afbb999f001938c88fa43fc2ef52abf0f8213e4 │ │ ├── 3 │ │ ├── 3 │ │ │ └── 33358db0268713122a671868ef0f61963cf3cf86 │ │ ├── 5 │ │ │ └── 35303e02cc755bc2e1b34e9212c4053372231719 │ │ └── f │ │ │ ├── 3f45aad625da66a26477fa6dfe3228dd240ec1b8 │ │ │ └── 3f487939db9c336161b0391ecc164a671a2cfc2d │ │ ├── 4 │ │ ├── 3 │ │ │ └── 438e405fef7b151d753207de31ac937cf8564aaf │ │ ├── 5 │ │ │ └── 45cbd57f967fdb4100d570b3623e1fd5722910b9 │ │ └── b │ │ │ └── 4b9ffac9af65df6df8fb94b3fda3f6f4fac37d7b │ │ ├── 5 │ │ ├── 1 │ │ │ └── 51e1c5d383dfaa35e0e7e5873a0a99355a86880f │ │ ├── 2 │ │ │ └── 520450718610a82dd08b2563d6fefe0d651a4a75 │ │ ├── 4 │ │ │ ├── 5407d55d022116c76b939f7e4e2f8eba0b0f1090 │ │ │ └── 54a847b41bc19919791015ac1aed774f41f67b1a │ │ ├── a │ │ │ └── 5adefc958a038a525982c0d80a80a96131edffe9 │ │ └── e │ │ │ └── 5e81893db4cd8c30ae320a25bb0719755990d2e9 │ │ ├── 6 │ │ ├── 4 │ │ │ └── 648cd56f3142e3943d7d11e0ab01ff8dd2e24d26 │ │ ├── 8 │ │ │ └── 68bf16f3daa9abe470b11f6e2b2e5d6680f7cec6 │ │ └── a │ │ │ └── 6a179026b0e638423208992f4792382cc930e798 │ │ ├── 7 │ │ ├── 4 │ │ │ └── 749edfcc96398253e5b3416184e95c46621da850 │ │ └── b │ │ │ └── 7bcf07d4b97525ce7633414494b39ef1b26df3d0 │ │ ├── 8 │ │ ├── 4 │ │ │ └── 84d5549a23982257046a8171cef604e68c48468f │ │ ├── 7 │ │ │ └── 878774a3ed10a02551ba950734dec5395738bfa7 │ │ ├── 8 │ │ │ └── 883d120fbf9e90346c268ecde616b8843ed87852 │ │ ├── c │ │ │ └── 8c55c3ccc257e5907959013f99656e4c8ec3903e │ │ └── f │ │ │ └── 8f0539679561f32ee390b9fa9e8fec5542fa3ffb │ │ ├── 9 │ │ ├── 3 │ │ │ ├── 933b44566cbfaa88b4d3605f26ff1c10fbab2a94 │ │ │ └── 936f66fc2c396ba3193b8172b969828a8f7759ad │ │ ├── 5 │ │ │ └── 952629cc1c5c2af726b4b692279268db37dd4c70 │ │ ├── 9 │ │ │ └── 996bca3e8e716a564059d1cb0a6d001f214d27f7 │ │ ├── b │ │ │ └── 9bb676feabf05972eb353e22953c514f1f578efa │ │ ├── d │ │ │ └── 9d2a483979ea340ca7cfc5be334b42c41e1a274b │ │ └── e │ │ │ └── 9e08934d811afe28fbc77aaa3c0d747b94348db9 │ │ ├── a │ │ ├── 2 │ │ │ └── a206f8bc798024f379b5bc2faebb6d41b300781a │ │ ├── 3 │ │ │ └── a3869c82993c20101f60bc20b05c68ff89ddca1d │ │ ├── 9 │ │ │ └── a9a551cb9e61da0ffc819e9df71e8101a760972e │ │ ├── a │ │ │ └── aa52df6638ac58a910fb6c993bb38a8f0e60263a │ │ └── b │ │ │ └── ab1fb631156f8ba8fce2d8aeb86bfcab2b39350e │ │ ├── b │ │ ├── 5 │ │ │ ├── b51b012dd70163ab0473fe877b73db9c0ebf76a9 │ │ │ └── b54f4943f66bc017d444d74d56088fa3887e303d │ │ └── 8 │ │ │ └── b88e7830d497616a16df1ad49085d63106426f67 │ │ ├── c │ │ ├── 0 │ │ │ └── c0971254e10c963e98e50c3543fe7c1fa44de6ea │ │ └── a │ │ │ └── ca967bac267fc759b5b94c3ba955e0f767c3bce6 │ │ ├── d │ │ ├── 2 │ │ │ └── d2a4383452aad84a18429a5844d31330a012a9e6 │ │ ├── 7 │ │ │ └── d7595319a0658be6f1ed500ad590d42e4b28bc4f │ │ ├── 8 │ │ │ ├── d85656949e62ba767241b3f9220ee151e32fdc37 │ │ │ └── d88a47face5a2a2aae7af6c928a80431efc1c37a │ │ ├── a │ │ │ └── daba9b6a308b70c919d304894f9117031ac304ca │ │ ├── b │ │ │ └── dbcff70658daf80b53ce624f6adcaa529df5ed8d │ │ ├── d │ │ │ └── dd034960c4ee3392bf3cf3bf24a564ddf5461c30 │ │ └── f │ │ │ └── df215d3d7c2ebb578b989f2aa59dc1efe43747cd │ │ ├── e │ │ ├── 5 │ │ │ └── e54c33c5ec8ea091807dfb72a15207a9f006d80a │ │ ├── 8 │ │ │ └── e81f59da05db51bb06566e55cd3df7f99d427ecc │ │ ├── 9 │ │ │ └── e90031a2ef29d48c1ffa3e6f57047a8512110936 │ │ └── a │ │ │ ├── ea3eac3f3d7d973e9a35849373358abb538f9a4c │ │ │ └── eaa67818a4dd5bd67a7f441c6937483cc65fb2f9 │ │ ├── f │ │ └── b │ │ │ └── fbe448ebfc3eb2d4e308f6b8b043666f5b57235e │ │ └── index.pb └── vcs.xml ├── KeyPath ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── google-services.json ├── proguard-rules.pro ├── release │ └── app-release.aab ├── schemas │ └── com.armutyus.ninova.roomdb.NinovaLocalDB │ │ └── 1.json └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── armutyus │ │ └── ninova │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ │ └── com │ │ │ └── armutyus │ │ │ └── ninova │ │ │ ├── NinovaApplication.kt │ │ │ ├── constants │ │ │ ├── Cache.kt │ │ │ ├── Constants.kt │ │ │ ├── Response.kt │ │ │ └── Util.kt │ │ │ ├── di │ │ │ ├── AppModule.kt │ │ │ ├── FragmentFactoryModule.kt │ │ │ ├── FragmentKey.kt │ │ │ └── NetworkModule.kt │ │ │ ├── fragmentfactory │ │ │ ├── FragmentFactoryEntryPoint.kt │ │ │ └── NinovaFragmentFactory.kt │ │ │ ├── model │ │ │ ├── googlebooksmodel │ │ │ │ ├── BookDetails.kt │ │ │ │ ├── BookDetailsInfo.kt │ │ │ │ ├── DataModel.kt │ │ │ │ ├── DetailsImageLinks.kt │ │ │ │ ├── GoogleApiBooks.kt │ │ │ │ ├── GoogleBookItemInfo.kt │ │ │ │ └── ImageLinks.kt │ │ │ └── openlibrarymodel │ │ │ │ ├── Author.kt │ │ │ │ ├── BookDetailsResponse.kt │ │ │ │ ├── OpenLibraryResponse.kt │ │ │ │ └── OpenLibraryWork.kt │ │ │ ├── repository │ │ │ ├── FirebaseRepositoryImpl.kt │ │ │ ├── FirebaseRepositoryInterface.kt │ │ │ ├── GoogleBooksRepositoryImpl.kt │ │ │ ├── GoogleBooksRepositoryInterface.kt │ │ │ ├── LocalBooksRepositoryImpl.kt │ │ │ ├── LocalBooksRepositoryInterface.kt │ │ │ ├── OpenLibRepositoryImpl.kt │ │ │ ├── OpenLibRepositoryInterface.kt │ │ │ ├── ShelfRepositoryImpl.kt │ │ │ └── ShelfRepositoryInterface.kt │ │ │ ├── roomdb │ │ │ ├── DataConverter.kt │ │ │ ├── NinovaDao.kt │ │ │ ├── NinovaLocalDB.kt │ │ │ └── entities │ │ │ │ ├── BookShelfCrossRef.kt │ │ │ │ ├── BookWithShelves.kt │ │ │ │ ├── LocalShelf.kt │ │ │ │ └── ShelfWithBooks.kt │ │ │ ├── service │ │ │ ├── GoogleBooksApiService.kt │ │ │ └── OpenLibraryApiService.kt │ │ │ └── ui │ │ │ ├── about │ │ │ └── AboutActivity.kt │ │ │ ├── books │ │ │ ├── BookDetailsActivity.kt │ │ │ ├── BooksFragment.kt │ │ │ ├── BooksViewModel.kt │ │ │ └── adapters │ │ │ │ └── BooksRecyclerViewAdapter.kt │ │ │ ├── discover │ │ │ ├── DiscoverCategoryFragment.kt │ │ │ ├── DiscoverFragment.kt │ │ │ ├── DiscoverViewModel.kt │ │ │ └── adapters │ │ │ │ ├── DiscoverCategoryRecyclerViewAdapter.kt │ │ │ │ └── DiscoverRecyclerViewAdapter.kt │ │ │ ├── login │ │ │ ├── LoginActivity.kt │ │ │ ├── LoginViewModel.kt │ │ │ └── RegisterActivity.kt │ │ │ ├── main │ │ │ └── MainActivity.kt │ │ │ ├── search │ │ │ ├── MainSearchFragment.kt │ │ │ ├── MainSearchViewModel.kt │ │ │ ├── adapters │ │ │ │ ├── GoogleBookRowViewHolder.kt │ │ │ │ ├── LocalBookRowViewHolder.kt │ │ │ │ └── MainSearchRecyclerViewAdapter.kt │ │ │ └── listeners │ │ │ │ └── OnBookAddButtonClickListener.kt │ │ │ ├── settings │ │ │ ├── CustomListPreference.kt │ │ │ ├── SettingsFragment.kt │ │ │ └── SettingsViewModel.kt │ │ │ ├── shelves │ │ │ ├── ShelfWithBooksFragment.kt │ │ │ ├── ShelvesFragment.kt │ │ │ ├── ShelvesViewModel.kt │ │ │ ├── adapters │ │ │ │ ├── BookToShelfRecyclerViewAdapter.kt │ │ │ │ └── ShelvesRecyclerViewAdapter.kt │ │ │ └── listeners │ │ │ │ ├── OnShelfCoverClickListener.kt │ │ │ │ └── OnShelfItemClickListener.kt │ │ │ └── splash │ │ │ ├── SplashRepository.kt │ │ │ └── SplashViewModel.kt │ └── res │ │ ├── drawable-anydpi-v26 │ │ ├── ic_launcher_background.xml │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── anthropology_25.png │ │ ├── architecture_30.png │ │ ├── art_31.png │ │ ├── art_history_32.png │ │ ├── bedtime_42.png │ │ ├── biography_29.png │ │ ├── business_17.png │ │ ├── children_43.png │ │ ├── cookbook_19.png │ │ ├── cooking_18.png │ │ ├── dance_33.png │ │ ├── design_34.png │ │ ├── drama_01.png │ │ ├── example_book.jpg │ │ ├── exercise_21.png │ │ ├── fantasy_02.png │ │ ├── fashion_35.png │ │ ├── film_36.png │ │ ├── gradient_background.xml │ │ ├── graphic_design_37.png │ │ ├── historical_fiction_03.png │ │ ├── history_24.png │ │ ├── home_library.xml │ │ ├── horror_04.png │ │ ├── humor_05.png │ │ ├── ic_action_arrow.xml │ │ ├── ic_add_button.xml │ │ ├── ic_add_button_white.xml │ │ ├── ic_baseline_upload_24.xml │ │ ├── ic_books_in_shelf.xml │ │ ├── ic_dashboard_black_24dp.xml │ │ ├── ic_delete_account.xml │ │ ├── ic_discover.xml │ │ ├── ic_done.xml │ │ ├── ic_error.xml │ │ ├── ic_home_black_24dp.xml │ │ ├── ic_login_email_gray.xml │ │ ├── ic_login_lock_gray.xml │ │ ├── ic_notifications_black_24dp.xml │ │ ├── ic_pages_icon.xml │ │ ├── ic_placeholder_book_icon.xml │ │ ├── ic_readlist.xml │ │ ├── ic_register_account.xml │ │ ├── ic_register_username_gray.xml │ │ ├── ic_release_date.xml │ │ ├── ic_search.xml │ │ ├── ic_settings.xml │ │ ├── ic_shelf_cover.xml │ │ ├── ic_sign_out.xml │ │ ├── ic_sort.xml │ │ ├── ic_switch_account.xml │ │ ├── ic_theme_settings.xml │ │ ├── literature_06.png │ │ ├── magic_07.png │ │ ├── mental_health_20.png │ │ ├── music_38.png │ │ ├── music_theory_39.png │ │ ├── mystery_08.png │ │ ├── nutrition_22.png │ │ ├── painting_40.png │ │ ├── photography_41.png │ │ ├── placeholder_book_icon.jpeg │ │ ├── plays_09.png │ │ ├── poetry_10.png │ │ ├── political_science_27.png │ │ ├── psychology_28.png │ │ ├── religion_26.png │ │ ├── romance_11.png │ │ ├── sci_fi_12.png │ │ ├── science_16.png │ │ ├── self_help_23.png │ │ ├── short_13.png │ │ ├── thriller_14.png │ │ └── young_fiction_15.png │ │ ├── font │ │ └── arista_pro_alternate_regular.ttf │ │ ├── layout │ │ ├── activity_about.xml │ │ ├── activity_book_details.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_register.xml │ │ ├── add_book_to_shelf_bottom_sheet.xml │ │ ├── add_book_to_shelf_row.xml │ │ ├── add_new_shelf_bottom_sheet.xml │ │ ├── book_category_item.xml │ │ ├── books_main_row.xml │ │ ├── custom_dialog_edit_text_layout.xml │ │ ├── custom_dialog_password_layout.xml │ │ ├── discover_category_book_item.xml │ │ ├── fragment_books.xml │ │ ├── fragment_discover.xml │ │ ├── fragment_discover_category.xml │ │ ├── fragment_main_search.xml │ │ ├── fragment_shelf_with_books.xml │ │ ├── fragment_shelves.xml │ │ ├── register_user_bottom_sheet.xml │ │ ├── search_local_book_row.xml │ │ ├── search_main_row.xml │ │ └── shelves_main_row.xml │ │ ├── menu │ │ ├── bottom_nav_menu.xml │ │ └── settings_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── navigation │ │ └── mobile_navigation.xml │ │ ├── raw │ │ ├── hardworking.json │ │ ├── homenotfound.json │ │ ├── searchnotfound.json │ │ ├── sleepingant.json │ │ └── sleepyguy.json │ │ ├── values-es │ │ └── strings.xml │ │ ├── values-fr │ │ └── strings.xml │ │ ├── values-land │ │ └── dimens.xml │ │ ├── values-night │ │ ├── splash.xml │ │ └── themes.xml │ │ ├── values-tr │ │ └── strings.xml │ │ ├── values-w1240dp │ │ └── dimens.xml │ │ ├── values-w600dp │ │ └── dimens.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── circle_image_view.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── splash.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ └── xml │ │ ├── anonymous_preferences.xml │ │ ├── backup_rules.xml │ │ ├── data_extraction_rules.xml │ │ ├── provider_paths.xml │ │ └── root_preferences.xml │ └── test │ └── java │ └── com │ └── armutyus │ └── ninova │ └── ExampleUnitTest.kt ├── build.gradle.kts ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/appInsightsSettings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 45 | 46 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/deploymentTargetDropDown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /.idea/deploymentTargetSelector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/render.experimental.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/0/2/02e0f91b43914e56b381c75cb14d7fcf19b7e9f8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/0/2/02e0f91b43914e56b381c75cb14d7fcf19b7e9f8 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/0/d/0d8e7838d3f2fe234a3a10839b35ee80b98898f3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/0/d/0d8e7838d3f2fe234a3a10839b35ee80b98898f3 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/1/c/1c4dbca9b746ae36cb0065aef0ba358e08c49629: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/1/c/1c4dbca9b746ae36cb0065aef0ba358e08c49629 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/2/1/210a312d03a8d19caf92482c6fdf494972b5dcf2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/2/1/210a312d03a8d19caf92482c6fdf494972b5dcf2 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/2/5/253007b49ba2b6e3446ccf42a363b26d1f0b0270: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/2/5/253007b49ba2b6e3446ccf42a363b26d1f0b0270 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/2/5/25c8d8e7b764c7dc9fb14a8205c5bd1e7284cccd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/2/5/25c8d8e7b764c7dc9fb14a8205c5bd1e7284cccd -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/2/9/296a5ad6b065ec44a939e2f0e99b8c3d27bdbf75: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/2/9/296a5ad6b065ec44a939e2f0e99b8c3d27bdbf75 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/2/a/2ad93705bd93b6449d6930a1fda214b880184abb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/2/a/2ad93705bd93b6449d6930a1fda214b880184abb -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/2/a/2afbb999f001938c88fa43fc2ef52abf0f8213e4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/2/a/2afbb999f001938c88fa43fc2ef52abf0f8213e4 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/3/3/33358db0268713122a671868ef0f61963cf3cf86: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/3/3/33358db0268713122a671868ef0f61963cf3cf86 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/3/5/35303e02cc755bc2e1b34e9212c4053372231719: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/3/5/35303e02cc755bc2e1b34e9212c4053372231719 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/3/f/3f45aad625da66a26477fa6dfe3228dd240ec1b8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/3/f/3f45aad625da66a26477fa6dfe3228dd240ec1b8 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/3/f/3f487939db9c336161b0391ecc164a671a2cfc2d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/3/f/3f487939db9c336161b0391ecc164a671a2cfc2d -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/4/3/438e405fef7b151d753207de31ac937cf8564aaf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/4/3/438e405fef7b151d753207de31ac937cf8564aaf -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/4/5/45cbd57f967fdb4100d570b3623e1fd5722910b9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/4/5/45cbd57f967fdb4100d570b3623e1fd5722910b9 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/4/b/4b9ffac9af65df6df8fb94b3fda3f6f4fac37d7b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/4/b/4b9ffac9af65df6df8fb94b3fda3f6f4fac37d7b -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/1/51e1c5d383dfaa35e0e7e5873a0a99355a86880f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/5/1/51e1c5d383dfaa35e0e7e5873a0a99355a86880f -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/2/520450718610a82dd08b2563d6fefe0d651a4a75: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/5/2/520450718610a82dd08b2563d6fefe0d651a4a75 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/4/5407d55d022116c76b939f7e4e2f8eba0b0f1090: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/5/4/5407d55d022116c76b939f7e4e2f8eba0b0f1090 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/4/54a847b41bc19919791015ac1aed774f41f67b1a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/5/4/54a847b41bc19919791015ac1aed774f41f67b1a -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/a/5adefc958a038a525982c0d80a80a96131edffe9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/5/a/5adefc958a038a525982c0d80a80a96131edffe9 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/e/5e81893db4cd8c30ae320a25bb0719755990d2e9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/5/e/5e81893db4cd8c30ae320a25bb0719755990d2e9 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/4/648cd56f3142e3943d7d11e0ab01ff8dd2e24d26: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/6/4/648cd56f3142e3943d7d11e0ab01ff8dd2e24d26 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/8/68bf16f3daa9abe470b11f6e2b2e5d6680f7cec6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/6/8/68bf16f3daa9abe470b11f6e2b2e5d6680f7cec6 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/a/6a179026b0e638423208992f4792382cc930e798: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/6/a/6a179026b0e638423208992f4792382cc930e798 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/7/4/749edfcc96398253e5b3416184e95c46621da850: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/7/4/749edfcc96398253e5b3416184e95c46621da850 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/7/b/7bcf07d4b97525ce7633414494b39ef1b26df3d0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/7/b/7bcf07d4b97525ce7633414494b39ef1b26df3d0 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/8/4/84d5549a23982257046a8171cef604e68c48468f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/8/4/84d5549a23982257046a8171cef604e68c48468f -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/8/7/878774a3ed10a02551ba950734dec5395738bfa7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/8/7/878774a3ed10a02551ba950734dec5395738bfa7 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/8/8/883d120fbf9e90346c268ecde616b8843ed87852: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/8/8/883d120fbf9e90346c268ecde616b8843ed87852 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/8/c/8c55c3ccc257e5907959013f99656e4c8ec3903e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/8/c/8c55c3ccc257e5907959013f99656e4c8ec3903e -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/8/f/8f0539679561f32ee390b9fa9e8fec5542fa3ffb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/8/f/8f0539679561f32ee390b9fa9e8fec5542fa3ffb -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/9/3/933b44566cbfaa88b4d3605f26ff1c10fbab2a94: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/9/3/933b44566cbfaa88b4d3605f26ff1c10fbab2a94 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/9/3/936f66fc2c396ba3193b8172b969828a8f7759ad: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/9/3/936f66fc2c396ba3193b8172b969828a8f7759ad -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/9/5/952629cc1c5c2af726b4b692279268db37dd4c70: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/9/5/952629cc1c5c2af726b4b692279268db37dd4c70 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/9/9/996bca3e8e716a564059d1cb0a6d001f214d27f7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/9/9/996bca3e8e716a564059d1cb0a6d001f214d27f7 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/9/b/9bb676feabf05972eb353e22953c514f1f578efa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/9/b/9bb676feabf05972eb353e22953c514f1f578efa -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/9/d/9d2a483979ea340ca7cfc5be334b42c41e1a274b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/9/d/9d2a483979ea340ca7cfc5be334b42c41e1a274b -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/9/e/9e08934d811afe28fbc77aaa3c0d747b94348db9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/9/e/9e08934d811afe28fbc77aaa3c0d747b94348db9 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/a/2/a206f8bc798024f379b5bc2faebb6d41b300781a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/a/2/a206f8bc798024f379b5bc2faebb6d41b300781a -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/a/3/a3869c82993c20101f60bc20b05c68ff89ddca1d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/a/3/a3869c82993c20101f60bc20b05c68ff89ddca1d -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/a/9/a9a551cb9e61da0ffc819e9df71e8101a760972e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/a/9/a9a551cb9e61da0ffc819e9df71e8101a760972e -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/a/a/aa52df6638ac58a910fb6c993bb38a8f0e60263a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/a/a/aa52df6638ac58a910fb6c993bb38a8f0e60263a -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/a/b/ab1fb631156f8ba8fce2d8aeb86bfcab2b39350e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/a/b/ab1fb631156f8ba8fce2d8aeb86bfcab2b39350e -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/b/5/b51b012dd70163ab0473fe877b73db9c0ebf76a9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/b/5/b51b012dd70163ab0473fe877b73db9c0ebf76a9 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/b/5/b54f4943f66bc017d444d74d56088fa3887e303d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/b/5/b54f4943f66bc017d444d74d56088fa3887e303d -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/b/8/b88e7830d497616a16df1ad49085d63106426f67: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/b/8/b88e7830d497616a16df1ad49085d63106426f67 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/c/0/c0971254e10c963e98e50c3543fe7c1fa44de6ea: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/c/0/c0971254e10c963e98e50c3543fe7c1fa44de6ea -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/c/a/ca967bac267fc759b5b94c3ba955e0f767c3bce6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/c/a/ca967bac267fc759b5b94c3ba955e0f767c3bce6 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/2/d2a4383452aad84a18429a5844d31330a012a9e6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/d/2/d2a4383452aad84a18429a5844d31330a012a9e6 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/7/d7595319a0658be6f1ed500ad590d42e4b28bc4f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/d/7/d7595319a0658be6f1ed500ad590d42e4b28bc4f -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/8/d85656949e62ba767241b3f9220ee151e32fdc37: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/d/8/d85656949e62ba767241b3f9220ee151e32fdc37 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/8/d88a47face5a2a2aae7af6c928a80431efc1c37a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/d/8/d88a47face5a2a2aae7af6c928a80431efc1c37a -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/a/daba9b6a308b70c919d304894f9117031ac304ca: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/d/a/daba9b6a308b70c919d304894f9117031ac304ca -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/b/dbcff70658daf80b53ce624f6adcaa529df5ed8d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/d/b/dbcff70658daf80b53ce624f6adcaa529df5ed8d -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/d/dd034960c4ee3392bf3cf3bf24a564ddf5461c30: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/d/d/dd034960c4ee3392bf3cf3bf24a564ddf5461c30 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/d/f/df215d3d7c2ebb578b989f2aa59dc1efe43747cd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/d/f/df215d3d7c2ebb578b989f2aa59dc1efe43747cd -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/e/5/e54c33c5ec8ea091807dfb72a15207a9f006d80a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/e/5/e54c33c5ec8ea091807dfb72a15207a9f006d80a -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/e/8/e81f59da05db51bb06566e55cd3df7f99d427ecc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/e/8/e81f59da05db51bb06566e55cd3df7f99d427ecc -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/e/9/e90031a2ef29d48c1ffa3e6f57047a8512110936: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/e/9/e90031a2ef29d48c1ffa3e6f57047a8512110936 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/e/a/ea3eac3f3d7d973e9a35849373358abb538f9a4c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/e/a/ea3eac3f3d7d973e9a35849373358abb538f9a4c -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/e/a/eaa67818a4dd5bd67a7f441c6937483cc65fb2f9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/e/a/eaa67818a4dd5bd67a7f441c6937483cc65fb2f9 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/f/b/fbe448ebfc3eb2d4e308f6b8b043666f5b57235e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/f/b/fbe448ebfc3eb2d4e308f6b8b043666f5b57235e -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/index.pb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/issuestore/index.pb -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/0/2/02e0f91b43914e56b381c75cb14d7fcf19b7e9f8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/0/2/02e0f91b43914e56b381c75cb14d7fcf19b7e9f8 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/0/d/0d8e7838d3f2fe234a3a10839b35ee80b98898f3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/0/d/0d8e7838d3f2fe234a3a10839b35ee80b98898f3 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/1/c/1c4dbca9b746ae36cb0065aef0ba358e08c49629: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/1/c/1c4dbca9b746ae36cb0065aef0ba358e08c49629 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/2/1/210a312d03a8d19caf92482c6fdf494972b5dcf2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/2/1/210a312d03a8d19caf92482c6fdf494972b5dcf2 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/2/5/253007b49ba2b6e3446ccf42a363b26d1f0b0270: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/2/5/253007b49ba2b6e3446ccf42a363b26d1f0b0270 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/2/5/25c8d8e7b764c7dc9fb14a8205c5bd1e7284cccd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/2/5/25c8d8e7b764c7dc9fb14a8205c5bd1e7284cccd -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/2/9/296a5ad6b065ec44a939e2f0e99b8c3d27bdbf75: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/2/9/296a5ad6b065ec44a939e2f0e99b8c3d27bdbf75 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/2/a/2ad93705bd93b6449d6930a1fda214b880184abb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/2/a/2ad93705bd93b6449d6930a1fda214b880184abb -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/2/a/2afbb999f001938c88fa43fc2ef52abf0f8213e4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/2/a/2afbb999f001938c88fa43fc2ef52abf0f8213e4 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/3/3/33358db0268713122a671868ef0f61963cf3cf86: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/3/3/33358db0268713122a671868ef0f61963cf3cf86 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/3/5/35303e02cc755bc2e1b34e9212c4053372231719: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/3/5/35303e02cc755bc2e1b34e9212c4053372231719 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/3/f/3f45aad625da66a26477fa6dfe3228dd240ec1b8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/3/f/3f45aad625da66a26477fa6dfe3228dd240ec1b8 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/3/f/3f487939db9c336161b0391ecc164a671a2cfc2d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/3/f/3f487939db9c336161b0391ecc164a671a2cfc2d -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/4/3/438e405fef7b151d753207de31ac937cf8564aaf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/4/3/438e405fef7b151d753207de31ac937cf8564aaf -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/4/5/45cbd57f967fdb4100d570b3623e1fd5722910b9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/4/5/45cbd57f967fdb4100d570b3623e1fd5722910b9 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/4/b/4b9ffac9af65df6df8fb94b3fda3f6f4fac37d7b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/4/b/4b9ffac9af65df6df8fb94b3fda3f6f4fac37d7b -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/5/1/51e1c5d383dfaa35e0e7e5873a0a99355a86880f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/5/1/51e1c5d383dfaa35e0e7e5873a0a99355a86880f -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/5/2/520450718610a82dd08b2563d6fefe0d651a4a75: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/5/2/520450718610a82dd08b2563d6fefe0d651a4a75 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/5/4/5407d55d022116c76b939f7e4e2f8eba0b0f1090: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/5/4/5407d55d022116c76b939f7e4e2f8eba0b0f1090 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/5/4/54a847b41bc19919791015ac1aed774f41f67b1a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/5/4/54a847b41bc19919791015ac1aed774f41f67b1a -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/5/a/5adefc958a038a525982c0d80a80a96131edffe9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/5/a/5adefc958a038a525982c0d80a80a96131edffe9 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/5/e/5e81893db4cd8c30ae320a25bb0719755990d2e9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/5/e/5e81893db4cd8c30ae320a25bb0719755990d2e9 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/6/4/648cd56f3142e3943d7d11e0ab01ff8dd2e24d26: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/6/4/648cd56f3142e3943d7d11e0ab01ff8dd2e24d26 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/6/8/68bf16f3daa9abe470b11f6e2b2e5d6680f7cec6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/6/8/68bf16f3daa9abe470b11f6e2b2e5d6680f7cec6 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/6/a/6a179026b0e638423208992f4792382cc930e798: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/6/a/6a179026b0e638423208992f4792382cc930e798 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/7/4/749edfcc96398253e5b3416184e95c46621da850: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/7/4/749edfcc96398253e5b3416184e95c46621da850 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/7/b/7bcf07d4b97525ce7633414494b39ef1b26df3d0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/7/b/7bcf07d4b97525ce7633414494b39ef1b26df3d0 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/8/4/84d5549a23982257046a8171cef604e68c48468f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/8/4/84d5549a23982257046a8171cef604e68c48468f -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/8/7/878774a3ed10a02551ba950734dec5395738bfa7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/8/7/878774a3ed10a02551ba950734dec5395738bfa7 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/8/8/883d120fbf9e90346c268ecde616b8843ed87852: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/8/8/883d120fbf9e90346c268ecde616b8843ed87852 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/8/c/8c55c3ccc257e5907959013f99656e4c8ec3903e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/8/c/8c55c3ccc257e5907959013f99656e4c8ec3903e -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/8/f/8f0539679561f32ee390b9fa9e8fec5542fa3ffb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/8/f/8f0539679561f32ee390b9fa9e8fec5542fa3ffb -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/9/3/933b44566cbfaa88b4d3605f26ff1c10fbab2a94: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/9/3/933b44566cbfaa88b4d3605f26ff1c10fbab2a94 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/9/3/936f66fc2c396ba3193b8172b969828a8f7759ad: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/9/3/936f66fc2c396ba3193b8172b969828a8f7759ad -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/9/5/952629cc1c5c2af726b4b692279268db37dd4c70: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/9/5/952629cc1c5c2af726b4b692279268db37dd4c70 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/9/9/996bca3e8e716a564059d1cb0a6d001f214d27f7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/9/9/996bca3e8e716a564059d1cb0a6d001f214d27f7 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/9/b/9bb676feabf05972eb353e22953c514f1f578efa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/9/b/9bb676feabf05972eb353e22953c514f1f578efa -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/9/d/9d2a483979ea340ca7cfc5be334b42c41e1a274b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/9/d/9d2a483979ea340ca7cfc5be334b42c41e1a274b -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/9/e/9e08934d811afe28fbc77aaa3c0d747b94348db9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/9/e/9e08934d811afe28fbc77aaa3c0d747b94348db9 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/a/2/a206f8bc798024f379b5bc2faebb6d41b300781a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/a/2/a206f8bc798024f379b5bc2faebb6d41b300781a -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/a/3/a3869c82993c20101f60bc20b05c68ff89ddca1d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/a/3/a3869c82993c20101f60bc20b05c68ff89ddca1d -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/a/9/a9a551cb9e61da0ffc819e9df71e8101a760972e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/a/9/a9a551cb9e61da0ffc819e9df71e8101a760972e -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/a/a/aa52df6638ac58a910fb6c993bb38a8f0e60263a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/a/a/aa52df6638ac58a910fb6c993bb38a8f0e60263a -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/a/b/ab1fb631156f8ba8fce2d8aeb86bfcab2b39350e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/a/b/ab1fb631156f8ba8fce2d8aeb86bfcab2b39350e -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/b/5/b51b012dd70163ab0473fe877b73db9c0ebf76a9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/b/5/b51b012dd70163ab0473fe877b73db9c0ebf76a9 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/b/5/b54f4943f66bc017d444d74d56088fa3887e303d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/b/5/b54f4943f66bc017d444d74d56088fa3887e303d -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/b/8/b88e7830d497616a16df1ad49085d63106426f67: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/b/8/b88e7830d497616a16df1ad49085d63106426f67 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/c/0/c0971254e10c963e98e50c3543fe7c1fa44de6ea: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/c/0/c0971254e10c963e98e50c3543fe7c1fa44de6ea -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/c/a/ca967bac267fc759b5b94c3ba955e0f767c3bce6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/c/a/ca967bac267fc759b5b94c3ba955e0f767c3bce6 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/d/2/d2a4383452aad84a18429a5844d31330a012a9e6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/d/2/d2a4383452aad84a18429a5844d31330a012a9e6 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/d/7/d7595319a0658be6f1ed500ad590d42e4b28bc4f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/d/7/d7595319a0658be6f1ed500ad590d42e4b28bc4f -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/d/8/d85656949e62ba767241b3f9220ee151e32fdc37: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/d/8/d85656949e62ba767241b3f9220ee151e32fdc37 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/d/8/d88a47face5a2a2aae7af6c928a80431efc1c37a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/d/8/d88a47face5a2a2aae7af6c928a80431efc1c37a -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/d/a/daba9b6a308b70c919d304894f9117031ac304ca: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/d/a/daba9b6a308b70c919d304894f9117031ac304ca -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/d/b/dbcff70658daf80b53ce624f6adcaa529df5ed8d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/d/b/dbcff70658daf80b53ce624f6adcaa529df5ed8d -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/d/d/dd034960c4ee3392bf3cf3bf24a564ddf5461c30: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/d/d/dd034960c4ee3392bf3cf3bf24a564ddf5461c30 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/d/f/df215d3d7c2ebb578b989f2aa59dc1efe43747cd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/d/f/df215d3d7c2ebb578b989f2aa59dc1efe43747cd -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/e/5/e54c33c5ec8ea091807dfb72a15207a9f006d80a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/e/5/e54c33c5ec8ea091807dfb72a15207a9f006d80a -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/e/8/e81f59da05db51bb06566e55cd3df7f99d427ecc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/e/8/e81f59da05db51bb06566e55cd3df7f99d427ecc -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/e/9/e90031a2ef29d48c1ffa3e6f57047a8512110936: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/e/9/e90031a2ef29d48c1ffa3e6f57047a8512110936 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/e/a/ea3eac3f3d7d973e9a35849373358abb538f9a4c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/e/a/ea3eac3f3d7d973e9a35849373358abb538f9a4c -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/e/a/eaa67818a4dd5bd67a7f441c6937483cc65fb2f9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/e/a/eaa67818a4dd5bd67a7f441c6937483cc65fb2f9 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/f/b/fbe448ebfc3eb2d4e308f6b8b043666f5b57235e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/f/b/fbe448ebfc3eb2d4e308f6b8b043666f5b57235e -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/index.pb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/.idea/sonarlint/securityhotspotstore/index.pb -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /KeyPath: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/KeyPath -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ömer Faruk Delibaş 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | readme header 3 |

4 | 5 | # Ninova 6 | Ninova is a bookshelf application similar to IMDb that allows users to search among millions of books using the Google Books API and OpenLibrary API. 7 | 8 | ## Features 9 | Search for books using keywords or phrases 10 | 11 | Discover books by categories 12 | 13 | Save books to your device for offline access 14 | 15 | View book details and reviews 16 | 17 | Take notes or quotes for books 18 | 19 | Data synchronization with firebase 20 | 21 | Ninova is now more colorful with three theme options (six with light-dark options). 22 | 23 | ## Built With 24 | 25 | I tried to use many up-to-date approaches and technologies while developing this application: 26 | 27 | *Firebase 28 | 29 | *Glide 30 | 31 | *Hilt 32 | 33 | *Material 3 34 | 35 | *MVVM 36 | 37 | *Retrofit 38 | 39 | *Room 40 | 41 | ## Screenshots 42 | 43 |

44 | 45 | 46 | 47 |

48 | 49 |

50 | 51 | 52 | 53 |

54 | 55 |

56 | 57 |

58 | 59 | ## Credits 60 | 61 | *[Firebase](https://firebase.google.com/) 62 | *[Glide](https://github.com/bumptech/glide) 63 | *[Google Books API](https://developers.google.com/books) 64 | *[Link Builder](https://github.com/klinker24/Android-TextView-LinkBuilder) 65 | *[Lottie](https://lottiefiles.com/) 66 | *[Retrofit](https://square.github.io/retrofit/) 67 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.jetbrains.kotlin.gradle.tasks.KotlinCompile 2 | 3 | plugins { 4 | alias(libs.plugins.android.application) 5 | alias(libs.plugins.kotlin.android) 6 | alias(libs.plugins.dagger.hilt) 7 | alias(libs.plugins.ksp) 8 | alias(libs.plugins.androidx.navigation.safe.args) 9 | alias(libs.plugins.firebase.crashlytics.gradle) 10 | alias(libs.plugins.google.services) 11 | } 12 | 13 | android { 14 | compileSdk = 34 15 | 16 | defaultConfig { 17 | applicationId = "com.armutyus.ninova" 18 | minSdk = 26 19 | targetSdk = 34 20 | versionCode = 8 21 | versionName = "1.1.2" 22 | 23 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" 24 | 25 | javaCompileOptions { 26 | annotationProcessorOptions { 27 | arguments += mapOf("room.schemaLocation" to "$projectDir/schemas") 28 | } 29 | } 30 | 31 | } 32 | 33 | buildTypes { 34 | release { 35 | isMinifyEnabled = false 36 | proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") 37 | } 38 | } 39 | 40 | compileOptions { 41 | sourceCompatibility = JavaVersion.VERSION_1_8 42 | targetCompatibility = JavaVersion.VERSION_1_8 43 | } 44 | 45 | tasks.withType { 46 | kotlinOptions.jvmTarget = "1.8" 47 | } 48 | 49 | buildFeatures { 50 | viewBinding = true 51 | } 52 | 53 | namespace = "com.armutyus.ninova" 54 | } 55 | 56 | dependencies { 57 | implementation(libs.androidx.core.ktx) 58 | implementation(libs.androidx.appcompat) 59 | implementation(libs.material) 60 | implementation(libs.androidx.constraintlayout) 61 | implementation(libs.androidx.annotation) 62 | 63 | implementation(libs.androidx.lifecycle.extensions) 64 | implementation(libs.androidx.lifecycle.runtime.ktx) 65 | implementation(libs.androidx.lifecycle.livedata.ktx) 66 | implementation(libs.androidx.lifecycle.viewmodel.ktx) 67 | 68 | implementation(libs.androidx.navigation.fragment.ktx) 69 | implementation(libs.androidx.navigation.ui.ktx) 70 | implementation(libs.androidx.navigation.runtime.ktx) 71 | 72 | implementation(libs.androidx.core.splashscreen) 73 | 74 | implementation(libs.lottie) 75 | 76 | implementation(libs.hilt.android) 77 | ksp(libs.hilt.android.compiler) 78 | 79 | implementation(libs.kotlinx.coroutines.core) 80 | implementation(libs.kotlinx.coroutines.android) 81 | implementation(libs.kotlinx.coroutines.play.services) 82 | 83 | implementation(libs.androidx.activity.ktx) 84 | implementation(libs.androidx.viewpager2) 85 | implementation(libs.androidx.fragment.ktx) 86 | implementation(libs.androidx.recyclerview) 87 | implementation(libs.androidx.legacy.support.v4) 88 | implementation(libs.androidx.preference.ktx) 89 | 90 | implementation(libs.retrofit) 91 | implementation(libs.converter.gson) 92 | 93 | implementation(libs.glide) 94 | ksp(libs.compiler) 95 | 96 | implementation(libs.link.builder) 97 | 98 | implementation(platform(libs.firebase.bom)) 99 | implementation(libs.bundles.firebase) 100 | 101 | implementation(libs.androidx.room.runtime) 102 | ksp(libs.androidx.room.compiler) 103 | implementation(libs.androidx.room.ktx) 104 | 105 | testImplementation(libs.junit) 106 | androidTestImplementation(libs.androidx.junit) 107 | androidTestImplementation(libs.androidx.espresso.core) 108 | } -------------------------------------------------------------------------------- /app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "1053365433940", 4 | "project_id": "ninova-bookshelf-app", 5 | "storage_bucket": "ninova-bookshelf-app.appspot.com" 6 | }, 7 | "client": [ 8 | { 9 | "client_info": { 10 | "mobilesdk_app_id": "1:1053365433940:android:87bf5f53d4dfbf6b461fc1", 11 | "android_client_info": { 12 | "package_name": "com.armutyus.ninova" 13 | } 14 | }, 15 | "oauth_client": [ 16 | { 17 | "client_id": "1053365433940-1ap27nlvt0pbdln8jcn14tv03nsutokj.apps.googleusercontent.com", 18 | "client_type": 3 19 | } 20 | ], 21 | "api_key": [ 22 | { 23 | "current_key": "AIzaSyBAGdLH3cL4VGrYfejOIuzkhTpP72VYT5I" 24 | } 25 | ], 26 | "services": { 27 | "appinvite_service": { 28 | "other_platform_oauth_client": [ 29 | { 30 | "client_id": "1053365433940-1ap27nlvt0pbdln8jcn14tv03nsutokj.apps.googleusercontent.com", 31 | "client_type": 3 32 | } 33 | ] 34 | } 35 | } 36 | } 37 | ], 38 | "configuration_version": "1" 39 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle.kts. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/release/app-release.aab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/release/app-release.aab -------------------------------------------------------------------------------- /app/src/androidTest/java/com/armutyus/ninova/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.armutyus.ninova", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 25 | 33 | 41 | 48 | 55 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/NinovaApplication.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova 2 | 3 | import android.app.Application 4 | import dagger.hilt.android.HiltAndroidApp 5 | 6 | @HiltAndroidApp 7 | class NinovaApplication : Application() { 8 | companion object { 9 | lateinit var instance: NinovaApplication private set 10 | } 11 | 12 | override fun onCreate() { 13 | super.onCreate() 14 | instance = this 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/constants/Cache.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.constants 2 | 3 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 4 | import com.armutyus.ninova.model.openlibrarymodel.OpenLibraryWork 5 | import com.armutyus.ninova.roomdb.entities.LocalShelf 6 | 7 | object Cache { 8 | var currentGoogleBook: DataModel.GoogleBookItem? = null 9 | var currentLocalBook: DataModel.LocalBook? = null 10 | var currentOpenLibBook: OpenLibraryWork? = null 11 | var currentOpenLibBookCategory: List? = null 12 | var currentShelf: LocalShelf? = null 13 | var currentBookIdExtra: String? = null 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/constants/Response.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.constants 2 | 3 | sealed class Response { 4 | object Loading : Response() 5 | 6 | data class Success( 7 | val data: T 8 | ) : Response() 9 | 10 | data class Failure( 11 | val errorMessage: String 12 | ) : Response() 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/di/AppModule.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.di 2 | 3 | import android.app.Application 4 | import android.content.Context 5 | import android.content.Intent 6 | import androidx.room.Room 7 | import com.armutyus.ninova.constants.Constants.ABOUT_INTENT 8 | import com.armutyus.ninova.constants.Constants.BOOK_DETAILS_INTENT 9 | import com.armutyus.ninova.constants.Constants.LOGIN_INTENT 10 | import com.armutyus.ninova.constants.Constants.MAIN_INTENT 11 | import com.armutyus.ninova.constants.Constants.REGISTER_INTENT 12 | import com.armutyus.ninova.roomdb.NinovaLocalDB 13 | import com.armutyus.ninova.ui.about.AboutActivity 14 | import com.armutyus.ninova.ui.books.BookDetailsActivity 15 | import com.armutyus.ninova.ui.login.LoginActivity 16 | import com.armutyus.ninova.ui.login.RegisterActivity 17 | import com.armutyus.ninova.ui.main.MainActivity 18 | import dagger.Module 19 | import dagger.Provides 20 | import dagger.hilt.InstallIn 21 | import dagger.hilt.android.qualifiers.ApplicationContext 22 | import dagger.hilt.components.SingletonComponent 23 | import javax.inject.Named 24 | import javax.inject.Singleton 25 | 26 | @Module 27 | @InstallIn(SingletonComponent::class) 28 | object AppModule { 29 | 30 | @Provides 31 | fun provideContext(application: Application): Context { 32 | return application.applicationContext 33 | } 34 | 35 | @Provides 36 | @Named(LOGIN_INTENT) 37 | fun provideAuthIntent(context: Context): Intent { 38 | return Intent(context, LoginActivity::class.java) 39 | } 40 | 41 | @Provides 42 | @Named(MAIN_INTENT) 43 | fun provideMainIntent(context: Context): Intent { 44 | return Intent(context, MainActivity::class.java) 45 | } 46 | 47 | @Provides 48 | @Named(REGISTER_INTENT) 49 | fun provideRegisterIntent(context: Context): Intent { 50 | return Intent(context, RegisterActivity::class.java) 51 | } 52 | 53 | @Provides 54 | @Named(ABOUT_INTENT) 55 | fun provideAboutIntent(context: Context): Intent { 56 | return Intent(context, AboutActivity::class.java) 57 | } 58 | 59 | @Provides 60 | @Named(BOOK_DETAILS_INTENT) 61 | fun provideBookDetailsIntent(context: Context): Intent { 62 | return Intent(context, BookDetailsActivity::class.java) 63 | } 64 | 65 | @Provides 66 | @Singleton 67 | fun injectLocalBooksDatabase(@ApplicationContext context: Context) = Room.databaseBuilder( 68 | context, NinovaLocalDB::class.java, "NinovaLocalDB" 69 | ).build() 70 | 71 | @Provides 72 | @Singleton 73 | fun injectNinovaDao(database: NinovaLocalDB) = database.ninovaDao() 74 | 75 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/di/FragmentFactoryModule.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.di 2 | 3 | import androidx.fragment.app.Fragment 4 | import com.armutyus.ninova.ui.books.BooksFragment 5 | import com.armutyus.ninova.ui.discover.DiscoverCategoryFragment 6 | import com.armutyus.ninova.ui.discover.DiscoverFragment 7 | import com.armutyus.ninova.ui.search.MainSearchFragment 8 | import com.armutyus.ninova.ui.settings.SettingsFragment 9 | import com.armutyus.ninova.ui.shelves.ShelfWithBooksFragment 10 | import com.armutyus.ninova.ui.shelves.ShelvesFragment 11 | import dagger.Binds 12 | import dagger.Module 13 | import dagger.hilt.InstallIn 14 | import dagger.hilt.components.SingletonComponent 15 | import dagger.multibindings.IntoMap 16 | 17 | @Module 18 | @InstallIn(SingletonComponent::class) 19 | abstract class FragmentFactoryModule { 20 | 21 | @Binds 22 | @IntoMap 23 | @FragmentKey(BooksFragment::class) 24 | abstract fun bindBooksFragment(fragment: BooksFragment): Fragment 25 | 26 | @Binds 27 | @IntoMap 28 | @FragmentKey(DiscoverFragment::class) 29 | abstract fun bindDiscoverFragment(fragment: DiscoverFragment): Fragment 30 | 31 | @Binds 32 | @IntoMap 33 | @FragmentKey(DiscoverCategoryFragment::class) 34 | abstract fun bindDiscoverCategoryFragment(fragment: DiscoverCategoryFragment): Fragment 35 | 36 | @Binds 37 | @IntoMap 38 | @FragmentKey(ShelvesFragment::class) 39 | abstract fun bindShelvesFragment(fragment: ShelvesFragment): Fragment 40 | 41 | @Binds 42 | @IntoMap 43 | @FragmentKey(MainSearchFragment::class) 44 | abstract fun bindMainSearchFragment(fragment: MainSearchFragment): Fragment 45 | 46 | @Binds 47 | @IntoMap 48 | @FragmentKey(SettingsFragment::class) 49 | abstract fun bindSettingsFragment(fragment: SettingsFragment): Fragment 50 | 51 | @Binds 52 | @IntoMap 53 | @FragmentKey(ShelfWithBooksFragment::class) 54 | abstract fun bindShelfWithBooksFragment(fragment: ShelfWithBooksFragment): Fragment 55 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/di/FragmentKey.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.di 2 | 3 | import androidx.fragment.app.Fragment 4 | import dagger.MapKey 5 | import kotlin.reflect.KClass 6 | 7 | @MapKey 8 | @Retention(AnnotationRetention.RUNTIME) 9 | annotation class FragmentKey(val value: KClass) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/fragmentfactory/FragmentFactoryEntryPoint.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.fragmentfactory 2 | 3 | import dagger.hilt.EntryPoint 4 | import dagger.hilt.InstallIn 5 | import dagger.hilt.android.components.ActivityComponent 6 | 7 | @EntryPoint 8 | @InstallIn(ActivityComponent::class) 9 | fun interface NinovaFragmentFactoryEntryPoint { 10 | fun getFragmentFactory(): NinovaFragmentFactory 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/fragmentfactory/NinovaFragmentFactory.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.fragmentfactory 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentFactory 5 | import javax.inject.Inject 6 | import javax.inject.Provider 7 | import javax.inject.Singleton 8 | 9 | @Singleton 10 | class NinovaFragmentFactory @Inject constructor( 11 | private val providerMap: Map, @JvmSuppressWildcards Provider> 12 | ) : FragmentFactory() { 13 | 14 | override fun instantiate(classLoader: ClassLoader, className: String): Fragment { 15 | val fragmentClass = loadFragmentClass(classLoader, className) 16 | 17 | val creator = providerMap[fragmentClass] ?: providerMap.entries.firstOrNull { 18 | fragmentClass.isAssignableFrom(it.key) 19 | }?.value 20 | 21 | return creator?.get() ?: super.instantiate(classLoader, className) 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/googlebooksmodel/BookDetails.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.googlebooksmodel 2 | 3 | data class BookDetails( 4 | val volumeInfo: BookDetailsInfo, 5 | val id: String 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/googlebooksmodel/BookDetailsInfo.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.googlebooksmodel 2 | 3 | data class BookDetailsInfo( 4 | val authors: List?, 5 | val categories: List?, 6 | val description: String?, 7 | val imageLinks: DetailsImageLinks?, 8 | val pageCount: Int?, 9 | val publishedDate: String?, 10 | val publisher: String?, 11 | val subtitle: String?, 12 | val title: String? 13 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/googlebooksmodel/DataModel.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.googlebooksmodel 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import com.armutyus.ninova.ui.books.BooksViewModel 6 | 7 | sealed class DataModel { 8 | 9 | data class GoogleBookItem( 10 | val id: String?, 11 | val volumeInfo: GoogleBookItemInfo? 12 | ) : DataModel() { 13 | fun isBookAddedCheck(booksViewModel: BooksViewModel): Boolean { 14 | val searchBookList = booksViewModel.localBookList.value?.firstOrNull { it.bookId == id } 15 | return searchBookList != null 16 | } 17 | } 18 | 19 | @Entity(tableName = "Book") 20 | data class LocalBook( 21 | @PrimaryKey(autoGenerate = false) var bookId: String, 22 | var bookAuthors: List?, 23 | var bookCategories: List?, 24 | var bookCoverSmallThumbnail: String?, 25 | var bookCoverThumbnail: String?, 26 | var bookDescription: String?, 27 | var bookNotes: String?, 28 | var bookPages: String?, 29 | var bookPublishedDate: String?, 30 | var bookPublisher: String?, 31 | var bookSubtitle: String?, 32 | var bookTitle: String? 33 | ) : DataModel() { 34 | constructor() : this( 35 | "", listOf(), listOf(), 36 | "", "", "", 37 | "", "", "", 38 | "", "", "" 39 | ) 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/googlebooksmodel/DetailsImageLinks.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.googlebooksmodel 2 | 3 | data class DetailsImageLinks( 4 | val smallThumbnail: String?, 5 | val thumbnail: String?, 6 | val small: String?, 7 | val medium: String?, 8 | val large: String?, 9 | val extraLarge: String? 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/googlebooksmodel/GoogleApiBooks.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.googlebooksmodel 2 | 3 | data class GoogleApiBooks( 4 | val items: List?, 5 | val kind: String, 6 | val totalItems: Int 7 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/googlebooksmodel/GoogleBookItemInfo.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.googlebooksmodel 2 | 3 | data class GoogleBookItemInfo( 4 | val authors: List?, 5 | val categories: List?, 6 | val description: String?, 7 | val imageLinks: ImageLinks?, 8 | val pageCount: Int?, 9 | val publishedDate: String?, 10 | val publisher: String?, 11 | val subtitle: String?, 12 | val title: String? 13 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/googlebooksmodel/ImageLinks.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.googlebooksmodel 2 | 3 | data class ImageLinks( 4 | val smallThumbnail: String?, 5 | val thumbnail: String? 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/openlibrarymodel/Author.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.openlibrarymodel 2 | 3 | data class Author( 4 | val key: String, // This is key for author so that we can get author details from open library. 5 | val name: String 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/openlibrarymodel/BookDetailsResponse.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.openlibrarymodel 2 | 3 | sealed class BookDetailsResponse { 4 | 5 | data class BookKeyResponse( 6 | val description: String? 7 | ) 8 | 9 | data class BookLendingKeyResponse( 10 | val number_of_pages: String?, 11 | val publishers: List? 12 | ) 13 | 14 | data class CombinedResponse( 15 | val description: String? = null, 16 | val number_of_pages: String? = null, 17 | val publishers: List? = null, 18 | val loading: Boolean = false, 19 | val keyError: String? = null, 20 | val lendingKeyError: String? = null 21 | ) 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/openlibrarymodel/OpenLibraryResponse.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.openlibrarymodel 2 | 3 | data class OpenLibraryResponse( 4 | val work_count: Int, 5 | val works: List 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/model/openlibrarymodel/OpenLibraryWork.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.model.openlibrarymodel 2 | 3 | import com.armutyus.ninova.ui.books.BooksViewModel 4 | 5 | data class OpenLibraryWork( 6 | val authors: List, 7 | val cover_id: String, 8 | val first_publish_year: Int, 9 | val key: String, // This is the key for book itself. Get description from Works API 10 | val lending_edition: String, // This is the key for book itself. Get publisher and pages from Books API 11 | val title: String 12 | ) { 13 | fun isBookAddedCheck(booksViewModel: BooksViewModel): Boolean { 14 | val bookId = key.substringAfterLast("/") + lending_edition 15 | val searchBookList = booksViewModel.localBookList.value?.firstOrNull { it.bookId == bookId } 16 | return searchBookList != null 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/repository/FirebaseRepositoryInterface.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.repository 2 | 3 | import android.net.Uri 4 | import com.armutyus.ninova.constants.Response 5 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 6 | import com.armutyus.ninova.roomdb.entities.BookShelfCrossRef 7 | import com.armutyus.ninova.roomdb.entities.LocalShelf 8 | import com.google.firebase.auth.AuthCredential 9 | 10 | interface FirebaseRepositoryInterface { 11 | 12 | suspend fun signInWithEmailPassword(email: String, password: String): Response 13 | 14 | suspend fun signInAnonymous(): Response 15 | 16 | suspend fun anonymousToPermanent(credential: AuthCredential): Response 17 | 18 | suspend fun signUpWithEmailPassword(email: String, password: String): Response 19 | 20 | suspend fun createUserInFirestore(): Response 21 | 22 | suspend fun deleteUserBookFromFirestore(bookId: String): Response 23 | 24 | suspend fun deleteUserCrossRefFromFirestore(crossRefId: String): Response 25 | 26 | suspend fun deleteUserShelfFromFirestore(shelfId: String): Response 27 | 28 | suspend fun deleteUserPermanently(): Response 29 | 30 | suspend fun downloadUserBooksFromFirestore(): Response> 31 | 32 | suspend fun downloadUserShelvesFromFirestore(): Response> 33 | 34 | suspend fun downloadUserCrossRefFromFirestore(): Response> 35 | 36 | suspend fun uploadCustomBookCoverToFirestore(uri: Uri): Response 37 | 38 | suspend fun uploadUserBooksToFirestore(localBook: DataModel.LocalBook): Response 39 | 40 | suspend fun uploadCustomShelfCoverToFirestore(uri: Uri): Response 41 | 42 | suspend fun uploadUserShelvesToFirestore(shelf: LocalShelf): Response 43 | 44 | suspend fun uploadUserCrossRefToFirestore(bookShelfCrossRef: BookShelfCrossRef): Response 45 | 46 | suspend fun signOut(): Response 47 | 48 | suspend fun reAuthUser(credential: AuthCredential): Response 49 | 50 | suspend fun changeUserEmail(email: String): Response 51 | 52 | suspend fun changeUserPassword(password: String): Response 53 | 54 | suspend fun sendResetPassword(email: String): Response 55 | 56 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/repository/GoogleBooksRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.repository 2 | 3 | import com.armutyus.ninova.R 4 | import com.armutyus.ninova.constants.Response 5 | import com.armutyus.ninova.constants.Util.Companion.toLocalizedString 6 | import com.armutyus.ninova.model.googlebooksmodel.BookDetails 7 | import com.armutyus.ninova.model.googlebooksmodel.GoogleApiBooks 8 | import com.armutyus.ninova.service.GoogleBooksApiService 9 | import kotlinx.coroutines.flow.Flow 10 | import kotlinx.coroutines.flow.catch 11 | import kotlinx.coroutines.flow.flow 12 | import javax.inject.Inject 13 | 14 | class GoogleBooksRepositoryImpl @Inject constructor( 15 | private val googleBooksApiService: GoogleBooksApiService 16 | ) : GoogleBooksRepositoryInterface { 17 | 18 | override fun getBookDetails(bookId: String): Flow> = 19 | flow { 20 | emit(Response.Loading) 21 | val response = googleBooksApiService.getBookDetails(bookId) 22 | if (response.isSuccessful) { 23 | response.body()?.let { 24 | return@let emit(Response.Success(it)) 25 | } 26 | ?: emit(Response.Failure(R.string.something_went_wrong.toLocalizedString())) 27 | } else { 28 | emit(Response.Failure(R.string.something_went_wrong.toLocalizedString())) 29 | } 30 | }.catch { 31 | emit(Response.Failure(R.string.error_with_message.toLocalizedString(it.localizedMessage))) 32 | } 33 | 34 | override fun searchBooksFromApi(searchQuery: String): Flow> = 35 | flow { 36 | emit(Response.Loading) 37 | val response = googleBooksApiService.searchBooks(searchQuery) 38 | if (response.isSuccessful) { 39 | response.body()?.let { 40 | return@let emit(Response.Success(it)) 41 | } 42 | ?: emit(Response.Failure(R.string.something_went_wrong.toLocalizedString())) 43 | } else { 44 | emit(Response.Failure(R.string.something_went_wrong.toLocalizedString())) 45 | } 46 | }.catch { 47 | emit(Response.Failure(R.string.error_with_message.toLocalizedString(it.localizedMessage))) 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/repository/GoogleBooksRepositoryInterface.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.repository 2 | 3 | import com.armutyus.ninova.constants.Response 4 | import com.armutyus.ninova.model.googlebooksmodel.BookDetails 5 | import com.armutyus.ninova.model.googlebooksmodel.GoogleApiBooks 6 | import kotlinx.coroutines.flow.Flow 7 | 8 | interface GoogleBooksRepositoryInterface { 9 | 10 | fun getBookDetails(bookId: String): Flow> 11 | 12 | fun searchBooksFromApi(searchQuery: String): Flow> 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/repository/LocalBooksRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.repository 2 | 3 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 4 | import com.armutyus.ninova.roomdb.NinovaDao 5 | import com.armutyus.ninova.roomdb.entities.BookShelfCrossRef 6 | import com.armutyus.ninova.roomdb.entities.BookWithShelves 7 | import kotlinx.coroutines.CoroutineDispatcher 8 | import kotlinx.coroutines.Dispatchers 9 | import kotlinx.coroutines.withContext 10 | import javax.inject.Inject 11 | 12 | class LocalBooksRepositoryImpl @Inject constructor( 13 | private val ninovaDao: NinovaDao, 14 | private val coroutineContext: CoroutineDispatcher = Dispatchers.IO 15 | ) : LocalBooksRepositoryInterface { 16 | 17 | override suspend fun searchLocalBooks(searchString: String): List = 18 | withContext(coroutineContext) { 19 | ninovaDao.searchLocalBooks(searchString) 20 | } 21 | 22 | override suspend fun delete(localBook: DataModel.LocalBook) = withContext(coroutineContext) { 23 | ninovaDao.deleteBook(localBook) 24 | } 25 | 26 | override suspend fun deleteBookById(id: String) = withContext(coroutineContext) { 27 | ninovaDao.deleteBookById(id) 28 | } 29 | 30 | override suspend fun insert(localBook: DataModel.LocalBook) = withContext(coroutineContext) { 31 | ninovaDao.insertBook(localBook) 32 | } 33 | 34 | override suspend fun update(localBook: DataModel.LocalBook) = withContext(coroutineContext) { 35 | ninovaDao.updateBook(localBook) 36 | } 37 | 38 | override suspend fun getLocalBooks(): List = 39 | withContext(coroutineContext) { 40 | ninovaDao.getLocalBooks().sortedBy { it.bookTitle } 41 | } 42 | 43 | override suspend fun getBookWithShelves(bookId: String): List = 44 | withContext(coroutineContext) { 45 | ninovaDao.getShelvesOfBook(bookId) 46 | } 47 | 48 | override suspend fun getBookShelfCrossRef(): List = 49 | withContext(coroutineContext) { 50 | ninovaDao.getBookShelfCrossRef() 51 | } 52 | 53 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/repository/LocalBooksRepositoryInterface.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.repository 2 | 3 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 4 | import com.armutyus.ninova.roomdb.entities.BookShelfCrossRef 5 | import com.armutyus.ninova.roomdb.entities.BookWithShelves 6 | 7 | interface LocalBooksRepositoryInterface { 8 | 9 | suspend fun delete(localBook: DataModel.LocalBook) 10 | 11 | suspend fun deleteBookById(id: String) 12 | 13 | suspend fun insert(localBook: DataModel.LocalBook) 14 | 15 | suspend fun update(localBook: DataModel.LocalBook) 16 | 17 | suspend fun getLocalBooks(): List 18 | 19 | suspend fun searchLocalBooks(searchString: String): List 20 | 21 | suspend fun getBookWithShelves(bookId: String): List 22 | 23 | suspend fun getBookShelfCrossRef(): List 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/repository/OpenLibRepositoryInterface.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.repository 2 | 3 | import com.armutyus.ninova.constants.Response 4 | import com.armutyus.ninova.model.openlibrarymodel.BookDetailsResponse 5 | import com.armutyus.ninova.model.openlibrarymodel.OpenLibraryResponse 6 | import kotlinx.coroutines.flow.Flow 7 | 8 | interface OpenLibRepositoryInterface { 9 | 10 | fun getBooksByCategory( 11 | category: String, 12 | offset: Int 13 | ): Flow> 14 | 15 | fun getBookKeyDetails(bookKey: String): Flow> 16 | 17 | fun getBookLendingDetails(bookLendingKey: String): Flow> 18 | 19 | fun getRandomBookCoverForCategory(category: String): Flow> 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/repository/ShelfRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.repository 2 | 3 | import com.armutyus.ninova.roomdb.NinovaDao 4 | import com.armutyus.ninova.roomdb.entities.BookShelfCrossRef 5 | import com.armutyus.ninova.roomdb.entities.LocalShelf 6 | import com.armutyus.ninova.roomdb.entities.ShelfWithBooks 7 | import kotlinx.coroutines.Dispatchers 8 | import kotlinx.coroutines.withContext 9 | import java.text.SimpleDateFormat 10 | import java.util.Locale 11 | import javax.inject.Inject 12 | import kotlin.coroutines.CoroutineContext 13 | 14 | class ShelfRepositoryImpl @Inject constructor( 15 | private val ninovaDao: NinovaDao, 16 | private val coroutineContext: CoroutineContext = Dispatchers.IO 17 | ) : ShelfRepositoryInterface { 18 | override suspend fun insert(localShelf: LocalShelf) = withContext(coroutineContext) { 19 | ninovaDao.insertShelf(localShelf) 20 | } 21 | 22 | override suspend fun update(localShelf: LocalShelf) = withContext(coroutineContext) { 23 | ninovaDao.updateShelf(localShelf) 24 | } 25 | 26 | override suspend fun delete(localShelf: LocalShelf) = withContext(coroutineContext) { 27 | ninovaDao.deleteShelf(localShelf) 28 | } 29 | 30 | override suspend fun getLocalShelves(): List = withContext(coroutineContext) { 31 | ninovaDao.getLocalShelves().sortedByDescending { 32 | if (it.createdAt!!.length > 10) { 33 | it.createdAt 34 | } else { 35 | val inputFormat = 36 | SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).parse(it.createdAt!!) 37 | val outputFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) 38 | outputFormat.format(inputFormat!!) 39 | } 40 | } 41 | } 42 | 43 | override suspend fun searchLocalShelves(searchString: String): List = 44 | withContext(coroutineContext) { 45 | ninovaDao.searchLocalShelf(searchString) 46 | } 47 | 48 | override suspend fun insertBookShelfCrossRef(crossRef: BookShelfCrossRef) = 49 | withContext(coroutineContext) { 50 | ninovaDao.insertBookShelfCrossRef(crossRef) 51 | } 52 | 53 | override suspend fun deleteBookShelfCrossRef(crossRef: BookShelfCrossRef) = 54 | withContext(coroutineContext) { 55 | ninovaDao.deleteBookShelfCrossRef(crossRef) 56 | } 57 | 58 | override suspend fun getShelfWithBooks(): List = withContext(coroutineContext) { 59 | ninovaDao.getBooksOfShelf() 60 | } 61 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/repository/ShelfRepositoryInterface.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.repository 2 | 3 | import com.armutyus.ninova.roomdb.entities.BookShelfCrossRef 4 | import com.armutyus.ninova.roomdb.entities.LocalShelf 5 | import com.armutyus.ninova.roomdb.entities.ShelfWithBooks 6 | 7 | interface ShelfRepositoryInterface { 8 | 9 | suspend fun insert(localShelf: LocalShelf) 10 | 11 | suspend fun update(localShelf: LocalShelf) 12 | 13 | suspend fun delete(localShelf: LocalShelf) 14 | 15 | suspend fun getLocalShelves(): List 16 | 17 | suspend fun searchLocalShelves(searchString: String): List 18 | 19 | suspend fun insertBookShelfCrossRef(crossRef: BookShelfCrossRef) 20 | 21 | suspend fun deleteBookShelfCrossRef(crossRef: BookShelfCrossRef) 22 | 23 | suspend fun getShelfWithBooks(): List 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/roomdb/DataConverter.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.roomdb 2 | 3 | import androidx.room.TypeConverter 4 | 5 | class DataConverter { 6 | @TypeConverter 7 | fun fromString(stringListString: String): List { 8 | return stringListString.split(",").map { it } 9 | } 10 | 11 | @TypeConverter 12 | fun toString(stringList: List): String { 13 | return stringList.joinToString(separator = ",") 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/roomdb/NinovaDao.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.roomdb 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Delete 5 | import androidx.room.Insert 6 | import androidx.room.OnConflictStrategy 7 | import androidx.room.Query 8 | import androidx.room.Transaction 9 | import androidx.room.Update 10 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 11 | import com.armutyus.ninova.roomdb.entities.BookShelfCrossRef 12 | import com.armutyus.ninova.roomdb.entities.BookWithShelves 13 | import com.armutyus.ninova.roomdb.entities.LocalShelf 14 | import com.armutyus.ninova.roomdb.entities.ShelfWithBooks 15 | 16 | @Dao 17 | interface NinovaDao { 18 | //Book works 19 | @Insert(onConflict = OnConflictStrategy.REPLACE) 20 | suspend fun insertBook(localBook: DataModel.LocalBook) 21 | 22 | @Update 23 | suspend fun updateBook(localBook: DataModel.LocalBook) 24 | 25 | @Delete 26 | suspend fun deleteBook(localBook: DataModel.LocalBook) 27 | 28 | @Query("DELETE FROM Book WHERE bookId = :id") 29 | suspend fun deleteBookById(id: String) 30 | 31 | @Query("SELECT * FROM Book WHERE bookId = :id") 32 | fun getLocalBooksById(id: String): DataModel.LocalBook 33 | 34 | @Query("SELECT * FROM Book") 35 | fun getLocalBooks(): List 36 | 37 | @Query("SELECT * FROM Book WHERE bookAuthors LIKE :searchString OR bookTitle LIKE :searchString") 38 | fun searchLocalBooks(searchString: String): List 39 | 40 | //Shelf works 41 | @Insert(onConflict = OnConflictStrategy.REPLACE) 42 | suspend fun insertShelf(localShelf: LocalShelf) 43 | 44 | @Update 45 | suspend fun updateShelf(localShelf: LocalShelf) 46 | 47 | @Delete 48 | suspend fun deleteShelf(localShelf: LocalShelf) 49 | 50 | @Query("SELECT * FROM Shelf") 51 | fun getLocalShelves(): List 52 | 53 | @Query("SELECT * FROM Shelf WHERE shelfTitle LIKE :searchString") 54 | fun searchLocalShelf(searchString: String): List 55 | 56 | //Cross works 57 | @Insert(onConflict = OnConflictStrategy.REPLACE) 58 | suspend fun insertBookShelfCrossRef(crossRef: BookShelfCrossRef) 59 | 60 | @Delete 61 | suspend fun deleteBookShelfCrossRef(crossRef: BookShelfCrossRef) 62 | 63 | @Transaction 64 | @Query("SELECT * FROM BookShelfCrossRef") 65 | fun getBookShelfCrossRef(): List 66 | 67 | @Transaction 68 | @Query("SELECT * FROM Shelf") 69 | fun getBooksOfShelf(): List 70 | 71 | @Transaction 72 | @Query("SELECT * FROM Book WHERE bookId = :bookId") 73 | fun getShelvesOfBook(bookId: String): List 74 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/roomdb/NinovaLocalDB.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.roomdb 2 | 3 | import androidx.room.Database 4 | import androidx.room.RoomDatabase 5 | import androidx.room.TypeConverters 6 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 7 | import com.armutyus.ninova.roomdb.entities.BookShelfCrossRef 8 | import com.armutyus.ninova.roomdb.entities.LocalShelf 9 | 10 | @Database( 11 | entities = [ 12 | DataModel.LocalBook::class, 13 | LocalShelf::class, 14 | BookShelfCrossRef::class 15 | ], version = 1, exportSchema = true 16 | ) 17 | @TypeConverters(DataConverter::class) 18 | abstract class NinovaLocalDB : RoomDatabase() { 19 | abstract fun ninovaDao(): NinovaDao 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/roomdb/entities/BookShelfCrossRef.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.roomdb.entities 2 | 3 | import androidx.room.Entity 4 | 5 | @Entity(primaryKeys = ["bookId", "shelfId"]) 6 | data class BookShelfCrossRef( 7 | val bookId: String, 8 | val shelfId: String 9 | ) { 10 | constructor() : this("", "") 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/roomdb/entities/BookWithShelves.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.roomdb.entities 2 | 3 | import androidx.room.Embedded 4 | import androidx.room.Junction 5 | import androidx.room.Relation 6 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 7 | 8 | data class BookWithShelves( 9 | @Embedded val book: DataModel.LocalBook, 10 | @Relation( 11 | parentColumn = "bookId", 12 | entityColumn = "shelfId", 13 | associateBy = Junction(BookShelfCrossRef::class) 14 | ) 15 | val shelfList: List 16 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/roomdb/entities/LocalShelf.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.roomdb.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import com.armutyus.ninova.ui.shelves.ShelvesViewModel 6 | 7 | @Entity(tableName = "Shelf") 8 | data class LocalShelf( 9 | @PrimaryKey(autoGenerate = false) var shelfId: String, 10 | var shelfTitle: String?, 11 | var createdAt: String?, 12 | var shelfCover: String?, 13 | ) { 14 | constructor() : this("", "", "", "") 15 | 16 | fun getBookCount(shelvesViewModel: ShelvesViewModel): Int { 17 | return shelvesViewModel.shelfWithBooksList.value?.firstOrNull { 18 | it.shelf.shelfId == shelfId 19 | }?.booksCount ?: 0 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/roomdb/entities/ShelfWithBooks.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.roomdb.entities 2 | 3 | import androidx.room.Embedded 4 | import androidx.room.Junction 5 | import androidx.room.Relation 6 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 7 | 8 | data class ShelfWithBooks( 9 | @Embedded val shelf: LocalShelf, 10 | @Relation( 11 | parentColumn = "shelfId", 12 | entityColumn = "bookId", 13 | associateBy = Junction(BookShelfCrossRef::class) 14 | ) 15 | val bookList: List 16 | ) { 17 | val booksCount: Int 18 | get() = bookList.size 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/service/GoogleBooksApiService.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.service 2 | 3 | import com.armutyus.ninova.model.googlebooksmodel.BookDetails 4 | import com.armutyus.ninova.model.googlebooksmodel.GoogleApiBooks 5 | import retrofit2.Response 6 | import retrofit2.http.GET 7 | import retrofit2.http.Path 8 | import retrofit2.http.Query 9 | 10 | interface GoogleBooksApiService { 11 | 12 | @GET("volumes") 13 | suspend fun searchBooks( 14 | @Query("q") searchQuery: String, 15 | @Query("maxResults") maxResults: Int = 20 16 | ): Response 17 | 18 | @GET("volumes/{id}") 19 | suspend fun getBookDetails( 20 | @Path("id") id: String, 21 | ): Response 22 | 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/service/OpenLibraryApiService.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.service 2 | 3 | import com.armutyus.ninova.model.openlibrarymodel.BookDetailsResponse 4 | import com.armutyus.ninova.model.openlibrarymodel.OpenLibraryResponse 5 | import retrofit2.Response 6 | import retrofit2.http.GET 7 | import retrofit2.http.Headers 8 | import retrofit2.http.Path 9 | 10 | interface OpenLibraryApiService { 11 | @Headers( 12 | "Accept: application/json", 13 | "Content-Type: application/json", 14 | "Platform: android" 15 | ) 16 | @GET("{url}") 17 | suspend fun getBooksByCategory( 18 | @Path("url") fixedUrl: String, 19 | ): Response 20 | 21 | @GET("{url}") 22 | suspend fun getBookKeyDetails( 23 | @Path("url") fixedUrl: String, 24 | ): Response 25 | 26 | @GET("{url}") 27 | suspend fun getBookLendingDetails( 28 | @Path("url") fixedUrl: String, 29 | ): Response 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/discover/DiscoverFragment.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.discover 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import androidx.appcompat.app.AppCompatActivity 6 | import androidx.fragment.app.Fragment 7 | import androidx.recyclerview.widget.GridLayoutManager 8 | import androidx.recyclerview.widget.RecyclerView 9 | import com.armutyus.ninova.R 10 | import com.armutyus.ninova.constants.Util.Companion.fadeIn 11 | import com.armutyus.ninova.databinding.FragmentDiscoverBinding 12 | import com.armutyus.ninova.ui.discover.adapters.DiscoverRecyclerViewAdapter 13 | import javax.inject.Inject 14 | 15 | class DiscoverFragment @Inject constructor( 16 | private val discoverAdapter: DiscoverRecyclerViewAdapter 17 | ) : Fragment(R.layout.fragment_discover) { 18 | 19 | private var fragmentBinding: FragmentDiscoverBinding? = null 20 | 21 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 22 | super.onViewCreated(view, savedInstanceState) 23 | 24 | val binding = FragmentDiscoverBinding.bind(view) 25 | fragmentBinding = binding 26 | 27 | binding.appNameTextView.fadeIn(1000) 28 | 29 | val recyclerView = binding.discoverRecyclerView 30 | recyclerView.adapter = discoverAdapter 31 | recyclerView.layoutManager = GridLayoutManager(requireContext(), 4) 32 | recyclerView.visibility = View.VISIBLE 33 | 34 | recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { 35 | override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { 36 | super.onScrolled(recyclerView, dx, dy) 37 | if (!recyclerView.canScrollVertically(-1)) { 38 | (requireActivity() as AppCompatActivity).supportActionBar?.show() 39 | } else { 40 | (requireActivity() as AppCompatActivity).supportActionBar?.hide() 41 | } 42 | } 43 | }) 44 | } 45 | 46 | override fun onDestroyView() { 47 | super.onDestroyView() 48 | fragmentBinding = null 49 | } 50 | 51 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/discover/adapters/DiscoverCategoryRecyclerViewAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.discover.adapters 2 | 3 | import android.content.Intent 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import android.widget.ImageView 8 | import android.widget.TextView 9 | import androidx.recyclerview.widget.RecyclerView 10 | import com.armutyus.ninova.R 11 | import com.armutyus.ninova.constants.Cache.currentGoogleBook 12 | import com.armutyus.ninova.constants.Cache.currentLocalBook 13 | import com.armutyus.ninova.constants.Cache.currentOpenLibBook 14 | import com.armutyus.ninova.constants.Constants 15 | import com.armutyus.ninova.constants.Constants.BOOK_TYPE_FOR_DETAILS 16 | import com.armutyus.ninova.constants.Constants.OPEN_LIB_BOOK_TYPE 17 | import com.armutyus.ninova.model.openlibrarymodel.OpenLibraryWork 18 | import com.bumptech.glide.RequestManager 19 | import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions 20 | import javax.inject.Inject 21 | import javax.inject.Named 22 | 23 | class DiscoverCategoryRecyclerViewAdapter @Inject constructor( 24 | private val glide: RequestManager 25 | ) : RecyclerView.Adapter() { 26 | 27 | @Named(Constants.BOOK_DETAILS_INTENT) 28 | @Inject 29 | lateinit var bookDetailsIntent: Intent 30 | 31 | private val adapterData = mutableListOf() 32 | 33 | class DiscoverCategoryViewHolder(view: View) : RecyclerView.ViewHolder(view) 34 | 35 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 36 | val view = 37 | LayoutInflater.from(parent.context) 38 | .inflate(R.layout.discover_category_book_item, parent, false) 39 | 40 | return DiscoverCategoryViewHolder(view) 41 | } 42 | 43 | override fun getItemCount(): Int { 44 | return adapterData.size 45 | } 46 | 47 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 48 | val book = adapterData[position] 49 | val bookAuthor = holder.itemView.findViewById(R.id.bookAuthorText) 50 | val bookCover = holder.itemView.findViewById(R.id.bookImage) 51 | val bookTitle = holder.itemView.findViewById(R.id.bookTitleText) 52 | val bookPublishedYear = holder.itemView.findViewById(R.id.bookReleaseDateText) 53 | val bookCoverUrl = "https://covers.openlibrary.org/b/id/${book.cover_id}-M.jpg" 54 | val bookAuthors = book.authors.map { it.name } 55 | 56 | bookTitle.isSelected = true 57 | 58 | holder.itemView.apply { 59 | glide.load(bookCoverUrl).centerCrop() 60 | .transition(DrawableTransitionOptions.withCrossFade()).into(bookCover) 61 | bookAuthor.text = bookAuthors.joinToString(", ") 62 | bookTitle.text = book.title 63 | bookPublishedYear.text = book.first_publish_year.toString() 64 | 65 | setOnClickListener { 66 | bookDetailsIntent.putExtra( 67 | BOOK_TYPE_FOR_DETAILS, 68 | OPEN_LIB_BOOK_TYPE 69 | ) 70 | currentOpenLibBook = book 71 | currentGoogleBook = null 72 | currentLocalBook = null 73 | holder.itemView.context.startActivity(bookDetailsIntent) 74 | } 75 | } 76 | } 77 | 78 | fun setData(data: List) { 79 | adapterData.addAll(data) 80 | notifyDataSetChanged() 81 | } 82 | 83 | fun clearData() { 84 | adapterData.clear() 85 | notifyDataSetChanged() 86 | } 87 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/discover/adapters/DiscoverRecyclerViewAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.discover.adapters 2 | 3 | import android.view.LayoutInflater 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import android.widget.ImageView 7 | import android.widget.TextView 8 | import androidx.navigation.Navigation 9 | import androidx.recyclerview.widget.RecyclerView 10 | import com.armutyus.ninova.R 11 | import com.armutyus.ninova.constants.Constants.discoverScreenCategories 12 | import com.armutyus.ninova.constants.Util.Companion.setImageTint 13 | import com.armutyus.ninova.ui.discover.DiscoverFragmentDirections 14 | import com.bumptech.glide.RequestManager 15 | import javax.inject.Inject 16 | 17 | class DiscoverRecyclerViewAdapter @Inject constructor( 18 | private val glide: RequestManager 19 | ) : RecyclerView.Adapter() { 20 | 21 | class DiscoverScreenViewHolder(view: View) : RecyclerView.ViewHolder(view) 22 | 23 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 24 | val view = 25 | LayoutInflater.from(parent.context).inflate(R.layout.book_category_item, parent, false) 26 | 27 | return DiscoverScreenViewHolder(view) 28 | } 29 | 30 | override fun getItemCount(): Int { 31 | return discoverScreenCategories.size 32 | } 33 | 34 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 35 | val categoryCover = holder.itemView.findViewById(R.id.bookImage) 36 | val categoryTitle = holder.itemView.findViewById(R.id.bookCategory) 37 | 38 | val categoryCoverSrc = discoverScreenCategories.values.elementAt(position) 39 | 40 | categoryTitle.isSelected = true 41 | 42 | holder.itemView.apply { 43 | glide.load(categoryCoverSrc).centerInside().into(categoryCover) 44 | categoryTitle.text = discoverScreenCategories.keys.elementAt(position) 45 | categoryCover.setImageTint(holder.itemView.context) 46 | } 47 | 48 | holder.itemView.setOnClickListener { 49 | val action = 50 | DiscoverFragmentDirections.actionNavigationDiscoveryToNavigationDiscoveryCategory( 51 | discoverScreenCategories.keys.elementAt(position) 52 | ) 53 | Navigation.findNavController(it).navigate(action) 54 | } 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/search/MainSearchViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.search 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import androidx.lifecycle.viewModelScope 7 | import com.armutyus.ninova.constants.Constants.randomWordList 8 | import com.armutyus.ninova.constants.Response 9 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 10 | import com.armutyus.ninova.model.googlebooksmodel.GoogleApiBooks 11 | import com.armutyus.ninova.repository.GoogleBooksRepositoryInterface 12 | import com.armutyus.ninova.repository.LocalBooksRepositoryInterface 13 | import dagger.hilt.android.lifecycle.HiltViewModel 14 | import kotlinx.coroutines.flow.collectLatest 15 | import kotlinx.coroutines.launch 16 | import javax.inject.Inject 17 | 18 | @HiltViewModel 19 | class MainSearchViewModel @Inject constructor( 20 | private val googleBooksRepository: GoogleBooksRepositoryInterface, 21 | private val booksRepository: LocalBooksRepositoryInterface 22 | ) : ViewModel() { 23 | 24 | //LocalBook Works 25 | 26 | private val _currentLocalBookList = MutableLiveData>() 27 | val currentLocalBookList: LiveData> 28 | get() = _currentLocalBookList 29 | 30 | private val _searchLocalBookList = MutableLiveData>() 31 | val searchLocalBookList: LiveData> 32 | get() = _searchLocalBookList 33 | 34 | fun searchLocalBooks(searchString: String) = viewModelScope.launch { 35 | _searchLocalBookList.value = booksRepository.searchLocalBooks(searchString) 36 | } 37 | 38 | fun setCurrentLocalBookList(bookList: List) { 39 | _currentLocalBookList.value = bookList 40 | } 41 | 42 | fun insertBook(localBook: DataModel.LocalBook) = viewModelScope.launch { 43 | booksRepository.insert(localBook) 44 | } 45 | 46 | fun deleteBookById(id: String) = viewModelScope.launch { 47 | booksRepository.deleteBookById(id) 48 | } 49 | 50 | //GoogleBook Works 51 | 52 | private val _currentList = MutableLiveData>() 53 | val currentList: LiveData> 54 | get() = _currentList 55 | 56 | private val _searchBooksResponse = MutableLiveData>() 57 | val searchBooksResponse: LiveData> 58 | get() = _searchBooksResponse 59 | 60 | private val _randomBooksResponse = MutableLiveData>() 61 | val randomBooksResponse: LiveData> 62 | get() = _randomBooksResponse 63 | 64 | fun searchBooksFromApi(searchQuery: String) = viewModelScope.launch { 65 | googleBooksRepository.searchBooksFromApi(searchQuery).collectLatest { response -> 66 | _searchBooksResponse.postValue(response) 67 | } 68 | } 69 | 70 | fun randomBooksFromApi() = viewModelScope.launch { 71 | googleBooksRepository.searchBooksFromApi(randomWordList.random()) 72 | .collectLatest { response -> 73 | _randomBooksResponse.postValue(response) 74 | } 75 | } 76 | 77 | fun setCurrentList(bookList: List) { 78 | _currentList.postValue(bookList) 79 | } 80 | 81 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/search/adapters/LocalBookRowViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.search.adapters 2 | 3 | import android.content.Intent 4 | import android.view.View 5 | import android.widget.ImageView 6 | import android.widget.TextView 7 | import androidx.recyclerview.widget.RecyclerView 8 | import com.armutyus.ninova.R 9 | import com.armutyus.ninova.constants.Cache.currentGoogleBook 10 | import com.armutyus.ninova.constants.Cache.currentLocalBook 11 | import com.armutyus.ninova.constants.Cache.currentOpenLibBook 12 | import com.armutyus.ninova.constants.Constants 13 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 14 | import com.bumptech.glide.RequestManager 15 | 16 | class LocalBookRowViewHolder(view: View) : RecyclerView.ViewHolder(view) { 17 | 18 | fun bindLocalBook(book: DataModel.LocalBook, glide: RequestManager, bookDetailsIntent: Intent) { 19 | val bookCover = itemView.findViewById(R.id.bookImage) 20 | val bookTitle = itemView.findViewById(R.id.bookTitleText) 21 | val bookAuthor = itemView.findViewById(R.id.bookAuthorText) 22 | val bookPages = itemView.findViewById(R.id.bookPageText) 23 | val bookReleaseDate = itemView.findViewById(R.id.bookReleaseDateText) 24 | 25 | itemView.apply { 26 | glide.load(book.bookCoverSmallThumbnail).centerCrop().into(bookCover) 27 | bookTitle.text = book.bookTitle 28 | bookAuthor.text = book.bookAuthors?.joinToString(", ") 29 | bookPages.text = book.bookPages 30 | bookReleaseDate.text = book.bookPublishedDate 31 | setOnClickListener { 32 | bookDetailsIntent.putExtra( 33 | Constants.BOOK_TYPE_FOR_DETAILS, 34 | Constants.LOCAL_BOOK_TYPE 35 | ) 36 | currentLocalBook = book 37 | currentGoogleBook = null 38 | currentOpenLibBook = null 39 | itemView.context.startActivity(bookDetailsIntent) 40 | } 41 | } 42 | } 43 | 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/search/listeners/OnBookAddButtonClickListener.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.search.listeners 2 | 3 | import android.widget.ImageButton 4 | import com.armutyus.ninova.model.googlebooksmodel.DataModel 5 | import com.google.android.material.progressindicator.CircularProgressIndicator 6 | 7 | interface OnBookAddButtonClickListener { 8 | fun onAddButtonClick( 9 | localBook: DataModel.LocalBook, 10 | addButton: ImageButton, 11 | addedButton: ImageButton, 12 | progressBar: CircularProgressIndicator 13 | ) 14 | 15 | fun onAddedButtonClick( 16 | id: String, 17 | addButton: ImageButton, 18 | addedButton: ImageButton, 19 | progressBar: CircularProgressIndicator 20 | ) 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/settings/CustomListPreference.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.settings 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.preference.ListPreference 6 | import com.armutyus.ninova.R 7 | import com.google.android.material.dialog.MaterialAlertDialogBuilder 8 | 9 | class CustomListPreference : ListPreference { 10 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : 11 | super(context, attrs, defStyleAttr, defStyleRes) 12 | 13 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : 14 | super(context, attrs, defStyleAttr) 15 | 16 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) 17 | 18 | constructor(context: Context) : super(context) 19 | 20 | override fun onClick() { 21 | val builder = 22 | MaterialAlertDialogBuilder(context).setSingleChoiceItems(entries, getValueIndex()) 23 | { dialog, index -> 24 | if (callChangeListener(entryValues[index].toString())) { 25 | setValueIndex(index) 26 | } 27 | dialog.dismiss() 28 | } 29 | .setNegativeButton(R.string.cancel) { dialog, _ -> dialog.dismiss() } 30 | .setTitle(title) 31 | 32 | val dialog = builder.create() 33 | dialog.show() 34 | } 35 | 36 | private fun getValueIndex() = entryValues.indexOf(value) 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/settings/SettingsViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.settings 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.viewModelScope 5 | import com.armutyus.ninova.constants.Response 6 | import com.armutyus.ninova.repository.FirebaseRepositoryInterface 7 | import com.armutyus.ninova.repository.LocalBooksRepositoryInterface 8 | import com.armutyus.ninova.repository.ShelfRepositoryInterface 9 | import com.armutyus.ninova.roomdb.NinovaLocalDB 10 | import com.google.firebase.auth.AuthCredential 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import kotlinx.coroutines.CoroutineScope 13 | import kotlinx.coroutines.Dispatchers 14 | import kotlinx.coroutines.launch 15 | import javax.inject.Inject 16 | 17 | @HiltViewModel 18 | class SettingsViewModel @Inject constructor( 19 | private val booksRepository: LocalBooksRepositoryInterface, 20 | private val shelfRepository: ShelfRepositoryInterface, 21 | private val firebaseRepository: FirebaseRepositoryInterface, 22 | private val db: NinovaLocalDB 23 | ) : ViewModel() { 24 | 25 | fun uploadUserData( 26 | onComplete: (Response) -> Unit 27 | ) = viewModelScope.launch { 28 | val localBooks = booksRepository.getLocalBooks() 29 | localBooks.forEach { 30 | val response = firebaseRepository.uploadUserBooksToFirestore(it) 31 | if (response is Response.Failure) { 32 | onComplete(response) 33 | return@launch 34 | } 35 | } 36 | 37 | val localCrossRef = booksRepository.getBookShelfCrossRef() 38 | localCrossRef.forEach { 39 | val response = firebaseRepository.uploadUserCrossRefToFirestore(it) 40 | if (response is Response.Failure) { 41 | onComplete(response) 42 | return@launch 43 | } 44 | } 45 | 46 | val localShelf = shelfRepository.getLocalShelves() 47 | localShelf.forEach { 48 | val response = firebaseRepository.uploadUserShelvesToFirestore(it) 49 | if (response is Response.Failure) { 50 | onComplete(response) 51 | return@launch 52 | } 53 | } 54 | onComplete(Response.Success(true)) 55 | } 56 | 57 | fun deleteUserPermanently(credential: AuthCredential, onComplete: (Response) -> Unit) = 58 | viewModelScope.launch { 59 | val reAuthResponse = firebaseRepository.reAuthUser(credential) 60 | if (reAuthResponse is Response.Failure) { 61 | onComplete(reAuthResponse) 62 | return@launch 63 | } 64 | 65 | val emailResponse = firebaseRepository.deleteUserPermanently() 66 | if (emailResponse is Response.Failure) { 67 | onComplete(emailResponse) 68 | return@launch 69 | } 70 | onComplete(Response.Success(true)) 71 | } 72 | 73 | fun signOut(onComplete: (Response) -> Unit) = viewModelScope.launch { 74 | val response = firebaseRepository.signOut() 75 | onComplete(response) 76 | } 77 | 78 | fun clearDatabase() { 79 | CoroutineScope(Dispatchers.IO).launch { 80 | db.clearAllTables() 81 | } 82 | } 83 | 84 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/shelves/listeners/OnShelfCoverClickListener.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.shelves.listeners 2 | 3 | interface OnShelfCoverClickListener { 4 | fun onClick() 5 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/shelves/listeners/OnShelfItemClickListener.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.shelves.listeners 2 | 3 | import com.armutyus.ninova.roomdb.entities.LocalShelf 4 | 5 | interface OnShelfItemClickListener { 6 | fun onClick(localShelf: LocalShelf) 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/splash/SplashRepository.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.splash 2 | 3 | import com.google.firebase.auth.FirebaseAuth 4 | import javax.inject.Inject 5 | import javax.inject.Singleton 6 | 7 | @Singleton 8 | class SplashRepository @Inject constructor( 9 | private val auth: FirebaseAuth 10 | ) { 11 | val isUserAuthenticatedInFirebase get() = auth.currentUser != null 12 | 13 | val isUserAnonymous get() = auth.currentUser!!.isAnonymous 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/armutyus/ninova/ui/splash/SplashViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova.ui.splash 2 | 3 | import androidx.lifecycle.ViewModel 4 | import dagger.hilt.android.lifecycle.HiltViewModel 5 | import javax.inject.Inject 6 | 7 | @HiltViewModel 8 | class SplashViewModel @Inject constructor( 9 | private val repository: SplashRepository 10 | ) : ViewModel() { 11 | val isUserAuthenticated get() = repository.isUserAuthenticatedInFirebase 12 | 13 | val isUserAnonymous get() = repository.isUserAnonymous 14 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi-v26/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 6 | 8 | 11 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/anthropology_25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/anthropology_25.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/architecture_30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/architecture_30.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/art_31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/art_31.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/art_history_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/art_history_32.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bedtime_42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/bedtime_42.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/biography_29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/biography_29.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/business_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/business_17.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/children_43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/children_43.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/cookbook_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/cookbook_19.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/cooking_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/cooking_18.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/dance_33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/dance_33.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/design_34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/design_34.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/drama_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/drama_01.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/example_book.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/example_book.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/exercise_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/exercise_21.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/fantasy_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/fantasy_02.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/fashion_35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/fashion_35.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/film_36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/film_36.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/gradient_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/graphic_design_37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/graphic_design_37.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/historical_fiction_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/historical_fiction_03.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/history_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/history_24.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_library.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/horror_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/horror_04.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/humor_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/humor_05.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_action_arrow.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_button.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_button_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_upload_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_books_in_shelf.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dashboard_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_account.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_discover.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_done.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_error.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_login_email_gray.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_login_lock_gray.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pages_icon.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_placeholder_book_icon.xml: -------------------------------------------------------------------------------- 1 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_readlist.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_register_account.xml: -------------------------------------------------------------------------------- 1 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_register_username_gray.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_release_date.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shelf_cover.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sign_out.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sort.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_switch_account.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme_settings.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/literature_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/literature_06.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/magic_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/magic_07.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mental_health_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/mental_health_20.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/music_38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/music_38.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/music_theory_39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/music_theory_39.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/mystery_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/mystery_08.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/nutrition_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/nutrition_22.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/painting_40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/painting_40.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/photography_41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/photography_41.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/placeholder_book_icon.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/placeholder_book_icon.jpeg -------------------------------------------------------------------------------- /app/src/main/res/drawable/plays_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/plays_09.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/poetry_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/poetry_10.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/political_science_27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/political_science_27.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/psychology_28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/psychology_28.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/religion_26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/religion_26.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/romance_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/romance_11.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/sci_fi_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/sci_fi_12.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/science_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/science_16.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/self_help_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/self_help_23.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/short_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/short_13.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/thriller_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/thriller_14.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/young_fiction_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/drawable/young_fiction_15.png -------------------------------------------------------------------------------- /app/src/main/res/font/arista_pro_alternate_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/font/arista_pro_alternate_regular.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 20 | 21 | 30 | 31 | 39 | 40 | 43 | 44 | 48 | 49 | 55 | 56 | 57 | 64 | 65 | 66 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 21 | 22 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/add_book_to_shelf_bottom_sheet.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 21 | 22 | 30 | 31 | 32 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/add_book_to_shelf_row.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/add_new_shelf_bottom_sheet.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 22 | 23 | 24 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/book_category_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 27 | 28 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_dialog_edit_text_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_dialog_password_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 20 | 21 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/discover_category_book_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | 23 | 30 | 31 | 40 | 41 | 50 | 51 | 55 | 56 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 80 | 81 | 82 | 83 | 88 | 89 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_books.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 20 | 21 | 27 | 28 | 34 | 35 | 36 | 44 | 45 | 52 | 53 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_discover.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 20 | 21 | 30 | 31 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_discover_category.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 19 | 20 | 29 | 30 | 36 | 37 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_shelf_with_books.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 20 | 21 | 27 | 28 | 34 | 35 | 36 | 44 | 45 | 52 | 53 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /app/src/main/res/layout/register_user_bottom_sheet.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 24 | 25 | 26 | 37 | 38 | 43 | 44 | 45 | 56 | 57 | 62 | 63 | 64 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /app/src/main/res/layout/shelves_main_row.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 22 | 23 | 24 | 30 | 31 | 40 | 41 | 45 | 46 | 57 | 58 | 59 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 83 | 84 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_nav_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/menu/settings_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/navigation/mobile_navigation.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 15 | 20 | 23 | 24 | 25 | 30 | 33 | 34 | 35 | 40 | 43 | 44 | 45 | 50 | 51 | 55 | 56 | 60 | 63 | 64 | 65 | 68 | 69 | 72 | 73 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 48dp 3 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/values-w1240dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 200dp 3 | -------------------------------------------------------------------------------- /app/src/main/res/values-w600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 48dp 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @string/ninova_light 5 | @string/ninova_dark 6 | @string/bergama_light 7 | @string/bergama_dark 8 | @string/alexandria_light 9 | @string/alexandria_dark 10 | 11 | 12 | 13 | ninova_light 14 | ninova_dark 15 | bergama_light 16 | bergama_dark 17 | alexandria_light 18 | alexandria_dark 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/values/circle_image_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/xml/anonymous_preferences.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 23 | 27 | 28 | 29 | 30 | 31 | 32 | 37 | 38 | 39 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/root_preferences.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 10 | 14 | 15 | 22 | 23 | 24 | 25 | 26 | 27 | 32 | 36 | 37 | 38 | 39 | 40 | 41 | 47 | 48 | 49 | 55 | 56 | 57 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /app/src/test/java/com/armutyus/ninova/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.armutyus.ninova 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | plugins { 3 | alias(libs.plugins.android.application) apply false 4 | alias(libs.plugins.kotlin.android) apply false 5 | alias(libs.plugins.dagger.hilt) apply false 6 | alias(libs.plugins.ksp) apply false 7 | alias(libs.plugins.androidx.navigation.safe.args) apply false 8 | alias(libs.plugins.firebase.crashlytics.gradle) apply false 9 | alias(libs.plugins.google.services) apply false 10 | } 11 | 12 | tasks.register("clean") { 13 | delete(rootProject.buildDir) 14 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Kotlin code style for this project: "official" or "obsolete": 19 | kotlin.code.style=official 20 | # Enables namespacing of each library's R class so that its R class includes only the 21 | # resources declared in the library itself and none from the library's dependencies, 22 | # thereby reducing the size of the R class for that library 23 | android.nonTransitiveRClass=true 24 | android.defaults.buildfeatures.buildconfig=true 25 | android.nonFinalResIds=false -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codegenius2/ninova/1d36a26d3110b1c4de2bf328c0c3d6c52ca6aa8d/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri May 20 12:28:38 TRT 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google { 4 | mavenContent { 5 | includeGroupByRegex(".*google.*") 6 | includeGroupByRegex(".*android.*") 7 | } 8 | } 9 | mavenCentral() 10 | gradlePluginPortal() 11 | } 12 | } 13 | dependencyResolutionManagement { 14 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 15 | repositories { 16 | google { 17 | mavenContent { 18 | includeGroupByRegex(".*google.*") 19 | includeGroupByRegex(".*android.*") 20 | } 21 | } 22 | mavenCentral() 23 | } 24 | } 25 | rootProject.name = "Ninova" 26 | include(":app") 27 | --------------------------------------------------------------------------------