{"id":21347048,"url":"https://github.com/yann39/my-crypto-binder","last_synced_at":"2026-04-17T15:02:48.271Z","repository":{"id":227343455,"uuid":"753059715","full_name":"Yann39/my-crypto-binder","owner":"Yann39","description":"Android application for managing cryptocurrency portfolio","archived":false,"fork":false,"pushed_at":"2024-05-17T20:40:04.000Z","size":1331,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-09T00:42:00.115Z","etag":null,"topics":["android","android-app","cryptocurrencies","cryptocurrency","gradle","java","portfolio","sqlite"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Yann39.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-05T11:45:38.000Z","updated_at":"2024-05-17T20:40:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"525a7809-ea35-4d71-a67c-04262df21269","html_url":"https://github.com/Yann39/my-crypto-binder","commit_stats":null,"previous_names":["yann39/my-crypto-binder"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yann39%2Fmy-crypto-binder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yann39%2Fmy-crypto-binder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yann39%2Fmy-crypto-binder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yann39%2Fmy-crypto-binder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Yann39","download_url":"https://codeload.github.com/Yann39/my-crypto-binder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243822277,"owners_count":20353499,"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","android-app","cryptocurrencies","cryptocurrency","gradle","java","portfolio","sqlite"],"created_at":"2024-11-22T02:12:28.032Z","updated_at":"2026-04-17T15:02:48.197Z","avatar_url":"https://github.com/Yann39.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MyCryptoBinder\n\n**Android** application for managing **cryptocurrency** portfolio.\n\n![Version](https://img.shields.io/badge/Version-0.8.4-2AAB92.svg)\n![Static Badge](https://img.shields.io/badge/Last%20update-07%20Jul%202018-blue)\n\n![Version](https://img.shields.io/badge/Platform-Android-green.svg)\n![Version](https://img.shields.io/badge/Target%20SDK-27-mediumpurple.svg)\n![Version](https://img.shields.io/badge/JDK-8-red.svg)\n\n![Version](https://img.shields.io/badge/DISCONTINUED-orange.svg?style=for-the-badge)\n\n---\n\n# Table of Contents\n\n* [About the project](#about-the-project)\n* [Screenshots](#screenshots)\n* [Usage](#usage)\n* [Technical details](#technical-details)\n    * [Compatibility](#compatibility)\n    * [Technologies](#technologies)\n    * [Architecture](#architecture)\n    * [Code structure](#code-structure)\n    * [Mechanics](#mechanics)\n* [Privacy](#privacy)\n    * [Information we collect](#what-personal-information-do-we-collect-from-people-using-the-app)\n    * [What we do with the information](#what-we-do-with-the-information-we-gather)\n    * [Security](#security)\n    * [Controlling your personal information](#controlling-your-personal-information)\n* [License](#license)\n* [Known issues](#known-issues-apr-2018)\n\n# About the project\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n      \u003cimg src=\"doc/logo-android-robot.svg\" alt=\"Android logo\" height=\"76\"/\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003cimg src=\"doc/logo-java.svg\" alt=\"Java logo\" height=\"76\"/\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003cimg src=\"doc/logo-sqlite.svg\" alt=\"SQLite logo\" height=\"76\"/\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003cimg src=\"doc/logo-gradle.svg\" alt=\"SQLite logo\" height=\"68\"/\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003e [!IMPORTANT]\n\u003e DISCLAIMER\n\u003e I started this project to play around with Android architecture components for my own knowledge.\n\u003e I do not pretend the code is a reference.\n\u003e Some functionalities and checks might be missing or incomplete.\n\u003e This project is not intended to be used in a production environment.\n\nThe purpose of this application is to allow easy retrieval of trading data from online\ncryptocurrency exchanges. It only allows visualization of data, it can **NOT** be used as a trading\nplatform.\n\nIt has been kept very simple, by gathering only trading data needed to calculate your portfolio\nvalue and some statistics.\n\nIt is directly connected to major exchanges so you don't have to manually fill the orders.\n\nHere is the currently supported exchanges :\n\n- Kraken : https://www.kraken.com/\n- Poloniex : https://poloniex.com/\n- Bitfinex : https://www.bitfinex.com/\n- Bittrex : https://bittrex.com/\n\n# Screenshots\n\n![Homepage screenshot](doc/screen_home.png \"Homepage\")\n![Transactions page screenshot](doc/screen_transactions.png \"Transactions page\")\n![Edit transaction page screenshot](doc/screen_edit_transaction.png \"Edit transaction page\")\n![BTC price graphic screenshot](doc/screen_graphic.png \"BTC price Graphic\")\n![ICO list screenshot](doc/screen_ico.png \"ICO list\")\n![Exchanges selection screenshot](doc/screen_synchro_selection.png \"Exchanges selection\")\n![Exchange synchronization page screenshot](doc/screen_synchro.png \"Exchange synchronization page\")\n![Backup/restore page screenshot](doc/screen_backup_restore.png \"Backup/restore page\")\n\n# Usage\n\n1. Create API keys in your favorite exchange platform (read only recommended)\n2. In the application, go to the _settings_ page, then in the _Exchanges_ menu, edit the concerned\n   exchange to add the related keys (public and private)\n3. Still in the settings page, click the 'synchronize' button under the _Synchronize with exchanges_\n   menu\n4. Enjoy a beer watching your million dollars\n\n# Technical details\n\n## Compatibility\n\n- Minimum SDK : **19** (Android Kitkat)\n- Targeted SDK : **27** (Android Oreo)\n\nMain theme is based directly on the raw\n[Material Theme](https://developer.android.com/training/material/theme.html) for Android 5.0\n(API 21) and above, else a `Theme.AppCompat` theme is used.\n\nThereby the [Support libraries](https://developer.android.com/topic/libraries/support-library/index.html)\nhave been used for backward compatibility ([v7](https://developer.android.com/topic/libraries/support-library/packages.html#v7)).\nIt adds support for the Action Bar user interface design pattern and includes support for material\ndesign user interface implementations (RecyclerView, CardView, etc.). The following ones have been used :\n\n- [Design Support library](https://developer.android.com/training/material/design-library.html)\n- [AppCompat library](https://developer.android.com/topic/libraries/support-library/packages.html#v7-appcompat)\n- [CardView library](https://developer.android.com/topic/libraries/support-library/packages.html#v7-cardview)\n- [RecyclerView library](https://developer.android.com/topic/libraries/support-library/packages.html#v7-recyclerview)\n- [ConstraintLayout library](https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html)\n\n## Technologies\n\n- Java 8\n- [SQLite](https://www.sqlite.org) as basic embedded database\n- [Android architecture components](https://developer.android.com/topic/libraries/architecture/index.html)\n    - [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel.html) helper\n      class to facilitate the MVVM architecture\n    - [LiveData](https://developer.android.com/topic/libraries/architecture/livedata.html) as data\n      holder, to keep data up to date by respecting application lifecycle\n    - [Paging](https://developer.android.com/topic/libraries/architecture/paging.html) library for\n      displaying large sets of data (paged lists)\n    - [Room](https://developer.android.com/topic/libraries/architecture/room.html) as persistence\n      library (with singleton database instance)\n- [Retrofit 2](http://square.github.io/retrofit/) as HTTP client helper (with GSON2).\n  A [logging interceptor](https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor) has\n  also been used for logging with OkHttp 3 (Retrofit 2 completely relies on OkHttp for any network\n  operation).\n- [MPAndroidChart](https://github.com/PhilJay/MPAndroidChart) library for charts\n\n## Architecture\n\nApplication has been implemented using the **MVVM** (Model-View-ViewModel) pattern as described below :\n\n```mermaid\nflowchart TB\n\n    style VIEW fill: #205566\n    style VIEWMODEL fill: #205566\n    style ADAPTER_VIEWHOLDER fill: #205566\n    style ROOM fill: #205566\n    style MODEL fill: #205566\n    style SERVICE fill: #205566\n    style REPOSITORY fill: #3d681b\n    style API fill: #806030\n    style DATABASE fill: #804030\n\n    subgraph VIEW\n        ACTIVITY_FRAGMENT(Activity / Fragment)\n    end\n\n    subgraph VIEWMODEL\n        LIVEDATA_OBSERVER(LiveData / Observer)\n    end\n\n    ADAPTER_VIEWHOLDER[Adapter / ViewHolder]\n\n    REPOSITORY[Repository]\n\n    subgraph ROOM\n        DAO(DAO)\n        ENTITY(Entity)\n    end\n\n    DATABASE[(SQLite)]\n\n    MODEL[Model]\n\n    subgraph SERVICE\n        RETROFIT(Retrofit)\n    end\n\n    API{{Exchanges API}}\n\n    VIEWMODEL --\u003e ADAPTER_VIEWHOLDER\n    VIEW --\u003e VIEWMODEL\n    VIEWMODEL --\u003e REPOSITORY\n    VIEWMODEL -.-\u003e MODEL\n    REPOSITORY ---\u003e ROOM\n    REPOSITORY --\u003e MODEL\n    ROOM --\u003e DATABASE\n    MODEL --\u003e SERVICE\n    SERVICE --\u003e API\n    \n    \n```\n\n## Code structure\n\nApplication code has been organized with the following package structure :\n\n- _activities_ : UI interaction classes\n- _adapters_ : underlying views datasets management classes\n- _components_ : custom components / decorators\n- _dao_ : database access object interfaces\n- _entities_ : database entity classes\n- _helpers_ : helper classes\n- _managers_ : manager classes that acts as proxy between viewmodels and daos/services\n- _models_ : simple model classes (mainly used for services)\n- _services_ : services classes responsible for calling web services\n- _viewholders_ : view holder classes that holds view elements to speed up rendering\n- _viewmodels_ : viewmodel classes that store and manage UI-related data\n\n## Mechanics\n\nData got from online exchanges are stored in the local SQLite database :\n\n- all assets from different exchanges are merged into a single `CURRENCY` table\n- all trades from different exchanges are merged into a `TRANSACTIONS` table\n\nNote: same currencies with different names are merged (ie. Kraken XBT becomes BTC).\n\nThat way we have a simple `EXCHANGE` - `CURRENCY` - `TRANSACTIONS` relation, and have no need to\ncall exchange API each time. Simply resynchronize the exchanges on which you performed new\noperations (from the settings menu) to get up-to-date data.\n\n# Privacy\n\nThis privacy policy sets out how we use and protect any information that you give when you use\nthis application.\n\nShould we ask you to provide certain information by which you can be identified when using this\napplication, then you can be assured that it will only be used in accordance with this privacy\nstatement.\n\nWe may change this policy from time to time by updating this page. You should check this page from\ntime to time to ensure that you are happy with any changes.\n\n## What personal information do we collect from people using the app?\n\nWhen using this application, you may only be asked to enter your exchange public and private API\nkeys so we can retrieve your public and private exchange data. We will **NEVER** ask you to provide\nany credit card number, wallet private key or other sensitive data.\n\nThe application may communicate with mentioned exchanges and with the\n[CryptoCompare API](https://www.cryptocompare.com/api/) to get live trading data.\n\nThereby we may collect the following information:\n\n- any data available from the API related to the exchange(s) you have linked\n- any data you may manually enter in the app\n\n## What we do with the information we gather\n\nWe simply use that information to display your trading data and some statistics.\n\nWe will not sell, distribute or lease any of your personal information to third parties. We will\nnever transmit any data about a user without obtaining its prior permission and providing\ninformation about how and where the data will be used.\n\nWe will never display any advertising and/or send you promotional information about third parties.\n\n## Security\n\nRaw data is only stored in the local embedded SQLite database. Once in the app, it will never be sent\nover the network to any centralized server. Keys are AES encrypted before storage.\n\nAndroid Auto backup is disabled, so application data will not be sent to your Google Drive account.\nIf you need to backup your data, please use the backup/restore functionality from the Settings menu.\n\nThe backup/restore functionality writes CSV files to the internal storage in the application-specific\ndirectory so it does not require any additional permission. Your keys will remain AES encrypted in\nthe backed up file.\n\nI have planned to use [Android Keystore System](https://developer.android.com/training/articles/keystore.html)\nin the near future to store the exchange API keys but for the moment I simply used an AES encryption.\n\nTherefore, we cannot guarantee the security of your data as any APK file can be easily decompiled.\nIt's up to you to keep your application and related data in safe hands.\n\n## Controlling your personal information\n\nYou can decide at any time to remove this application and your data will be gone with.\n\n# License\n\n[General Public License (GPL) v3](https://www.gnu.org/licenses/gpl-3.0.en.html)\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU\nGeneral Public License as published by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\neven the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nGeneral Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program. If not,\nsee \u003chttp://www.gnu.org/licenses/\u003e.\n\n# Known issues (Apr 2018)\n\n- Bittrex API is broken and does not allow to retrieve order history\n- Bitfinex API order history is limited to last 3 days and 1 request per minute -\u003e use \"Past\n  Trades\" endpoint that must be called for each pair...\n- Backup / restore functionality simply backup and restore the exchanges list\n- Paging need to be refactored because of deprecated methods","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyann39%2Fmy-crypto-binder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyann39%2Fmy-crypto-binder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyann39%2Fmy-crypto-binder/lists"}