Skip to content

Commit cd72e9d

Browse files
First Upload Full
0 parents  commit cd72e9d

File tree

226 files changed

+11247
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

226 files changed

+11247
-0
lines changed

CHANGELOG.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
## Changes
2+
3+
# Rose EPUB Reader Changelog
4+
5+
This update introduces significant improvements to the original Mizumi fork, focusing on enhanced functionality, user experience, and EPUB parsing capabilities.
6+
7+
---
8+
9+
## **Added Features**
10+
11+
### **Settings Screen and Functionality**
12+
- **Font Customization:**
13+
- Adjustable font size (12sp to 24sp).
14+
- Font family cycling (serif, sans-serif, monospace).
15+
- **Library Preferences:**
16+
- Sort chapters in ascending or descending order.
17+
- **Persistent Settings:**
18+
- Implemented DataStore for saving user preferences.
19+
20+
---
21+
22+
## **Removed Features**
23+
24+
- **Deprecated Functionality:**
25+
- Text-to-Speech and translation capabilities.
26+
- Search and filter buttons from the top bar.
27+
- Incognito mode, stats, and settings from the dropdown hamburger menu.
28+
- Navigation bar sections: Explore and History (reverted to v1.0 NovelDokusha style).
29+
- Networking dependencies from `build.gradle.kts`.
30+
- **UI Cleanup:**
31+
- Removed filter button, hamburger menu, and tracking button from `bookscreen.kt`.
32+
- Removed book tracking buttons and features from `bookactionbar.kt`.
33+
- Removed Profile/More screen from the navbar and main screen, leaving only Library and Settings.
34+
35+
---
36+
37+
## **UI/UX Improvements**
38+
39+
- **Custom Branding:**
40+
- Added a custom app logo created using ImageMagick.
41+
- **Reader Screen Enhancements:**
42+
- Single tap now displays both the reader top bar and device navigation bar for quick access.
43+
- Improved overall readability and interaction.
44+
- **Settings Screen:**
45+
- Intuitive controls for font size (slider) and font family (cycling button).
46+
- Toggle switches for library preferences.
47+
48+
---
49+
50+
## **EPUB Parser Enhancements**
51+
52+
- **Improved Metadata Handling:**
53+
- Robust description parsing from multiple metadata sources.
54+
- Enhanced cover image extraction.
55+
- **Chapter and TOC Parsing:**
56+
- Simplified parsing for both NCX and non-NCX EPUBs.
57+
- Better chapter title detection and ordering.
58+
- More reliable content extraction for unusual EPUBs with non-standard TOC specifications.
59+
- **Library Import:**
60+
- Improved parsing for better compatibility with a wider range of EPUB files.
61+
62+
---
63+
64+
## **Data Management**
65+
66+
- **Persistent Storage:**
67+
- Implemented DataStore for managing app settings:
68+
- Reader preferences (font size, font family).
69+
- Library preferences (chapter sort order).
70+
- App state persistence.
71+
72+
---
73+
74+
This update focuses on refining the user experience, improving EPUB parsing, and streamlining the app’s functionality. Let us know your feedback!

