Skip to content

Commit 5fd137d

Browse files
committed
Initial commit
0 parents  commit 5fd137d

File tree

232 files changed

+18466
-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.

232 files changed

+18466
-0
lines changed

.github/workflows/android-ci.yml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: Android CI
2+
3+
on:
4+
push:
5+
branches: [ "main", "master" ]
6+
pull_request:
7+
branches: [ "main", "master" ]
8+
9+
jobs:
10+
build-and-test:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- name: Checkout
14+
uses: actions/checkout@v4
15+
16+
- name: Setup JDK 17
17+
uses: actions/setup-java@v4
18+
with:
19+
distribution: 'temurin'
20+
java-version: '17'
21+
22+
- name: Cache Gradle
23+
uses: actions/cache@v4
24+
with:
25+
path: |
26+
~/.gradle/caches
27+
~/.gradle/wrapper
28+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
29+
restore-keys: |
30+
${{ runner.os }}-gradle-
31+
32+
- name: Echo Kotlin/Compose Compiler versions
33+
run: |
34+
echo "Kotlin version:" $(grep -Po '(?<=kotlin = ")[^\"]+' gradle/libs.versions.toml)
35+
echo "Compose Compiler version:" $(grep -Po '(?<=composeCompiler = ")[^\"]+' gradle/libs.versions.toml)
36+
37+
- name: Gradle build, unit tests, detekt
38+
run: |
39+
./gradlew --version
40+
./gradlew clean build test detekt --stacktrace
41+
42+
- name: Upload build artifacts (APK)
43+
if: success()
44+
uses: actions/upload-artifact@v4
45+
with:
46+
name: app-apks
47+
path: app/build/outputs/**/*.apk

.gitignore

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
*.iml
2+
.gradle/
3+
/.gradle-local/
4+
local.properties
5+
/local.properties
6+
.DS_Store
7+
Thumbs.db
8+
9+
# Ignore Android Studio project files entirely
10+
.idea/
11+
.vscode/
12+
13+
# Ignore build outputs in all modules
14+
/**/build/
15+
16+
# Native/External build outputs
17+
.externalNativeBuild
18+
.cxx
19+
20+
# Android Studio capture folder
21+
/captures
22+
23+
# Kotlin local session/cache
24+
.kotlin/
25+
26+
# Retain google-services.json (do not ignore)
27+
# app/google-services.json
28+
29+
# Android artifacts
30+
*.apk
31+
*.aab
32+
*.keystore
33+
*.jks
34+
*.class
35+
36+
# Node/JS
37+
node_modules/
38+
.npmrc
39+
.yarn/
40+
41+
# Python
42+
__pycache__/
43+
.venv/
44+
env/
45+
46+
# Logs and temp files
47+
*.log
48+
*.tmp
49+
*.temp
50+
.cache/
51+
/.cache/
52+
53+
# Archives and binaries
54+
*.zip
55+
*.tar
56+
*.gz
57+
*.7z
58+
*.exe
59+
*.dll
60+
61+
# Datasets or large media directories (keep screenshots)
62+
datasets/
63+
media/
64+
!/screenshots/

