Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
3cca835
claude code redesign
Chethan616 Aug 16, 2026
b8d39fd
feat: annotation editing/placement overhaul + move-resize for shapes
Chethan616 Aug 17, 2026
2d9269d
fix: undo first-attempt no-op in continuous viewer (BUG A)
Chethan616 Aug 17, 2026
8f512f6
refactor: redesign Settings around reusable primitives (Item 3)
Chethan616 Aug 17, 2026
76f4e7c
chore: clean up repo structure
Chethan616 Aug 17, 2026
0c017a3
feat: extract glass design-system primitives (Item 4)
Chethan616 Aug 17, 2026
13774d0
feat: add PDF watermark tool (Item 5, first feature-gap closed)
Chethan616 Aug 17, 2026
712e4a3
feat: rebuild Settings in Apple-HIG style + wallpaper toggle
Chethan616 Aug 17, 2026
9eccbdf
feat: add Extract Pages tool (Item 5, second gap)
Chethan616 Aug 17, 2026
aae8bf5
feat: add Page Numbers tool (Item 5, third tool)
Chethan616 Aug 17, 2026
675f61b
feat: add Flatten PDF tool (Item 5)
Chethan616 Aug 17, 2026
c5537ac
feat: add Image Tools suite (compress/resize/convert/strip-EXIF)
Chethan616 Aug 17, 2026
7b3aeb7
feat: add HTML to PDF tool (offline, local HTML)
Chethan616 Aug 17, 2026
2ed10ba
feat: add Fill Form tool (closes all Pdf_Tools gaps)
Chethan616 Aug 17, 2026
c824498
feat: URL to PDF + calmer, tighter search highlight
Chethan616 Aug 17, 2026
68cf485
feat: image watermark mode (text or image)
Chethan616 Aug 17, 2026
501ffa8
feat: redesign Settings on real Liquid Glass; remove Notifications
Chethan616 Aug 17, 2026
e13c0ed
fix: tighter search highlight; offline release; restore main Settings
Chethan616 Aug 17, 2026
46cf319
fix: highlight fit, glass Appearance/Language, working language switch
Chethan616 Aug 17, 2026
812b0ea
feat: star-card fix, localized Settings, grey no-bg, share morph
Chethan616 Aug 17, 2026
7d282fa
feat: bigger highlight, blue share, WhatsApp recents menu, glassy but…
Chethan616 Aug 17, 2026
d2c2dd7
feat: dialog-style settings buttons, sticky editor tools, swipe-to-sh…
Chethan616 Aug 17, 2026
3684abd
fix: recents pill above row, share icon order, decoupled editor-tools…
Chethan616 Aug 17, 2026
ea10494
fix: liquid recents press (no grey), softer info-dialog scrim
Chethan616 Aug 17, 2026
4e22e28
feat: fixed-footprint share morph, custom wallpaper, smoother viewer …
Chethan616 Aug 17, 2026
b708f10
feat: liquid editor-tools reveal, upward-only springy share morph
Chethan616 Aug 17, 2026
70d0507
feat: pinned glass chrome app-wide, 36dp search pill, recents overhaul
Chethan616 Aug 20, 2026
f84e37a
feat: bounce the search bar open, one glass recipe across the viewers
Chethan616 Aug 20, 2026
248ab19
feat: fluid document-lift nav transitions, theme-aware sign screen, s…
Chethan616 Aug 21, 2026
9c929c5
feat: smooth loading curtain when opening a doc from recents
Chethan616 Aug 21, 2026
3a862da
feat: springy recents delete + shield-check pin badge
Chethan616 Aug 21, 2026
67f1b9a
feat: v1.2.0 — text selection, decrypt animation, onboarding polish, …
Chethan616 Aug 21, 2026
c5d7201
feat: make PDF text selection precise and zoomable
Chethan616 Aug 21, 2026
5be7b16
chore: add PDF viewer demo assets
Chethan616 Aug 21, 2026
3917d0f
fix: keep pinch zoom from selecting PDF text
Chethan616 Aug 21, 2026
6053197
feat: add custom PDF selection handles
Chethan616 Aug 21, 2026
cb204a7
fix: polish PDF markup selection and glass toolbars
Chethan616 Aug 21, 2026
625da26
fix: let PDF toolbar controls overflow glass surfaces
Chethan616 Aug 21, 2026
2eb46cb
fix: keep PDF tool controls above carousel surfaces
Chethan616 Aug 21, 2026
97b8b9e
fix: keep PDF toolbar chips above carousel clipping
Chethan616 Aug 21, 2026
0932ba5
Revert "fix: keep PDF toolbar chips above carousel clipping"
Chethan616 Aug 21, 2026
fa27031
Merge remote-tracking branch 'origin/main' into claude
Chethan616 Aug 21, 2026
dd88782
docs: add demo media to README
Chethan616 Aug 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,6 @@ app/src/main/assets/adi-registration.properties

# Local graphify knowledge graph
/graphify-out/

# Local scratch / reference clones
scratch/
265 changes: 0 additions & 265 deletions SCAN_IMPLEMENTATION_PLAN.md

This file was deleted.

