Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# 📱 Rock QR Code Ecosystem
# 📱 Chamo QR Code Ecosystem

A high-fidelity, dual-platform QR Code suite delivering a premium user experience across both an **offline-first Android client** (Jetpack Compose) and a **luxury companion web app** (GitHub Pages / PWA).

[![Rock QR Code CI](https://github.com/SayanthRock/Rock-QR-Code/actions/workflows/build.yml/badge.svg)](https://github.com/SayanthRock/Rock-QR-Code/actions/workflows/build.yml)
[![Chamo QR Code CI](https://github.com/SayanthRock/Chamo-QR/actions/workflows/build.yml/badge.svg)](https://github.com/SayanthRock/Chamo-QR/actions/workflows/build.yml)

---

## 🌐 Live Companion Web App

Experience the premium web suite instantly:
👉 **[Try the Rock QR Web Console](https://sayanthrock.github.io/Rock-QR-Code/)**
👉 **[Try the Chamo QR Web Console](https://sayanthrock.github.io/Chamo-QR/)**

*Fully installable Progressive Web App (PWA) with complete offline support, real-time dynamic web links, custom metadata tags, and integrated camera scanner lens.*

Expand Down
8 changes: 4 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ android {
compileSdk { version = release(36) { minorApiLevel = 1 } }

defaultConfig {
applicationId = "com.aistudio.rockqr.qzlypm"
applicationId = "com.aistudio.chamoqr.qzlypm"
Comment thread
SayanthRock marked this conversation as resolved.
minSdk = 24
targetSdk = 36
versionCode = 1
Expand Down Expand Up @@ -146,11 +146,11 @@ abstract class CopyApkTask : DefaultTask() {
val src = sourceApk.get().asFile
val destDir = targetDir.get().asFile
if (src.exists()) {
src.copyTo(File(destDir, "Rock QR.apk"), overwrite = true)
src.copyTo(File(destDir, "Rock_QR.apk"), overwrite = true)
src.copyTo(File(destDir, "Chamo QR.apk"), overwrite = true)
src.copyTo(File(destDir, "Chamo_QR.apk"), overwrite = true)
println("✅ Copied APK to root directory as both 'Rock QR.apk' and 'Chamo QR.apk'")
src.copyTo(File(destDir, "Chamo QR.apk"), overwrite = true)
src.copyTo(File(destDir, "Chamo_QR.apk"), overwrite = true)
println("✅ Copied APK to root directory as both 'Chamo QR.apk' and 'Chamo QR.apk'")
Comment thread
SayanthRock marked this conversation as resolved.
Comment thread
SayanthRock marked this conversation as resolved.
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="sayanthrock.github.io" />
<data android:pathPrefix="/Rock-QR-Code/" />
<data android:pathPrefix="/Chamo-QR/" />
Comment thread
SayanthRock marked this conversation as resolved.
</intent-filter>
</activity>

Expand Down
14 changes: 7 additions & 7 deletions app/src/main/java/com/example/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class MainActivity : ComponentActivity() {

private fun handleIntent(intent: android.content.Intent?, viewModel: QRViewModel) {
intent?.dataString?.let { dataStr ->
if (dataStr.contains("sayanthrock.github.io/Rock-QR-Code")) {
if (dataStr.contains("sayanthrock.github.io/Chamo-QR")) {
viewModel.importFromDeepLink(dataStr)
intent.data = null
}
Comment thread
SayanthRock marked this conversation as resolved.
Expand Down Expand Up @@ -231,7 +231,7 @@ fun LocalSettingsScreen(
Spacer(modifier = Modifier.height(12.dp))

Text(
text = "ROCK QR CODE",
text = "Chamo QR",
fontSize = 20.sp,
fontWeight = FontWeight.ExtraBold,
color = Color.White
Expand Down Expand Up @@ -381,7 +381,7 @@ fun LocalSettingsScreen(
title = "Check for updates",
onClick = {
HapticUtils.vibrate(context, 20)
viewModel.showToast("Rock QR is up to date (v1.0.8)", CustomToastType.SUCCESS)
viewModel.showToast("Chamo QR is up to date (v1.0.8)", CustomToastType.SUCCESS)
}
)
}
Expand All @@ -398,10 +398,10 @@ fun LocalSettingsScreen(
HapticUtils.vibrate(context, 20)
val shareIntent = android.content.Intent(android.content.Intent.ACTION_SEND).apply {
type = "text/plain"
putExtra(android.content.Intent.EXTRA_SUBJECT, "ROCK QR CODE")
putExtra(android.content.Intent.EXTRA_TEXT, "Check out ROCK QR CODE app: https://sayanthrock.github.io/Rock-QR-Code")
putExtra(android.content.Intent.EXTRA_SUBJECT, "Chamo QR")
putExtra(android.content.Intent.EXTRA_TEXT, "Check out Chamo QR app: https://sayanthrock.github.io/Chamo-QR")
}
context.startActivity(android.content.Intent.createChooser(shareIntent, "Share ROCK QR CODE"))
context.startActivity(android.content.Intent.createChooser(shareIntent, "Share Chamo QR"))
}
)
HorizontalDivider(color = Color(0xFF27272A))
Expand All @@ -410,7 +410,7 @@ fun LocalSettingsScreen(
title = "Star the project",
onClick = {
HapticUtils.vibrate(context, 20)
val browserIntent = android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse("https://github.com/sayanthrock/Rock-QR-Code"))
val browserIntent = android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse("https://github.com/sayanthrock/Chamo-QR"))
context.startActivity(browserIntent)
}
)
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/example/data/api/QrBackendService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ data class CreateCodeRequest(

data class CreateCodeResponse(
val code: String, // Hashed or shortened path code (e.g. "x7p3a")
val shortUrl: String, // Fully qualified dynamic redirection URL (e.g. "https://sayanthrock.github.io/Rock-QR-Code/redirect?code=x7p3a")
val shortUrl: String, // Fully qualified dynamic redirection URL (e.g. "https://sayanthrock.github.io/Chamo-QR/redirect?code=x7p3a")
val success: Boolean
)

Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/example/ui/screens/GenerateScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ fun GenerateScreen(
) {
Column {
Text(
text = "ROCK QR CODE",
text = "Chamo QR",
fontSize = 24.sp,
fontWeight = FontWeight.ExtraBold,
color = Color.White,
Expand Down Expand Up @@ -262,7 +262,7 @@ fun GenerateScreen(
val rawContent = viewModel.inputText.value.ifEmpty { viewModel.wifiSsid.value }
val title = viewModel.inputTitle.value.ifEmpty { "Shared Code" }
val type = viewModel.inputType.value
val webLink = "https://sayanthrock.github.io/Rock-QR-Code/share?content=${android.net.Uri.encode(rawContent)}&type=$type&title=${android.net.Uri.encode(title)}"
val webLink = "https://sayanthrock.github.io/Chamo-QR/share?content=${android.net.Uri.encode(rawContent)}&type=$type&title=${android.net.Uri.encode(title)}"
Comment thread
SayanthRock marked this conversation as resolved.
Comment thread
SayanthRock marked this conversation as resolved.

val intent = android.content.Intent(android.content.Intent.ACTION_SEND).apply {
this.type = "text/plain"
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/example/ui/screens/ScanScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ fun ScanScreen(
) {
Column {
Text(
text = "ROCK QR CODE",
text = "Chamo QR",
fontSize = 24.sp,
fontWeight = FontWeight.ExtraBold,
color = Color.White,
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/example/ui/theme/Color.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.example.ui.theme

import androidx.compose.ui.graphics.Color

// 🪨 THE ROCK QR CODE COLOR SECTOR: Mineral and Gemstone Inspired Palette
// 🪨 THE Chamo QR COLOR SECTOR: Mineral and Gemstone Inspired Palette
// Malachite Crystalline Gem (Primary scanning/secure color)
val MalachitePrimary = Color(0xFF00BD9D) // Luminescent mineral gemstone green-teal
val MalachitePrimaryVariant = Color(0xFF00D1B2)
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/example/viewmodel/QRViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ class QRViewModel(application: Application) : AndroidViewModel(application) {
} catch (e: Exception) {
// Offline local fallback so the user always has a functional result!
generatedShortCode = "local_" + System.currentTimeMillis().toString().takeLast(6)
finalPayload = "https://sayanthrock.github.io/Rock-QR-Code/redirect?code=$generatedShortCode"
finalPayload = "https://sayanthrock.github.io/Chamo-QR/redirect?code=$generatedShortCode"
Comment thread
SayanthRock marked this conversation as resolved.
showToast("Redirection core forged as local offline fallback", CustomToastType.INFO)
}
}
Expand Down Expand Up @@ -403,7 +403,7 @@ class QRViewModel(application: Application) : AndroidViewModel(application) {
} else {
// If there's no content parameter, check if we can interpret the whole path or general string
val decodedQuery = uri.lastPathSegment
if (!decodedQuery.isNullOrBlank() && decodedQuery != "Rock-QR-Code") {
if (!decodedQuery.isNullOrBlank() && decodedQuery != "Chamo-QR") {
inputText.value = decodedQuery
inputType.value = detectQrType(decodedQuery)
inputTitle.value = "Web Import"
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<resources>
<string name="app_name">ROCK QR CODE</string>
<string name="app_name">Chamo QR</string>
<string name="tab_scan">Scan</string>
<string name="tab_generate">Generate</string>
<string name="tab_history">History</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/test/java/com/example/ExampleRobolectricTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ class ExampleRobolectricTest {
fun `read string from context`() {
val context = ApplicationProvider.getApplicationContext<Context>()
val appName = context.getString(R.string.app_name)
assertEquals("ROCK QR CODE", appName)
assertEquals("Chamo QR", appName)
}
}
18 changes: 9 additions & 9 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rock QR Code - Luxury Web Suite</title>
<title>Chamo QR Code - Luxury Web Suite</title>
<meta name="description" content="A premium, glassmorphic client-side PWA web app to generate, design, customize, and scan QR codes with dynamic customization and Android companion sync.">

<!-- Manifest & Favicons -->
Expand Down Expand Up @@ -110,7 +110,7 @@
<i data-lucide="qr-code" class="w-5.5 h-5.5 text-white"></i>
</div>
<div>
<span class="font-display font-bold text-lg tracking-wide bg-gradient-to-r from-white via-gray-200 to-purple-400 bg-clip-text text-transparent">ROCK QR CODE</span>
<span class="font-display font-bold text-lg tracking-wide bg-gradient-to-r from-white via-gray-200 to-purple-400 bg-clip-text text-transparent">Chamo QR</span>
<span class="block text-[10px] uppercase font-bold tracking-widest text-purple-400">Companion Web Suite</span>
</div>
</div>
Expand Down Expand Up @@ -148,7 +148,7 @@ <h1 class="font-display text-2xl md:text-3xl font-extrabold text-white mb-2 trac
Luxurious Companion QR Hub
</h1>
<p class="text-sm text-gray-400 leading-relaxed max-w-xl">
Instantly build custom high-fidelity QR codes with our dynamic liquid glass engine. Cross-share content between this web console and your <span class="text-purple-400 font-semibold">Rock QR Code Android application</span>.
Instantly build custom high-fidelity QR codes with our dynamic liquid glass engine. Cross-share content between this web console and your <span class="text-purple-400 font-semibold">Chamo QR Code Android application</span>.
</p>
</div>
<div class="flex-shrink-0 z-10">
Expand Down Expand Up @@ -390,7 +390,7 @@ <h3 class="font-display font-bold text-sm text-white flex items-center gap-2">
When copying the <strong class="text-purple-300">Share Link</strong>, you receive an automated redirection URL. Any person who opens that URL will automatically import your forged QR code structure. Sharing links can also trigger the native scanner in your partner Android App!
</p>
<div class="p-2.5 rounded-xl bg-luxury-black/30 border border-white/5 flex items-center justify-between text-xs text-gray-500 gap-4">
<span class="truncate text-mono text-[10px]" id="current-web-link-preview">https://sayanthrock.github.io/Rock-QR-Code/share?content=...</span>
<span class="truncate text-mono text-[10px]" id="current-web-link-preview">https://sayanthrock.github.io/Chamo-QR/share?content=...</span>
<button id="btn-copy-raw-link" class="p-1.5 rounded bg-white/5 hover:bg-white/10 text-white transition-all">
<i data-lucide="copy" class="w-3.5 h-3.5"></i>
</button>
Expand Down Expand Up @@ -553,7 +553,7 @@ <h2 class="font-display font-extrabold text-xl md:text-2xl text-white tracking-w

<!-- Live Release Download Trigger -->
<div class="flex flex-col sm:flex-row items-center gap-4 z-10">
<a id="btn-download-apk-release" href="https://github.com/sayanthrock/Rock-QR-Code/releases" target="_blank" class="px-6 py-3.5 rounded-xl bg-gradient-to-r from-purple-600 to-indigo-600 hover:from-purple-500 hover:to-indigo-500 text-white font-bold text-sm transition-all duration-300 shadow-xl shadow-purple-900/30 border border-white/10 flex items-center gap-2">
<a id="btn-download-apk-release" href="https://github.com/sayanthrock/Chamo-QR/releases" target="_blank" class="px-6 py-3.5 rounded-xl bg-gradient-to-r from-purple-600 to-indigo-600 hover:from-purple-500 hover:to-indigo-500 text-white font-bold text-sm transition-all duration-300 shadow-xl shadow-purple-900/30 border border-white/10 flex items-center gap-2">
<i data-lucide="github" class="w-4 h-4"></i>
<span>View GitHub Releases</span>
</a>
Expand All @@ -570,11 +570,11 @@ <h2 class="font-display font-extrabold text-xl md:text-2xl text-white tracking-w
<footer class="border-t border-white/5 bg-luxury-black/50 py-8 relative">
<div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 flex flex-col md:flex-row items-center justify-between gap-4 text-center md:text-left text-xs text-gray-500">
<div class="space-y-1">
<p class="font-bold text-gray-400">Rock QR Code Ecosystem</p>
<p class="font-bold text-gray-400">Chamo QR Code Ecosystem</p>
<p>© 2026 Companion Web Console. Realized on-demand.</p>
</div>
<div class="flex items-center justify-center gap-6">
<a href="https://github.com/sayanthrock/Rock-QR-Code" target="_blank" class="hover:text-white transition-colors duration-200 flex items-center gap-1.5">
<a href="https://github.com/sayanthrock/Chamo-QR" target="_blank" class="hover:text-white transition-colors duration-200 flex items-center gap-1.5">
<i data-lucide="github" class="w-3.5 h-3.5"></i>
<span>Ecosystem Repository</span>
</a>
Expand Down Expand Up @@ -668,8 +668,8 @@ <h2 class="font-display font-extrabold text-xl md:text-2xl text-white tracking-w
const content = computePayload();

// Match the exact Android companion shared link format:
// https://sayanthrock.github.io/Rock-QR-Code/share?content=CONTENT&type=TYPE&title=TITLE
const baseShareUrl = "https://sayanthrock.github.io/Rock-QR-Code/share";
// https://sayanthrock.github.io/Chamo-QR/share?content=CONTENT&type=TYPE&title=TITLE
const baseShareUrl = "https://sayanthrock.github.io/Chamo-QR/share";
const finalUrl = `${baseShareUrl}?content=${encodeURIComponent(content)}&type=${selectedType}&title=${encodeURIComponent(title)}`;
return finalUrl;
}
Expand Down
Loading