README.md

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# TaskApp
2+
3+
TaskApp is a modern Android application built with Jetpack Compose that helps you create, organize, and track tasks with priorities, statistics, and insights. It supports email/password, Google, and anonymous sign-in, and includes a clean, themeable UI with light/dark mode.
4+
5+
<div align="center">
6+
<table>
7+
<tr>
8+
<td><img src="screenshots/0.png" alt="Screenshot 0" width="220"/></td>
9+
<td><img src="screenshots/1.png" alt="Screenshot 1" width="220"/></td>
10+
<td><img src="screenshots/2.png" alt="Screenshot 2" width="220"/></td>
11+
<td><img src="screenshots/3.png" alt="Screenshot 3" width="220"/></td>
12+
</tr>
13+
<tr>
14+
<td><img src="screenshots/4.png" alt="Screenshot 4" width="220"/></td>
15+
<td><img src="screenshots/5.png" alt="Screenshot 5" width="220"/></td>
16+
<td><img src="screenshots/6.png" alt="Screenshot 6" width="220"/></td>
17+
<td><img src="screenshots/7.png" alt="Screenshot 7" width="220"/></td>
18+
</tr>
19+
<tr>
20+
<td></td>
21+
<td><img src="screenshots/8.png" alt="Screenshot 8" width="220"/></td>
22+
<td><img src="screenshots/9.png" alt="Screenshot 9" width="220"/></td>
23+
<td></td>
24+
</tr>
25+
</table>
26+
</div>
27+
28+
## Features
29+
- Task list with creation, editing, selection, and bulk actions
30+
- Priority management and breakdown (Low/Medium/High)
31+
- Statistics overview with completion and productivity indicators
32+
- Recent activity and smart insights
33+
- Sign in/up (email & Google) and guest mode
34+
- Settings: dark mode, UI preferences, font scale, and more
35+
- Profile and notifications screens
36+
37+
## Architecture
38+
This project follows a modular Clean Architecture:
39+
40+
- `app` — Android application module; wires dependencies and composes modules
41+
- `core` — Shared utilities and platform integrations (analytics, billing, etc.)
42+
- `domain` — Business logic, models, and use cases
43+
- `data` — Room, Firebase, networking, repositories, and data sources
44+
- `ui` — Jetpack Compose UI, navigation, view models
45+
46+
Module wiring (see `settings.gradle.kts`):
47+
- `app` depends on `core`, `domain`, `data`, and `ui`
48+
- `ui` depends on `domain`, `core`, and `data`
49+
- `data` depends on `domain` and `core`
50+
- `domain` depends on `core`
51+
52+
### Tech Stack
53+
- Jetpack Compose (Material 3, Navigation)
54+
- Hilt (DI) with KSP
55+
- Room (local persistence)
56+
- Firebase (Auth, Firestore, Analytics, Crashlytics)
57+
- WorkManager (background tasks)
58+
- Coroutines
59+
60+
### Navigation & Flows
61+
Navigation is defined in `ui/src/main/java/com/example/ui/AppRoot.kt` using `NavHost`:
62+
- Routes: `signin`, `home`, `stats`, `profile`, `notifications`, `settings`, `edit`, `edit/{id}`
63+
- Start destination: `signin` when not authenticated, otherwise `home`
64+
65+
Key screens:
66+
- `HomeScreen` — Task list, bulk actions, top-bar menu (settings, notifications, logout)
67+
- `StatsScreen` — Overview cards, weekly progress, priority chips, recent activity, insights
68+
- `SignInScreen` — Email/Password, Google sign-in, anonymous sign-in
69+
- `SettingsScreen` — Dark mode and UI preferences via `LocalDarkModeController` and `LocalUiSettingsController`
70+
- `ProfileScreen` — Account details and sign out via `ProfileViewModel`
71+
72+
## Setup
73+
74+
### Prerequisites
75+
- Android Studio latest (Koala or newer recommended)
76+
- JDK `11`
77+
- Android SDK API 24+
78+
79+
### Steps
80+
1. Clone the repository:
81+
```bash
82+
git clone <repository-url>
83+
cd TaskApp
84+
```
85+
2. Open the project in Android Studio and sync Gradle
86+
3. Configure Firebase (optional but recommended):
87+
- Place your `google-services.json` into `app/`
88+
- Ensure Google services plugins are enabled in `app/build.gradle.kts`
89+
4. Configure Google Sign-In server client ID (optional):
90+
- Add `GOOGLE_SERVER_CLIENT_ID` to `local.properties` or your environment; it is read in `ui/build.gradle.kts`
91+
5. Build and run:
92+
```bash
93+
./gradlew :app:assembleDebug
94+
./gradlew :app:installDebug
95+
```
96+
97+
## Build Commands
98+
```bash
99+
# Clean build
100+
./gradlew clean
101+
102+
# Build app
103+
./gradlew :app:assembleDebug
104+
./gradlew :app:assembleRelease
105+
106+
# Install on device/emulator
107+
./gradlew :app:installDebug
108+
109+
# Build UI module (library)
110+
./gradlew :ui:assembleDebug
111+
112+
# Run tests
113+
./gradlew test
114+
115+
# Lint
116+
./gradlew lint
117+
```
118+
119+
## Notes
120+
- The project uses KSP for Hilt and Room to improve build speed.
121+
- Some Compose icon APIs may be deprecated; warnings are expected and non-blocking.
122+
123+
## Folder Structure (Top-Level)
124+
```
125+
TaskApp/
126+
├── app/ # Android app module (entry point)
127+
├── core/ # Core utilities and integrations
128+
├── domain/ # Entities, use cases, business logic
129+
├── data/ # Repositories, Room, Firebase, networking
130+
├── ui/ # Compose UI and navigation
131+
├── screenshots/ # App screenshots
132+
└── scripts/ # Firebase test utilities and seed scripts
133+
```
134+
135+
## License
136+
This project is provided as-is for demonstration. Add your license notice here if needed.