6 changes: 6 additions & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@ ClearPDF uses open-source components and keeps their notices with the project. R
- License: Apache License 2.0 (as attributed in the Settings screen)
- Use: the app's translucent glass surfaces, backdrop effects, and shared UI components.

## Feature-set inspiration — Pdf_Tools

- Project: `Karna14314/Pdf_Tools` (https://github.com/Karna14314/Pdf_Tools)
- License: Apache License 2.0
- Use: informed ClearPDF's on-device tool set (e.g. PDF-to-Images export). ClearPDF's implementations are original code written against the app's own architecture and `backdrop` UI; no source was copied. This acknowledgement is provided in good faith for the shared feature direction.

The app does not add GPL or LGPL components for document rendering. If a future dependency changes that, its license and redistribution obligations must be reviewed before release.
8 changes: 5 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ android {
applicationId = "com.chethan616.clearpdf"
minSdk = 23
targetSdk = 36
versionCode = 2
versionName = "1.1.0"
versionCode = 3
versionName = "1.2.0"
// Keep every locale declared by the app. Filtering this to English
// removes values-pt-rBR from the packaged APK, so the language picker
// can appear to work while the app continues to resolve English.
Expand Down Expand Up @@ -133,9 +133,11 @@ dependencies {
implementation("org.apache.poi:poi:3.17")
implementation("org.apache.poi:poi-scratchpad:3.17")

// PdfBox-Android — needed by PdfViewerViewModel for native PDF overlay export
implementation(libs.pdfbox.android)

// ML Kit Document Scanner & Camera
implementation(libs.play.services.mlkit.scanner)
implementation(libs.play.services.mlkit.text.recognition)
implementation(libs.camerax.core)
implementation(libs.camerax.camera2)
implementation(libs.camerax.lifecycle)
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

<!-- Camera permission for document scanning -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Network access was used ONLY by the Web-to-PDF tool. That tool is disabled for this
privacy-focused (fully offline) release, so no network permissions are declared.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> -->
<!-- Legacy read access for older providers on Android 12L and below. -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- Legacy write access for pre-scoped-storage devices only. -->
Expand All @@ -25,7 +29,7 @@
android:name=".MainActivity"
android:exported="true"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustNothing"
android:windowSoftInputMode="adjustResize"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
22 changes: 20 additions & 2 deletions app/src/main/java/com/chethan616/clearpdf/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)

// A locale change restarts this Activity. DocsApp animates both halves of that restart, so
// the system's own cross-fade would just stack on top of ours.
com.chethan616.clearpdf.ui.utils.LocaleHelper.suppressActivityTransition(this)

// Request the highest available refresh rate (90Hz/120Hz)
requestHighRefreshRate()

Expand Down Expand Up @@ -60,14 +64,28 @@ class MainActivity : ComponentActivity() {
else -> null
}?.takeIf { uri -> isSupportedDocumentIntent(intent?.type, uri.toString()) }

// If a PDF was shared/opened, navigate to viewer with that URI
val effectiveRoute = if (incomingPdfUri != null) "pdf_viewer" else shortcutRoute
// Route an incoming document by its kind: spreadsheets → interactive grid, images → image
// editor, everything else → the PDF viewer.
val effectiveRoute = if (incomingPdfUri != null) {
when (com.chethan616.clearpdf.utils.docKindOf(queryDisplayName(incomingPdfUri))) {
com.chethan616.clearpdf.utils.DocKind.Excel -> "spreadsheet"
com.chethan616.clearpdf.utils.DocKind.Image -> "image_editor"
else -> "pdf_viewer"
}
} else shortcutRoute

setContent {
DocsApp(shortcutRoute = effectiveRoute, incomingPdfUri = incomingPdfUri)
}
}

private fun queryDisplayName(uri: Uri): String? = runCatching {
contentResolver.query(uri, null, null, null, null)?.use { c ->
val i = c.getColumnIndex(android.provider.OpenableColumns.DISPLAY_NAME)
if (i != -1 && c.moveToFirst()) c.getString(i) else null
}
}.getOrNull() ?: uri.lastPathSegment

private fun isSupportedDocumentIntent(mimeType: String?, uriString: String): Boolean {
val lower = uriString.lowercase()
val supportedExtension = listOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import com.kyant.pdfcore.splitter.PdfSplitter
import com.kyant.pdfcore.splitter.PdfSplitterImpl
import com.kyant.pdfcore.viewer.PdfViewer
import com.kyant.pdfcore.viewer.PdfViewerImpl
import com.kyant.pdfcore.text.PdfTextService
import com.kyant.pdfcore.text.PdfTextServiceImpl

object PdfServiceLocator {
val pdfViewer: PdfViewer by lazy { PdfViewerImpl() }
Expand All @@ -23,4 +25,5 @@ object PdfServiceLocator {
val pdfSplitter: PdfSplitter by lazy { PdfSplitterImpl() }
val pdfEditor: PdfEditor by lazy { PdfEditorImpl() }
val pdfConverter: PdfConverter by lazy { PdfConverterImpl() }
val pdfTextService: PdfTextService by lazy { PdfTextServiceImpl() }
}
Loading
Loading