{"id":24199378,"url":"https://github.com/mahmoudmabrok/quranyapp","last_synced_at":"2025-04-07T15:08:08.737Z","repository":{"id":34773998,"uuid":"177177812","full_name":"MahmoudMabrok/QuranyApp","owner":"MahmoudMabrok","description":"Open Source HolyQuran app that provide Read, Listen, Tafseer, Test all of them and app is very small size.","archived":false,"fork":false,"pushed_at":"2024-08-05T18:06:11.000Z","size":28388,"stargazers_count":198,"open_issues_count":34,"forks_count":50,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-08-05T21:09:22.927Z","etag":null,"topics":["android","quran","quran-json","quran-offline"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MahmoudMabrok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":"95b21e4a-d0b3-4f70-bbfc-931845b0608b","liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2019-03-22T16:50:40.000Z","updated_at":"2024-08-05T18:06:14.000Z","dependencies_parsed_at":"2024-05-18T11:21:40.524Z","dependency_job_id":"41af69e1-feee-4a79-9a6d-9a2b2582c101","html_url":"https://github.com/MahmoudMabrok/QuranyApp","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MahmoudMabrok%2FQuranyApp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MahmoudMabrok%2FQuranyApp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MahmoudMabrok%2FQuranyApp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MahmoudMabrok%2FQuranyApp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MahmoudMabrok","download_url":"https://codeload.github.com/MahmoudMabrok/QuranyApp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247675597,"owners_count":20977376,"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","quran","quran-json","quran-offline"],"created_at":"2025-01-13T20:35:58.124Z","updated_at":"2025-04-07T15:08:08.716Z","avatar_url":"https://github.com/MahmoudMabrok.png","language":"Java","funding_links":["https://funding.communitybridge.org/projects/95b21e4a-d0b3-4f70-bbfc-931845b0608b"],"categories":[],"sub_categories":[],"readme":"# QuranyApp\n\n[![Hits-of-Code](https://hitsofcode.com/github/MahmoudMabrok/QuranyApp?branch=master)](https://hitsofcode.com/github/MahmoudMabrok/QuranyApp/view?branch=master)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/f9f42c68a0764798869e714a215990cf)](https://app.codacy.com/manual/MahmoudMabrok/QuranyApp?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=MahmoudMabrok/QuranyApp\u0026utm_campaign=Badge_Grade_Dashboard)\n[![HitCount](http://hits.dwyl.com/mahmoudmabrok/QuranyApp.svg)](http://hits.dwyl.com/mahmoudmabrok/QuranyApp)\n[![GitHub Issues](https://img.shields.io/github/issues/MahmoudMabrok/QuranyApp?style=flat-square)](https://github.com/MahmoudMabrok/QuranyApp/issues)\n[![GitHub license](https://img.shields.io/github/license/MahmoudMabrok/QuranyApp)](https://github.com/MahmoudMabrok/QuranyApp/blob/master/LICENSE)\n\u003ch1 align=center\u003e\n\u003cimg src=\"logo/horizontal.png\" width=55%\u003e\n\u003c/h1\u003e\n\nOpen Source HolyQuran app that provide Read, Listen, Tafseer, Test all of them and app is very small size\n\n- [Google Play Link ](https://play.google.com/store/apps/details?id=education.mahmoud.quranyapp)\n- [F-Droid link](https://apt.izzysoft.de/fdroid/index/apk/education.mahmoud.quranyapp) \n- App Reviews \n  - [Youtube Playsit, Journey with App](https://www.youtube.com/watch?v=L4ElhxFyjKA\u0026list=PL7ZA5t6QDessHFv0JplnjqyCb066QCIyc).\n  - [Versions Demos](https://www.youtube.com/watch?v=BrAeS9-woW0\u0026list=PL7ZA5t6QDesvQGUUa0NxfAog0GwYc0g7T).\n- apk\n  - [latest](https://github.com/MahmoudMabrok/QuranyApp/releases/tag/2.6)\n- [My Journey to build App in Arabic](https://www.linkedin.com/pulse/%D8%B1%D8%AD%D9%84%D8%AA%D9%89-%D9%84%D8%A8%D9%86%D8%A7%D8%A1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%82%D8%B1%D8%A7%D9%86-%D8%A7%D9%84%D9%83%D8%B1%D9%8A%D9%85-mahmoud-mabrouk-fouad/)  \n- Last Version with Java [Branch](https://github.com/MahmoudMabrok/QuranyApp/tree/java_last_version)\n# Screens\n\u003cdiv\u003e\n \u003cimg src=\"https://user-images.githubusercontent.com/13488900/122588290-32578880-d05f-11eb-9891-f0e438e51f18.png\" width = 20%\u003e\n \u003cimg src=\"https://user-images.githubusercontent.com/13488900/122588274-2d92d480-d05f-11eb-83d1-1b39d039caa0.png\" width = 20%\u003e\n \u003cimg src=\"https://user-images.githubusercontent.com/13488900/122588266-2bc91100-d05f-11eb-9323-abeb0f88a316.png\" width = 20%\u003e\n  \u003c/div\u003e\n  \n# Note : App is being refactored into Kotlin (Reach now MVP stage from app with Kotlin)  \n\n# Features[of full App]\n- Go to specific sura by Scrolling and click.\n- Go to specific sura by its Num.\n- Go to specific sura by its Name.\n- Go to Specific Juz\n- Go to last Read Position.\n- Search for words or complete ayah.\n- Download and Listen to ayahs\n- Repeat each ayas and repeat whole listening\n- Tafseer\n- Points for Tasmee3 \n- can report a bug, chat with app developer powered by InstaBug - explaned in demo video - (Not Available now).\n- ReadLog that store pages user read.\n- Continue reading when open app. \n- App is Full Quran and Tafseer.\n\n# Challenges \n- **Data** \nfirst one was data, how to get data, first i found images of quran and build app using it but app size is too larg so i searched for text of quran i have found XML version of quran but i prefere JSON over xml then i got JSON version of quran and built 1.0 version of app.\n- **Last Read Feature** \nits a good feature to save last position of read automatically I have faced problem with get scroll Position  but finally got it using ``` scrollView.getScrollY();   ``` and save it in sharedPreference, and scroll back using ```  scrollView.smoothScrollTo(0, scroll); ``` \n\n- **Improve Performance**\nlast method app load data from JSON and parse it with every open to **sura** so solution was use of db, i have used Room and build entities, Dao, and Database.\n\n- **Search**\nSearch is fundamental feature of any Qurany App so I wrote Query to search in Ayahs but faced problem that Quran is dialacted(Tashkill - symbols) which make search impossible so I have searched and get a clean Version and add it beside last one (each ayah has two version one for display and other to search), data was XML from [Tanzil](http://tanzil.net/download) and use online converter to convert from XML to JSON but file was not as standard of JSON  so I have fixed it.\n\n- **Listening**\nDownload audio have two ways first download whole sura or download seperate ayahs, i have used seperate ayahs to enable feature of listen to specific ayahs. I download audio in storage then store path into database to be used by medialPlayer.\n\n- **Automatice Scroll down** \nwas good feature but challegable I found a way for that by using **TimerTask** its job to scroll scrollView down by a constant num, but how to change rate with response to use? I create seekbar and after each change i make new Task but not this way has conflicts so i declare *attribute*  that changed by rate from user and used by **timertask**  \n\n- **App Not Working with Android 8**\nthere were a problem with downloading audio on Android 8, I found that we must allow traffic \n*solution* \nat Manifiest\n``` XML\n    \u003capplication\n        android:usesCleartextTraffic=\"true\"\n        \n        \u003e\u003c/application\u003e\n```  \n- **Unrelated histories Unable to merge** \nI have tried to make repo clonable and run without problem but i lost all **63 commit**.\nAlhumdllah now developers can **clone \u0026 fork \u0026 pull** and help us to develop app.\n\n- **Update UI after finish downloading**\nafter returning from download activity it is good to load data, I have tried play with lifecycle but not work.\nI solved it using a tricky solution\n\n``` java\n@Override\n    protected void onResume() {\n        super.onResume();\n        // used to update UI\n        int id = navigation.getSelectedItemId();\n        navigation.setSelectedItemId(id); // here fragment will be opened with new Data\n    }\n```\n\n- **Display HizbQurater**\nI created a function to count and display hizbQuarter info but faced challenge of determine the **first** and **right time** to display it.\nso it made a **SQL Query** to get startIndex of pages that contain *first HizbQuarter*.\n\n- **Android Design Library not working**\ncan not resolve design library so that BottomNavigation and other component not work. After 3 days from solving errors and applying stackoverflow solutions finally solved it by migrating to androidX and solve some third party library configuration.\n\n- **Bad Experience with Toasts**\ntoasts was shown one after other and conflict user so solution was to check first if toast is shown cancel it then show new one.\n``` java \n Toast toast ;\n    private void showMessage(String message) {\n        if (toast != null){\n            toast.cancel();\n        }\n        toast = Toast.makeText(this , message, Toast.LENGTH_SHORT);\n        toast.show();\n\n    }\n```\n\n\n## Mistakes \u0026 Learn \n\n- The app have crashed  on real device but app work correctly on emulator so I used a **crashReporter library** and it generates a report after check I found problem was with **primaryColor** that it has a **alpha value** so I removed alpha and app work correctly.\n\n- got error when I built release app after use **retrofit** so I added some rules for **proguard** \n\n```\n# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and\n# EnclosingMethod is required to use InnerClasses.\n-keepattributes Signature, InnerClasses, EnclosingMethod\n# Retain service method parameters when optimizing.\n-keepclassmembers,allowshrinking,allowobfuscation interface * {\n    @retrofit2.http.* \u003cmethods\u003e;\n}\n# Ignore annotation used for build tooling.\n-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement\n# Ignore JSR 305 annotations for embedding nullability information.\n-dontwarn javax.annotation.**\n# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.\n-dontwarn kotlin.Unit\n\n```\n\n- *baseUrl* of **retrofit** must end with / \n\n- betwenen has upper bound **included** so if we want from 1 to 10 SQL will be between 1 and 10. \n\n- while creating custome dialog I want to remove title so I use ``dialog.requestWindowFeature`` but\nit was called after ``dialoge.setContentView()``, it is error to call it after `setContentView`. \n\n\n# ChangeLog\n\n- **V2.5.1**\n  - Add  awesome Intro\n  - Add continue reading feature that Ask user to go to last page to read.\n  - App start with Quran \u0026 Tafseer loaded.\n  - Improve UI for bottom nav\n     - add labels and it appear all the time.  \n\n\n\n- **V2.3.1**\n  - Add ReadLog that store pages user read.\n  - Improve UI for page switching.\n  - fix bugs [#13](https://github.com/MahmoudMabrok/QuranyApp/issues/13),[#24](https://github.com/MahmoudMabrok/QuranyApp/issues/24),[#34](https://github.com/MahmoudMabrok/QuranyApp/issues/34),[#43](https://github.com/MahmoudMabrok/QuranyApp/issues/43),[#44](https://github.com/MahmoudMabrok/QuranyApp/issues/44),[#46](https://github.com/MahmoudMabrok/QuranyApp/issues/46).\n\n\n\n- **V2.1.3**\n  - new UI\n     - page layout\n     - setting activity\n  - new way of switching pages\n  - fix bugs [#39](https://github.com/MahmoudMabrok/QuranyApp/issues/39),[#38](https://github.com/MahmoudMabrok/QuranyApp/issues/38),[#37](https://github.com/MahmoudMabrok/QuranyApp/issues/37),[#35](https://github.com/MahmoudMabrok/QuranyApp/issues/35). \n\n- **V2.0** \n  - new UI\n    - ayahEnd Symbol is fixed.\n    - UI for Listen \u0026 Test.\n  - add HizbQuarter Info.\n  - Tafseer is now offline.\n  - fix Bugs [#31](https://github.com/MahmoudMabrok/QuranyApp/issues/31),[#30](https://github.com/MahmoudMabrok/QuranyApp/issues/30).[#29](https://github.com/MahmoudMabrok/QuranyApp/issues/29),[#28](https://github.com/MahmoudMabrok/QuranyApp/issues/28),[#27](https://github.com/MahmoudMabrok/QuranyApp/issues/27).\n  - add **InstaBug**(trial) for in-app feedback and crash reporting feature.\n\n\n\n## Technologies\nQurany is built using:\n\nTechnology | Version\n---------- | -------\nJava | 8\nXML | 1.0\nAndroid Support Library | 28.0.0\nretrofit2 | 2.3.0\nRoom| 1.1.1\nButterKnife | 8.8.1\ncrashreporter | 1.0.9\ngson | 2.8.5\nsdp-android | 1.0.5 \nssp-android | 1.0.5\nAppRate | 1.1\nprdownloader | 0.4.0\neasypermissions|1.1.1\nstetho | 1.5.1\nAndroid-SpinKit | 1.2.0\n\n# statistics\n\nLanguages | Line of code (LOC)\n---------- | -------\nJava | 10494\nXML | 3498\n\n- 31/3 / 13/4\n![folow](https://user-images.githubusercontent.com/13488900/79120712-d545b000-7d93-11ea-8a3a-1152887d9f28.png)\n\n- 19/3 - 1/4\n![folow](https://user-images.githubusercontent.com/13488900/78177161-f76b3400-745d-11ea-9277-d92771cc226c.png)\n\n- 28/2 - 12/3 \n![git flow](https://user-images.githubusercontent.com/13488900/76508469-17a76480-6457-11ea-9ce3-4e5a76496fc6.png)\n\n\n------ \n\n# Contributors \n- Thanks to [zularizal](https://github.com/zularizal) for awesome logo\n- Thanks to [izzysoft](https://github.com/IzzySoft) for providing another installion source.\n\n--------\n\n# App Testers \nThanks for your efforts for testing Qurany App, keep moving:\n- [crysports](https://github.com/crysports)\n- [XAMIR555](https://github.com/XAMIR555)\n- [44asad](https://github.com/44asad)\n- [facebook-786](https://github.com/facebook-786)\n- [sagorahmed](https://github.com/sagorahmed)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmahmoudmabrok%2Fquranyapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmahmoudmabrok%2Fquranyapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmahmoudmabrok%2Fquranyapp/lists"}