app/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

app/build.gradle.kts

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
plugins {
2+
alias(libs.plugins.android.application)
3+
alias(libs.plugins.kotlin.android)
4+
alias(libs.plugins.hilt.android)
5+
alias(libs.plugins.ksp)
6+
alias(libs.plugins.gms)
7+
alias(libs.plugins.crashlytics)
8+
}
9+
10+
android {
11+
namespace = "com.example.taskapp"
12+
compileSdk = 35
13+
14+
defaultConfig {
15+
applicationId = "com.example.taskapp"
16+
minSdk = 24
17+
targetSdk = 35
18+
versionCode = 1
19+
versionName = "1.0"
20+
}
21+
22+
buildTypes {
23+
release {
24+
isMinifyEnabled = false
25+
proguardFiles(
26+
getDefaultProguardFile("proguard-android-optimize.txt"),
27+
"proguard-rules.pro"
28+
)
29+
}
30+
}
31+
compileOptions {
32+
sourceCompatibility = JavaVersion.VERSION_11
33+
targetCompatibility = JavaVersion.VERSION_11
34+
}
35+
kotlinOptions {
36+
jvmTarget = "11"
37+
}
38+
39+
lint {
40+
abortOnError = false
41+
}
42+
buildFeatures {
43+
compose = true
44+
}
45+
composeOptions {
46+
kotlinCompilerExtensionVersion = "1.5.15"
47+
}
48+
}
49+
50+
ksp {
51+
arg("dagger.fastInit", "enabled")
52+
arg("dagger.hilt.shareTestComponents", "true")
53+
}
54+
55+
dependencies {
56+
implementation(project(":core"))
57+
implementation(project(":domain"))
58+
implementation(project(":data"))
59+
implementation(project(":ui"))
60+
61+
// Compose
62+
implementation(platform(libs.compose.bom))
63+
implementation(libs.compose.ui)
64+
implementation(libs.compose.ui.graphics)
65+
implementation(libs.compose.ui.tooling.preview)
66+
implementation(libs.compose.material3)
67+
implementation(libs.androidx.compose.activity)
68+
implementation(libs.androidx.lifecycle.runtime.compose)
69+
implementation(libs.androidx.navigation.compose)
70+
71+
// Hilt
72+
implementation(libs.hilt.android)
73+
ksp(libs.hilt.compiler)
74+
ksp(libs.androidx.hilt.compiler)
75+
implementation(libs.hilt.navigation.compose)
76+
77+
// WorkManager
78+
implementation(libs.androidx.work.runtime.ktx)
79+
80+
// Firebase
81+
implementation(platform(libs.firebase.bom))
82+
implementation(libs.firebase.auth)
83+
implementation(libs.firebase.firestore)
84+
implementation(libs.firebase.messaging)
85+
implementation(libs.firebase.analytics)
86+
implementation(libs.firebase.crashlytics)
87+
88+
// Billing
89+
implementation(libs.play.billing)
90+
91+
// Location services
92+
implementation("com.google.android.gms:play-services-location:21.0.1")
93+
implementation("com.google.android.gms:play-services-maps:18.2.0")
94+
95+
// Widgets
96+
implementation("androidx.glance:glance-appwidget:1.0.0")
97+
98+
// Debug tools
99+
debugImplementation(libs.compose.ui.tooling)
100+
}

app/google-services.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"project_info": {
3+
"project_number": "1089450233922",
4+
"project_id": "taskapp-568e6",
5+
"storage_bucket": "taskapp-568e6.firebasestorage.app"
6+
},
7+
"client": [
8+
{
9+
"client_info": {
10+
"mobilesdk_app_id": "1:1089450233922:android:24a2fb2e3bc6ee01a7dddb",
11+
"android_client_info": {
12+
"package_name": "com.example.taskapp"
13+
}
14+
},
15+
"oauth_client": [],
16+
"api_key": [
17+
{
18+
"current_key": "AIzaSyDcZSZI6OnIaOT3TFtCffDMwTVyKrBWomY"
19+
}
20+
],
21+
"services": {
22+
"appinvite_service": {
23+
"other_platform_oauth_client": []
24+
}
25+
}
26+
}
27+
],
28+
"configuration_version": "1"
29+
}

0 commit comments

Comments
 (0)