From 92c2bf2822f21cca91a4ff3e415781c2eb950b25 Mon Sep 17 00:00:00 2001 From: Aryan Date: Wed, 25 Feb 2026 19:54:43 +0530 Subject: [PATCH] docs: Revamp README and add APK naming convention (#2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit introduces a complete overhaul of the `README.md` to improve project presentation. Key changes include: • Adds a new header with the app icon and a Google Play badge. • Updates the feature graphic and includes a note distinguishing the OSS version from the Play Store version. • Refines the "Open Source Libraries" section to be more structured. • Moves the main preview image into the `docs` directory. Additionally, the `app/build.gradle.kts` file is updated to configure a standardized naming convention for output APK files, including flavor, version, and build type. --- README.md | 40 +++++++++++++++++++++--------- app/build.gradle.kts | 13 ++++++++++ build.gradle.kts | 2 +- EPISTEME.png => docs/EPISTEME.png | Bin docs/ICON.png | Bin 0 -> 12890 bytes 5 files changed, 42 insertions(+), 13 deletions(-) rename EPISTEME.png => docs/EPISTEME.png (100%) create mode 100644 docs/ICON.png diff --git a/README.md b/README.md index ba0b08f..991c7ae 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,28 @@ -# Episteme Reader +
-A native Android document reader application built with Kotlin and Jetpack Compose. +

+ Episteme Reader Icon +  Episteme Reader +

-![Episteme Reader](docs/feature_graphic.png) +

A native Android document reader application built with Kotlin and Jetpack Compose.

+ + + Get it on Google Play + + +
+ +
+ +![Episteme Reader Preview](docs/EPISTEME.png) ## Overview Episteme Reader is an offline-first application designed for reading various document formats. It leverages native Android technologies and C++ libraries to provide a performant reading experience with customization capabilities. +> **Note:** This is the Open Source (OSS) edition of Episteme Reader. The version available on the Google Play Store is built from this core but includes additional proprietary features. + ## Features ### Supported Formats @@ -27,7 +42,7 @@ Episteme Reader is an offline-first application designed for reading various doc ### General * **Text-to-Speech (TTS):** Read documents aloud using the system TTS engine. -* **File Management:** Built-in file browser and library organization. +* **File Management:** Built-in library organization. ## Architecture @@ -35,14 +50,15 @@ Episteme Reader is an offline-first application designed for reading various doc * **Architecture:** MVVM with Unidirectional Data Flow. * **Database:** Room (SQLite) for metadata and annotations. * **PDF Engine:** `pdfium-android` (Native PDFium bindings). +* **EPUB Engine:** Utilizes standard `WebView` for vertical scrolling mode, and a custom rendering engine for paginated mode. * **Mobi Engine:** Custom JNI bindings to `libmobi`. ## Building from Source 1. **Clone the repository:** ```bash - git clone https://github.com/your-username/episteme-oss.git - cd episteme-oss + git clone https://github.com/Aryan-Raj3112/episteme.git + cd episteme ``` 2. **Build:** @@ -53,13 +69,13 @@ Episteme Reader is an offline-first application designed for reading various doc ## Open Source Libraries -This project uses the following open-source libraries: +This project is made possible by the Android open-source ecosystem: -* [pdfium-android](https://github.com/barteksc/PdfiumAndroid) -* [libmobi](https://github.com/bfabiszewski/libmobi) -* [Coil](https://coil-kt.github.io/coil/) -* [Jsoup](https://jsoup.org/) -* [Flexmark](https://github.com/vsch/flexmark-java) +* **Core & UI:** AndroidX, Jetpack Compose, Kotlinx Serialization +* **Document Engines:** PdfiumAndroidKt (PDF), libmobi (MOBI/AZW3), Google WOFF2 (Fonts) +* **Parsers:** Jsoup (HTML/EPUB), Flexmark (Markdown) +* **Media & Image Loading:** Coil, Media3 (ExoPlayer) +* **Utilities:** Room (Database), Timber (Logging) ## License diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cac0c50..3056254 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -78,6 +78,19 @@ android { ) } } + + applicationVariants.all { + val variant = this + outputs.all { + val output = this as com.android.build.gradle.internal.api.ApkVariantOutputImpl + val flavor = variant.productFlavors.getOrNull(0)?.name ?: "" + val buildType = variant.buildType.name + val version = variant.versionName + + output.outputFileName = "Episteme-$flavor-v$version-$buildType.apk" + } + } + compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/build.gradle.kts b/build.gradle.kts index 952b930..6e1e49a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,4 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. +// Top-level build file where you can add configuration options common to all subprojects/modules. plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false diff --git a/EPISTEME.png b/docs/EPISTEME.png similarity index 100% rename from EPISTEME.png rename to docs/EPISTEME.png diff --git a/docs/ICON.png b/docs/ICON.png new file mode 100644 index 0000000000000000000000000000000000000000..2063689d6e4f026d569c850d8079c54310c46f9b GIT binary patch literal 12890 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 x4