README.md

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# Rose Reader
2+
3+
A lightweight EPUB reader for Android that does one thing — and does it well.
4+
Inspired by NovelDokusha, Tachiyomi, Mihon, and shrimqy's Mizumi to create something simple, clean, and lasting.
5+
6+
---
7+
8+
## Features
9+
10+
- Local EPUB reading — and only EPUB. No distractions.
11+
- Chapter navigation built right into the reader.
12+
- Full image and GIF support.
13+
- Position recall — because your time is precious.
14+
- Runs smooth, even on devices others have long given up on.
15+
16+
---
17+
18+
## Screenshots
19+
20+
A picture says more than a thousand promises.
21+
Here’s a glimpse of what you’re stepping into with Rose:
22+
23+
| Library | Settings |
24+
|:-------------------------------:|:---------------------------------:|
25+
| ![](screenshots/library.png) | ![](screenshots/settings.png) |
26+
| Book Info | Reader |
27+
| ![](screenshots/book_info.png) | ![](screenshots/reader.png) |
28+
29+
---
30+
31+
## The Pitch
32+
33+
Picture this: a world where your apps don't shout for your attention — they whisper.
34+
35+
Where less isn't just more — it’s everything.
36+
37+
Rose was born from a simple, stubborn idea:
38+
*What if a reader did less... but did it better?*
39+
40+
I tried my hand at building one before — you’ll find *Vera* gathering dust in the archives.
41+
It wasn’t terrible. It just wasn’t *right.*
42+
And like any good creative chasing the next shiny object, I walked away from it. More than once.
43+
44+
But not this time.
45+
46+
Rose is the distilled spirit of Mizumi — itself a lean remix of NovelDokusha.
47+
Book-story by Acclorite? A wonder. But it tried to be too much at once — a translator, an animator, a circus act.
48+
I didn’t need fireworks.
49+
I needed a quiet place to read.
50+
51+
So I took Mizumi’s 8,000 lines of code, and stripped it to the bone — down to 7,000 lines that mattered.
52+
Gone are the translators, the scraping, the networking, the gimmicks.
53+
What’s left is pure, undiluted reading.
54+
55+
Want the details? They’re tucked neatly away in the [CHANGELOG.md](CHANGELOG.md). Like an old briefcase full of pitches that still matter.
56+
57+
---
58+
59+
## What Really Happened
60+
61+
It started in October 2024.
62+
A folder. A project. *Rose.*
63+
64+
Inside that folder lived ten tarball archives — *v1* through *v10* — each one a chapter of slow, stubborn progress.
65+
My old-school method of backup: simple, primitive, reliable enough... or so I believed.
66+
67+
Each version was a little better than the last.
68+
A little tighter. A little closer to the truth of what I wanted Rose to be.
69+
70+
But fate is a cruel partner.
71+
72+
One Friday night — a few drinks too deep, a few bad keystrokes — and the whole archive was wiped away.
73+
Weeks of work, gone in a flash.
74+
The only survivor?
75+
A forgotten microSD card, tucked away in a drawer — carrying an old backup of *v1.* Outdated, imperfect, but alive.
76+
77+
After that... the fire to rebuild it from scratch was gone.
78+
The settings page, the theme selector, all the polish I meant to add — left unfinished, like a half-sketched ad campaign that never aired.
79+
80+
Sometimes, you realize it’s not about rebuilding.
81+
It’s about handing off the torch.
82+
83+
Rose isn’t perfect.
84+
It isn’t finished.
85+
But it’s real.
86+
87+
Now it’s yours.
88+
Take it. Shape it. Make it better than I ever could.
89+
90+
---
91+
92+
## Fork Family Tree
93+
94+
NovelDokusha → Mizumi → Rose
95+
96+
Every idea has roots.
97+
Rose didn’t just appear out of thin air — it’s the refined product of a lineage that dared to think differently.
98+
99+
---
100+
101+
## Implementation Notes
102+
103+
Rose was built from Mizumi commit `da8282eab2`, chosen for one simple reason:
104+
It had the right bones.
105+
106+
What Mizumi brought to the table:
107+
108+
- Solid EPUB parsing — dependable and strong.
109+
- Image handling — crisp, effortless.
110+
- Material 3 design — using Jetpack Compose to build for tomorrow.
111+
- Clean, readable code — no spaghetti, no smoke and mirrors.
112+
- Core features — and none of the excess.
113+
114+
And just as importantly, what Mizumi left out:
115+
116+
- No text-to-speech clutter.
117+
- No bottom bar weighing down the reader.
118+
- No network scraping to gum up the experience.
119+
120+
When you want the best, you don’t reinvent the wheel.
121+
You find the best version — and make it better.
122+
123+
---
124+
125+
## Acknowledgements
126+
127+
- [Nina](https://github.com/nanihadesuka) for [NovelDokusha](https://github.com/nanihadesuka/NovelDokusha) — the first spark.
128+
- [shrimqy](https://github.com/shrimqy) for [Mizumi](https://github.com/shrimqy/Mizumi) — the foundation that made Rose possible.
129+
- JetBrains — for giving us Kotlin, a tool as elegant as the work demands.
130+
- The Jetpack Compose team — for building a modern UI toolkit that feels effortless.
131+
132+
Want to see it for yourself?
133+
Clone the project, run `assembleRelease`, and step into a reading experience that feels like coming home.
134+
135+
---
136+
137+
## Acknowledgements Emphasized
138+
139+
It would be a crime not to give special thanks to [shrimqy](https://github.com/shrimqy).
140+
141+
Stripping 20,000 lines of code down to its essentials isn’t a task — it’s a war.
142+
And shrimqy won it beautifully.
143+
Mizumi wasn’t just a fork — it was a revelation.
144+
After I debloated it, it became my daily reader. My quiet refuge in a noisy world.
145+
146+
Thanks to shrimqy’s work, I didn’t have to start from scratch.
147+
I just had to find the path.
148+
149+
Because of that, Rose exists — simple, fast, honest.
150+
A reader for people who still believe less can be everything.
151+
152+
I hope someone else picks up where I leave off.
153+
Maybe you’ll find the same peace I did.
154+
155+
Maybe you’ll build something even better.
156+
157+
---

app/build.gradle.kts

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
plugins {
2+
id("com.android.application")
3+
id("org.jetbrains.kotlin.android")
4+
id("com.google.devtools.ksp")
5+
id("com.google.dagger.hilt.android")
6+
}
7+
8+
android {
9+
namespace = "com.john.rose"
10+
compileSdk = 34
11+
12+
defaultConfig {
13+
applicationId = "com.john.rose"
14+
minSdk = 31
15+
targetSdk = 34
16+
versionCode = 1
17+
versionName = "1.0"
18+
19+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
20+
vectorDrawables {
21+
useSupportLibrary = true
22+
}
23+
}
24+
25+
buildTypes {
26+
release {
27+
isMinifyEnabled = true
28+
isShrinkResources = true
29+
proguardFiles(
30+
getDefaultProguardFile("proguard-android-optimize.txt"),
31+
"proguard-rules.pro"
32+
)
33+
signingConfig = signingConfigs.getByName("debug")
34+
}
35+
}
36+
37+
compileOptions {
38+
sourceCompatibility = JavaVersion.VERSION_17
39+
targetCompatibility = JavaVersion.VERSION_17
40+
}
41+
42+
kotlinOptions {
43+
jvmTarget = "17"
44+
}
45+
46+
buildFeatures {
47+
viewBinding = true
48+
compose = true
49+
}
50+
51+
composeOptions {
52+
kotlinCompilerExtensionVersion = "1.5.10"
53+
}
54+
55+
dependenciesInfo {
56+
includeInApk = false
57+
includeInBundle = false
58+
}
59+
60+
packaging {
61+
resources {
62+
excludes += "/META-INF/{AL2.0,LGPL2.1}"
63+
excludes += "/META-INF/gradle/incremental.annotation.processors"
64+
}
65+
}
66+
}
67+
68+
dependencies {
69+
// Android Core & Lifecycle
70+
implementation("androidx.core:core-ktx:1.12.0")
71+
implementation("androidx.core:core-splashscreen:1.0.1")
72+
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
73+
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0")
74+
implementation("androidx.appcompat:appcompat:1.6.1")
75+
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
76+
77+
// Compose Core
78+
implementation("androidx.activity:activity-compose:1.8.2")
79+
implementation(platform("androidx.compose:compose-bom:2024.02.00"))
80+
implementation("androidx.compose.foundation:foundation:1.6.3")
81+
implementation("androidx.compose.runtime:runtime-livedata:1.6.3")
82+
implementation("androidx.navigation:navigation-compose:2.7.7")
83+
84+
// Compose UI
85+
implementation("androidx.compose.ui:ui")
86+
implementation("androidx.compose.ui:ui-graphics")
87+
implementation("androidx.compose.ui:ui-tooling-preview")
88+
implementation("androidx.compose.animation:animation:1.6.3")
89+
implementation("androidx.compose.animation:animation-graphics-android:1.6.3")
90+
91+
// Compose Material
92+
implementation("androidx.compose.material3:material3:1.2.1")
93+
implementation("androidx.compose.material3:material3-window-size-class:1.2.1")
94+
implementation("androidx.compose.material:material-icons-extended")
95+
implementation("androidx.wear.compose:compose-material:1.3.0")
96+
97+
// Image Loading
98+
implementation("com.github.bumptech.glide:compose:1.0.0-beta01")
99+
implementation("io.coil-kt:coil-compose:2.7.0")
100+
101+
// Accompanist
102+
implementation("com.google.accompanist:accompanist-systemuicontroller:0.34.0")
103+
104+
// Dagger Hilt
105+
implementation("com.google.dagger:hilt-android:2.50")
106+
implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
107+
ksp("com.google.dagger:hilt-compiler:2.50")
108+
109+
// Epub Parsing
110+
implementation("org.jsoup:jsoup:1.18.3")
111+
112+
// Database & Storage
113+
implementation("androidx.room:room-runtime:2.6.1")
114+
implementation("androidx.room:room-ktx:2.6.1")
115+
implementation("androidx.datastore:datastore-preferences:1.1.2")
116+
ksp("androidx.room:room-compiler:2.6.1")
117+
118+
// Paging
119+
implementation("androidx.paging:paging-runtime-ktx:3.3.5")
120+
implementation("androidx.paging:paging-compose:3.3.5")
121+
122+
// UI Components
123+
implementation("me.saket.swipe:swipe:1.3.0")
124+
125+
// Testing
126+
//testImplementation("junit:junit:4.13.2")
127+
//androidTestImplementation("androidx.test.ext:junit:1.1.5")
128+
//androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
129+
//androidTestImplementation(platform("androidx.compose:compose-bom:2024.02.00"))
130+
//androidTestImplementation("androidx.compose.ui:ui-test-junit4")
131+
//debugImplementation("androidx.compose.ui:ui-tooling")
132+
//debugImplementation("androidx.compose.ui:ui-test-manifest")
133+
}

app/proguard-rules.pro

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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.
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

0 commit comments

Comments
 (0)