Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
37b1cd7
started the migration
MihaiCristianCondrea Feb 25, 2026
1bc7c29
Updated copyright code
MihaiCristianCondrea Feb 25, 2026
75f7640
updated manifest
MihaiCristianCondrea Feb 25, 2026
4f293ec
updated manifest
MihaiCristianCondrea Feb 25, 2026
4461d1c
Fixed the lessons
MihaiCristianCondrea Feb 25, 2026
e6da92c
feat: Refactored LessonCard and improved lesson listing UI
MihaiCristianCondrea Feb 25, 2026
5fab6d2
feat: Refactored LessonCard and improved lesson listing UI
MihaiCristianCondrea Feb 25, 2026
9159b07
feat: Improved lesson deep link mapping and refactored LessonViewModel
MihaiCristianCondrea Feb 25, 2026
5051024
Refactor lessons listing flow and navigation for migration
MihaiCristianCondrea Feb 25, 2026
adf6a27
Merge pull request #27 from MihaiCristianCondrea/codex/migrate-to-new…
MihaiCristianCondrea Feb 25, 2026
7bf5890
feat: Improved lesson deep link mapping and refactored LessonViewModel
MihaiCristianCondrea Feb 25, 2026
b23b84a
refactor: Updated namespace and FAQ product ID
MihaiCristianCondrea Feb 25, 2026
379b7fe
refactor: Updated namespace and FAQ product ID
MihaiCristianCondrea Feb 25, 2026
a78d18b
refactor: Updated namespace and FAQ product ID
MihaiCristianCondrea Feb 25, 2026
b746e55
refactor: Updated namespace and FAQ product ID
MihaiCristianCondrea Feb 25, 2026
37144a4
refactor: Updated namespace and FAQ product ID
MihaiCristianCondrea Feb 25, 2026
e4b41da
refactor: Modularize lesson listing UI and improve filtering
MihaiCristianCondrea Feb 25, 2026
5da751b
refactor: Modularize lesson listing UI and improve filtering
MihaiCristianCondrea Feb 25, 2026
480f0c5
feat: Improved key generation logic in ListingColumn
MihaiCristianCondrea Feb 25, 2026
c2ea0c3
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 25, 2026
e3bff36
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 25, 2026
de016a8
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
6325197
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
121dab6
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
d02cab2
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
701acb8
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
108a471
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
5c4559c
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
f2de0aa
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
fa996ab
feat: Added favorite and share functionality to lessons
MihaiCristianCondrea Feb 26, 2026
85c8327
Add Studio Bot conversations persistence architecture
MihaiCristianCondrea Feb 26, 2026
ddbacd3
Split DI into app, lessons, lesson details, and studio bot modules
MihaiCristianCondrea Feb 26, 2026
79fe012
Merge pull request #28 from MihaiCristianCondrea/codex/refactor-studi…
MihaiCristianCondrea Feb 26, 2026
f43294d
Refactor Studio Bot host flow with conversations persistence
MihaiCristianCondrea Feb 26, 2026
0c4a37b
Merge pull request #29 from MihaiCristianCondrea/codex/refactor-studi…
MihaiCristianCondrea Feb 26, 2026
45eba67
refactor: Restructure Studiobot navigation and refine implementation …
MihaiCristianCondrea Feb 27, 2026
acb5a6e
refactor: Restructure Studiobot navigation and refine implementation …
MihaiCristianCondrea Feb 27, 2026
cb8a2a3
feat: Added code content support to lesson details
MihaiCristianCondrea Feb 27, 2026
bcdb7dd
feat: Added code content support to lesson details
MihaiCristianCondrea Feb 27, 2026
3a82df7
feat: Added code content support to lesson details
MihaiCristianCondrea Feb 27, 2026
be99fb2
feat: Added code content support to lesson details
MihaiCristianCondrea Feb 27, 2026
3ea53b8
Avoid persisting empty Studio Bot conversations
MihaiCristianCondrea Feb 27, 2026
cfd66b0
Merge pull request #30 from MihaiCristianCondrea/codex/prevent-saving…
MihaiCristianCondrea Feb 27, 2026
535bb06
Refine Studio Bot conversations flow and hide bottom bar on scroll
MihaiCristianCondrea Feb 27, 2026
22dd91d
Merge pull request #31 from MihaiCristianCondrea/codex/refactor-studi…
MihaiCristianCondrea Feb 27, 2026
fa31afe
Update lesson share message text
MihaiCristianCondrea Feb 27, 2026
a9e28d9
Merge pull request #32 from MihaiCristianCondrea/codex/update-share-t…
MihaiCristianCondrea Feb 27, 2026
9b71078
Fix duplicate pagination requests on append
MihaiCristianCondrea Mar 3, 2026
65a7564
Merge pull request #33 from MihaiCristianCondrea/codex/fix-pagination…
MihaiCristianCondrea Mar 3, 2026
635204f
Improve Studio Bot conversations list UX and accessibility
MihaiCristianCondrea Mar 3, 2026
cb91996
Merge pull request #34 from MihaiCristianCondrea/codex/add-back-to-co…
MihaiCristianCondrea Mar 3, 2026
27bdeec
Add swipe-to-delete for Studio Bot chat messages
MihaiCristianCondrea Mar 6, 2026
92fdddd
Merge pull request #35 from MihaiCristianCondrea/codex/implement-swip…
MihaiCristianCondrea Mar 6, 2026
b4ab075
Add Gmail-like swipe-to-delete for Studio Bot conversations
MihaiCristianCondrea Mar 7, 2026
17c8b64
Merge pull request #36 from MihaiCristianCondrea/codex/implement-swip…
MihaiCristianCondrea Mar 7, 2026
e7211ab
feat: Added code content support to lesson details
MihaiCristianCondrea Mar 7, 2026
ff1958e
Make Google Services and Firebase plugins conditional on configuratio…
MihaiCristianCondrea Mar 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 5 additions & 11 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ out/
# Release artifacts (uncomment or adjust as needed)
app/release/*
release/
signing.properties
github.properties
app/google-services.json
/app/src/main/play/keys/*

###############################################################################
# LOCAL CONFIG / ENV FILES
Expand Down Expand Up @@ -97,14 +101,4 @@ lint/tmp/
###############################################################################
# KOTLIN
###############################################################################
.kotlin

###############################################################################
# API KEYS
###############################################################################
/apikeys.properties

###############################################################################
# OTHER DEV FILES
###############################################################################
/local/api_lesson.json
.kotlin
3 changes: 3 additions & 0 deletions .idea/deploymentTargetSelector.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 0 additions & 2 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

194 changes: 130 additions & 64 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,81 +1,146 @@
import org.jetbrains.kotlin.konan.properties.Properties
/*
* Copyright (©) 2026 Mihai-Cristian Condrea
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension
import java.util.Properties
import kotlin.toString

plugins {
alias(notation = libs.plugins.androidApplication)
alias(notation = libs.plugins.jetbrainsKotlinAndroid)
alias(notation = libs.plugins.jetbrainsKotlinParcelize)
alias(notation = libs.plugins.android.application)
alias(notation = libs.plugins.kotlin.compose)
alias(notation = libs.plugins.kotlin.serialization)
alias(notation = libs.plugins.googlePlayServices)
alias(notation = libs.plugins.googleFirebase)
alias(notation = libs.plugins.compose.compiler)
alias(notation = libs.plugins.devToolsKsp)
alias(notation = libs.plugins.kotlin.parcelize)
alias(notation = libs.plugins.google.devtools.ksp)
alias(notation = libs.plugins.google.mobile.services) apply false
alias(notation = libs.plugins.firebase.crashlytics) apply false
alias(notation = libs.plugins.firebase.performance) apply false
alias(notation = libs.plugins.about.libraries)
alias(notation = libs.plugins.mannodermaus.android.junit5)
}

val hasGoogleServicesConfig: Boolean = listOf(
"google-services.json",
"src/debug/google-services.json",
"src/release/google-services.json",
).any { path -> file(path).exists() }

if (hasGoogleServicesConfig) {
apply(plugin = libs.plugins.google.mobile.services.get().pluginId)
apply(plugin = libs.plugins.firebase.crashlytics.get().pluginId)
apply(plugin = libs.plugins.firebase.performance.get().pluginId)
}

android {
compileSdk = 35
namespace = "com.d4rk.androidtutorials"
compileSdk {
version = release(36) {
minorApiLevel = 1
}
}

defaultConfig {
applicationId = "com.d4rk.androidtutorials"
minSdk = 23
targetSdk = 35
versionCode = 118
versionName = "1.2.3"
minSdk = 26
targetSdk = 36
versionCode = 122
versionName = "2.0.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
@Suppress("UnstableApiUsage")
androidResources.localeFilters += listOf(
"en" ,
"bg-rBG" ,
"de-rDE" ,
"es-rGQ" ,
"fr-rFR" ,
"hi-rIN" ,
"hu-rHU" ,
"in-rID" ,
"it-rIT" ,
"ja-rJP" ,
"pl-rPL" ,
"pt-rBR" ,
"ro-rRO" ,
"ru-rRU" ,
"sv-rSE" ,
"th-rTH" ,
"tr-rTR" ,
"uk-rUA" ,
"zh-rTW" ,
"ar-rEG",
"bg-rBG",
"bn-rBD",
"de-rDE",
"en",
"es-rGQ",
"es-rMX",
"fil-rPH",
"fr-rFR",
"hi-rIN",
"hu-rHU",
"in-rID",
"it-rIT",
"ja-rJP",
"ko-rKR",
"pl-rPL",
"pt-rBR",
"ro-rRO",
"ru-rRU",
"sv-rSE",
"th-rTH",
"tr-rTR",
"uk-rUA",
"ur-rPK",
"vi-rVN",
"zh-rTW"
)

vectorDrawables {
useSupportLibrary = true
}
multiDexEnabled = true

val githubProps = Properties()
val githubFile = rootProject.file("github.properties")
val githubToken = if (githubFile.exists()) {
githubProps.load(githubFile.inputStream())
githubProps["GITHUB_TOKEN"].toString()
} else {
""
}
buildConfigField("String", "GITHUB_TOKEN", "\"$githubToken\"")
buildConfigField("String", "FAQ_PRODUCT_ID", "\"com.d4rk.androidtutorials\"")
}

buildTypes {
release {
isDebuggable = false
}
signingConfigs {
create("release")

debug {
isDebuggable = true
val signingProps = Properties()
val signingFile = rootProject.file("signing.properties")

if (signingFile.exists()) {
signingProps.load(signingFile.inputStream())

signingConfigs.getByName("release").apply {
storeFile = file(signingProps["STORE_FILE"].toString())
storePassword = signingProps["STORE_PASSWORD"].toString()
keyAlias = signingProps["KEY_ALIAS"].toString()
keyPassword = signingProps["KEY_PASSWORD"].toString()
}
} else {
android.buildTypes.getByName("release").signingConfig = null
}
}

buildTypes.forEach { buildType ->
val keystoreFile : File = project.rootProject.file("apikeys.properties")
val properties : Properties = Properties()
properties.load(keystoreFile.inputStream())
val apiKey : String = properties.getProperty("API_KEY") ?: ""

with(buildType) {
multiDexEnabled = true
isMinifyEnabled = false
isShrinkResources = false
buildConfigField(type = "String" , name = "API_KEY" , value = apiKey)
proguardFiles(
getDefaultProguardFile(name = "proguard-android-optimize.txt") ,
"proguard-rules.pro"
)
buildTypes {
release {
val signingFile = rootProject.file("signing.properties")
signingConfig = if (signingFile.exists()) {
signingConfigs.getByName("release")
} else {
null
}
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile(name = "proguard-android-optimize.txt"), "proguard-rules.pro")
if (hasGoogleServicesConfig) {
configure<CrashlyticsExtension> {
mappingFileUploadEnabled = true
}
}
}
}

Expand All @@ -84,10 +149,6 @@ android {
targetCompatibility = JavaVersion.VERSION_21
}

kotlinOptions {
jvmTarget = "21"
}

buildFeatures {
buildConfig = true
compose = true
Expand All @@ -109,21 +170,26 @@ android {
dependencies {

// App Core
implementation(dependencyNotation = "com.github.D4rK7355608:AppToolkit:0.0.55") {
implementation(dependencyNotation = "com.github.MihaiCristianCondrea:App-Toolkit-for-Android:2.0.8") {
isTransitive = true
}

// Code view
implementation(dependencyNotation = libs.compose.code.editor)

// Coil
implementation(dependencyNotation = libs.coil.svg)

// Google
implementation(dependencyNotation = libs.generativeai)
// Firebase AI Logic
implementation(dependencyNotation = libs.firebase.ai)

// KSP
ksp(dependencyNotation = libs.androidx.room.compiler)
implementation(dependencyNotation = libs.androidx.room.ktx)
implementation(dependencyNotation = libs.androidx.room.runtime)

// Unit Tests
testImplementation(dependencyNotation = libs.bundles.unitTest)
testRuntimeOnly(dependencyNotation = libs.bundles.unitTestRuntime)

// Instrumentation Tests
androidTestImplementation(dependencyNotation = libs.bundles.instrumentationTest)
debugImplementation(dependencyNotation = libs.androidx.compose.ui.test.manifest)
}
Loading
Loading