Skip to content

Commit f96078d

Browse files
committed
feat: Introduce QuickLens 1.0 with comprehensive documentation, target SDK 36, and accessibility service refactor.
1 parent 8865f1c commit f96078d

5 files changed

Lines changed: 122 additions & 31 deletions

File tree

README.md

Lines changed: 117 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,136 @@
11
# QuickLens 🔍
22

3-
**QuickLens** involves a "Circle to Search" experience for any Android device. It allows you to instantly search anything on your screen using multiple search engines.
3+
**QuickLens** brings a "Circle to Search" experience to any Android device. Instantly search anything on your screen using multiple search engines — just like the flagship feature on premium devices, but available everywhere.
4+
5+
<p align="center">
6+
<img src="https://img.shields.io/badge/Version-1.0-blue?style=for-the-badge" alt="Version 1.0">
7+
<img src="https://img.shields.io/badge/Min%20SDK-29-green?style=for-the-badge" alt="Min SDK 29">
8+
<img src="https://img.shields.io/badge/Target%20SDK-36-orange?style=for-the-badge" alt="Target SDK 36">
9+
<img src="https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge" alt="MIT License">
10+
</p>
11+
12+
---
413

514
## ✨ Features
615

7-
- **Circle to Search**: Trigger via accessibility shortcut, crop any part of your screen, and search instantly.
8-
- **Multi-Engine Support**: Seamlessly switch between Google Lens, Bing, and Yandex.
9-
- **Smart History**: Keeps track of your searches with visual snapshots.
10-
- **Customizable UI**:
11-
- **Premium Aesthetics**: Beautiful "Electric Violet" gradient overlays.
12-
- **Dark Mode**: Fully supported.
13-
- **Floating Bubble**: Optional floating trigger for easier access.
14-
- **Privacy Focused**: No data collection, everything stays on your device or goes directly to the search provider.
16+
### 🎯 Trigger Methods
17+
- **Default Assistant Gesture** — Long-press the Home button or swipe diagonally from corners to instantly capture and search
18+
- **Floating Bubble** — Optional draggable trigger bubble for one-tap access (opt-in)
19+
20+
### 🔎 Search Capabilities
21+
- **Multi-Engine Support** — Seamlessly switch between Google Lens, Bing, and Yandex
22+
- **Crop & Search** — Select any region of your screenshot to search
23+
- **Visual Search** — Upload cropped images directly to reverse image search
24+
25+
### 🎨 Customization
26+
- **Theme Options** — System, Light, and Dark modes
27+
- **Desktop Mode** — Request desktop versions of search results
28+
- **Open Links Externally** — Choose to open results in your default browser
29+
- **Auto-clear History** — Configure automatic history cleanup (Never, 1/7/15/30 days)
30+
31+
### 📱 Smart History
32+
- Visual snapshots of all your searches
33+
- Searchable history with timestamps
34+
- One-tap to re-open previous searches
35+
36+
### 🔒 Privacy First
37+
- **No data collection** — Everything stays on your device
38+
- **No background processing** — App only activates on explicit user action
39+
- **Direct to provider** — Search queries go directly to the search engine
40+
41+
---
1542

1643
## 🚀 Getting Started
1744

18-
1. **Install the APK**.
19-
2. **Grant Accessibility Permission**: Required to capture the screen and draw the overlay.
20-
3. **Double Tap Status Bar** (or use the Floating Bubble) to start searching!
45+
### Prerequisites
46+
- Android 10+ (API 29)
47+
- ~2.5 MB storage space
48+
49+
### Installation
50+
51+
1. **Download** the latest APK from [Releases](../../releases)
52+
2. **Install** the APK on your device
53+
3. **Enable Accessibility Service**
54+
- Open QuickLens → Tap "Enable Accessibility"
55+
- Find QuickLens in the list and enable it
56+
4. **Set as Default Assistant**
57+
- Open QuickLens → Tap "Enable Trigger (Default Assistant)"
58+
- Select QuickLens as your digital assistant app
59+
5. **Start Searching!**
60+
- Long-press Home button or swipe diagonally from screen corners
61+
62+
---
63+
64+
## 🎮 How to Use
65+
66+
| Action | Trigger |
67+
|--------|---------|
68+
| **Capture Screen** | Long-press Home / Swipe diagonal |
69+
| **Crop Selection** | Drag on screenshot to select area |
70+
| **Switch Engine** | Tap engine buttons (Lens/Bing/Yandex) |
71+
| **View History** | Tap History icon in app |
72+
| **Close Overlay** | Tap outside the result sheet or swipe down |
73+
74+
---
2175

2276
## 🛠️ Built With
2377

