{"id":28737355,"url":"https://github.com/pokk/dropbeat","last_synced_at":"2025-06-16T02:10:07.746Z","repository":{"id":47621431,"uuid":"263073196","full_name":"pokk/DropBeat","owner":"pokk","description":"A Music Player with downloading, playing, searching, exploring functions.","archived":false,"fork":false,"pushed_at":"2023-01-09T12:47:21.000Z","size":3717,"stargazers_count":16,"open_issues_count":2,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2023-03-04T15:44:09.795Z","etag":null,"topics":["android-app","caching","clean-architecture","detekt","dynamic-features","exoplayer2","kodein-di","mmkv","modulization","retrofit2-coroutines","room","usecase","viewmodel-livedata"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pokk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-05-11T14:54:08.000Z","updated_at":"2023-01-10T17:30:26.000Z","dependencies_parsed_at":"2023-02-08T11:46:52.234Z","dependency_job_id":null,"html_url":"https://github.com/pokk/DropBeat","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/pokk/DropBeat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pokk%2FDropBeat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pokk%2FDropBeat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pokk%2FDropBeat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pokk%2FDropBeat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pokk","download_url":"https://codeload.github.com/pokk/DropBeat/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pokk%2FDropBeat/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260083859,"owners_count":22956409,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-app","caching","clean-architecture","detekt","dynamic-features","exoplayer2","kodein-di","mmkv","modulization","retrofit2-coroutines","room","usecase","viewmodel-livedata"],"created_at":"2025-06-16T02:10:07.019Z","updated_at":"2025-06-16T02:10:07.727Z","avatar_url":"https://github.com/pokk.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e DropBeat \u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/pokk/DropBeat/actions\"\u003e\u003cimg src=\"https://github.com/pokk/DropBeat/workflows/Build Workflow/badge.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://codebeat.co/projects/github-com-pokk-dropbeat-master\"\u003e\u003cimg alt=\"codebeat badge\" src=\"https://codebeat.co/badges/7079a1bd-6e84-4a94-bf8a-b30f7c509114\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://www.codacy.com/manual/pokk/DropBeat?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=pokk/DropBeat\u0026amp;utm_campaign=Badge_Grade\"\u003e\u003cimg src=\"https://api.codacy.com/project/badge/Grade/7aa04a1604444d4592ce22da25b2299a\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://www.codefactor.io/repository/github/pokk/dropbeat\"\u003e\u003cimg src=\"https://www.codefactor.io/repository/github/pokk/dropbeat/badge\" alt=\"CodeFactor\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://codeclimate.com/github/pokk/DropBeat/maintainability\"\u003e\u003cimg src=\"https://api.codeclimate.com/v1/badges/f9ef124dc3df905b7fc4/maintainability\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://deepsource.io/gh/pokk/DropBeat/?ref=repository-badge\" target=\"_blank\"\u003e\u003cimg alt=\"DeepSource\" title=\"DeepSource\" src=\"https://deepsource.io/gh/pokk/DropBeat.svg/?label=active+issues\u0026show_trend=true\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://codecov.io/gh/pokk/DropBeat\"\u003e\u003cimg src=\"https://codecov.io/gh/pokk/DropBeat/branch/master/graph/badge.svg?token=97V0QNONOT\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg alt=\"Licence\" src=\"https://img.shields.io/badge/license-MIT-green.svg\" /\u003e\n\u003c/p\u003e\n\n# System Overview\n\n## Module Dependency Graph\n\n![DropABeat Architecture@2x](https://user-images.githubusercontent.com/5198104/119675341-e9554f80-be77-11eb-84a3-6fe1f6791dab.png)\n\n## Architecture of each feature module\n\nBasically, our project is using single activity and multiple fragments.\n\n#### The Feature of Clean Architecture\n\nThe **clean architecture** known to everyone, the purpose is dividing each layer and make them independent. I will say\nthe **clean architecture** is separating modules **horizontally**.\n\n#### The Feature of Dynamic Feature\n\n**Dynamic Feature** were published by few yeas ago. Briefly, as the word says, it makes each feature to a module. I will\nsay the **dynamic feature** is separating modules **vertically**.\n\nWe decided to get both advantages with an easier way and mix them together to our project. To mix them, the **dynamic\nfeature** will be the ***main*** architecture and **clean architecture** will be inside each feature module.\n\nThere are so many strict rules in the origin clean architecture, e.g. an object on the **presentation layer** won't\naccess a class from the **data layer**, or each layer has their own data classes, the mapper classes, ...etc.\n\nIf keeping the rules here, this project will be a hugh project and only one maintainer is me 😢. This project is still\nkeeping the basic rules, but we need to have a compromise with those features.\n\n![Feature Module Architecture](https://user-images.githubusercontent.com/5198104/85557159-7e493a80-b662-11ea-84e8-fc2e16198b21.png)\n\n### Detail of Presentation Layer\n\n- Activity/Fragment:\n- **ViewModel**: It handles the view state and data, and the **view logic**. Also, it helps a view to connect a usecase.\n  Three types of them, **ViewModel**, **AndroidViewModel**, **SavedStateViewModel** will be used.\n\n### Detail of Domain Layer\n\nThe business logic will be here mostly.\n\n- **OneShot UseCase**: This is one time fetching, just send a request and get a response, eg. normal restful api\n  request.\n- **Observable UseCase**: For the local database, once the data we are observing is changed, the observable usecases\n  will keep receiving the changing until the observing finishes.\n\n### Detail of Data Layer\n\n- **Repository**:\n- 3 Layer Cache: We would like to have a cache system. One path is for fetching data from the remote server; another\n  path is for the local database.\n\n![Cache Strategy](https://user-images.githubusercontent.com/5198104/86508600-383b6600-be1c-11ea-8cc1-259930d5820b.png)\n\n- Data Model:\n\n# Snapshot of App\n\n|                                                                                                                |                                                                                                                |                                                                                                                |                                                                                                                |\n|:---------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------|\n| ![image](https://user-images.githubusercontent.com/5198104/120093618-76d5bf80-c156-11eb-901b-63d62e9cb746.png) | ![image](https://user-images.githubusercontent.com/5198104/120093637-92d96100-c156-11eb-9c62-262c992748c3.png) | ![image](https://user-images.githubusercontent.com/5198104/120093716-e9df3600-c156-11eb-91a9-1b1b643ed0a2.png) | ![image](https://user-images.githubusercontent.com/5198104/120093988-ac7ba800-c158-11eb-897c-4e7c25aaa0b0.png) |\n| ![image](https://user-images.githubusercontent.com/5198104/120093667-b8666a80-c156-11eb-8b63-b2c2c2e6fed2.png) | ![image](https://user-images.githubusercontent.com/5198104/120093677-c61bf000-c156-11eb-9cd3-5c5753584f1d.png) | ![image](https://user-images.githubusercontent.com/5198104/120093689-d338df00-c156-11eb-829d-d6679e25c118.png) |                                                                                                                |\n\n# Licence\n\n```\nMIT License\n\nCopyright (c) 2021 Jieyi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpokk%2Fdropbeat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpokk%2Fdropbeat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpokk%2Fdropbeat/lists"}