24-
- **Kotlin** & **Jetpack Compose** - Modern Android UI toolkit.
25-
- **Coroutines** - Asynchronous programming.
26-
- **Room Database** - Local history storage.
78+
| Technology | Purpose |
79+
|------------|---------|
80+
| **Kotlin** | Primary language |
81+
| **Jetpack Compose** | Modern declarative UI |
82+
| **Material 3** | Design system |
83+
| **Room Database** | Local history storage |
84+
| **Coroutines** | Async operations |
85+
| **VoiceInteractionService** | Assistant trigger integration |
86+
| **AccessibilityService** | Screen capture capability |
87+
88+
89+
---
90+
91+
## 🔧 Building from Source
92+
93+
```bash
94+
# Clone the repository
95+
git clone https://github.com/quantavil/QuickLens.git
96+
cd QuickLens
97+
98+
# Build debug APK
99+
./gradlew assembleDebug
100+
101+
# Build release APK
102+
./gradlew assembleRelease
103+
```
104+
105+
The release APK will be at: `app/build/outputs/apk/release/app-release.apk`
106+
107+
---
27108

28109
## 🤝 Contributing
29110

30111
Contributions are welcome! Please feel free to submit a Pull Request.
31112

113+
1. Fork the repository
114+
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
115+
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
116+
4. Push to the branch (`git push origin feature/AmazingFeature`)
117+
5. Open a Pull Request
118+
119+
---
120+
32121
## 📄 License
33122

34123
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
124+
125+
---
126+
127+
## 🙏 Acknowledgments
128+
129+
- Inspired by Google's Circle to Search feature
130+
- Built with ❤️ using Jetpack Compose
131+
132+
---
133+
134+
<p align="center">
135+
<b>QuickLens</b> — Search anything, anywhere, instantly.
136+
</p>

app/build.gradle.kts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ android {
1616
applicationId = "com.quantavil.quicklens"
1717
minSdk = 29
1818
targetSdk = 36
19-
versionCode = 9
20-
versionName = "1.8"
19+
versionCode = 10
20+
versionName = "1.0"
2121

2222
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2323
}
@@ -68,7 +68,6 @@ dependencies {
6868
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
6969
debugImplementation(libs.androidx.compose.ui.tooling)
7070
debugImplementation(libs.androidx.compose.ui.test.manifest)
71-
debugImplementation(libs.androidx.compose.ui.test.manifest)
7271
// implementation("androidx.compose.material:material-icons-extended") // Removed to save size
7372
implementation("androidx.compose.material:material-icons-core")
7473
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")

app/src/main/java/com/quantavil/quicklens/QuickLensAccessibilityService.kt

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -226,34 +226,24 @@ class QuickLensAccessibilityService : AccessibilityService() {
226226
override fun onInterrupt() {}
227227

228228
companion object {
229-
private var instance: QuickLensAccessibilityService? = null
230229
var isOverlayActive: Boolean = false
231230
const val ACTION_TRIGGER_CAPTURE = "com.quantavil.quicklens.ACTION_TRIGGER_CAPTURE"
232-
233-
fun triggerCapture() {
234-
instance?.performCapture()
235-
}
236231

237232
fun onOverlayClosed() {
238233
isOverlayActive = false
239234
}
240235
}
241236

242-
override fun onCreate() {
243-
super.onCreate()
244-
instance = this
245-
}
237+
246238

247239
override fun onDestroy() {
248240
super.onDestroy()
249-
instance = null
250241
try {
251242
unregisterReceiver(captureReceiver)
252243
} catch (e: Exception) {
253244
// Receiver may not be registered
254245
}
255246
prefs.unregisterOnSharedPreferenceChangeListener(prefsListener)
256-
// triggerView cleanup removed
257247
hideBubble()
258248
}
259249
}

app/src/main/java/com/quantavil/quicklens/utils/UIPreferences.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class UIPreferences(context: Context) {
4848
}
4949

5050
fun isBubbleEnabled(): Boolean {
51-
return prefs.getBoolean(KEY_BUBBLE_ENABLED, true)
51+
return prefs.getBoolean(KEY_BUBBLE_ENABLED, false)
5252
}
5353

5454
fun setBubbleEnabled(isEnabled: Boolean) {

app/src/main/res/xml/accessibility_service_config.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
3-
android:accessibilityEventTypes="typeAllMask"
3+
android:accessibilityEventTypes="typeWindowStateChanged"
44
android:accessibilityFeedbackType="feedbackGeneric"
55
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews|flagRequestFilterKeyEvents"
66
android:canRetrieveWindowContent="true"

0 commit comments

Comments
 (0)