Skip to content

Commit b8ef0d1

Browse files
committed
feat: add automated midnight habit contribution scoring
- Add HabitContribution entity and DAO for tracking daily completion status - Implement MidnightContributionWorker to evaluate tasks at day's end - Schedule contribution worker via WorkerScheduler at midnight - Reschedule workers on device boot via BootReceiver - Update ContributionGraph component to display habit data - Integrate habit contribution logic into TaskViewModel and DashboardScreen - Enhance AnvilAccessibilityService with improved link blocking - Update CI/CD workflows for release automation
1 parent ba7dd48 commit b8ef0d1

14 files changed

Lines changed: 1213 additions & 556 deletions

File tree

.github/workflows/ci.yml

Lines changed: 144 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,115 +1,144 @@
1-
name: Android CI
2-
3-
on:
4-
push:
5-
branches: [ main, develop ]
6-
pull_request:
7-
branches: [ main, develop ]
8-
9-
jobs:
10-
lint:
11-
name: Lint Check
12-
runs-on: ubuntu-latest
13-
steps:
14-
- name: Checkout code
15-
uses: actions/checkout@v4
16-
17-
- name: Set up JDK 17
18-
uses: actions/setup-java@v4
19-
with:
20-
java-version: '17'
21-
distribution: 'temurin'
22-
23-
- name: Make gradlew executable
24-
run: |
25-
sed -i 's/\r$//' gradlew
26-
chmod +x gradlew
27-
28-
- name: Setup Gradle
29-
uses: gradle/actions/setup-gradle@v3
30-
with:
31-
gradle-version: current
32-
33-
- name: Run Lint
34-
run: ./gradlew lintDebug --console=plain
35-
36-
- name: Upload Lint Results
37-
uses: actions/upload-artifact@v4
38-
if: always()
39-
with:
40-
name: lint-results
41-
path: app/build/reports/lint-results-debug.html
42-
43-
build:
44-
name: Build Debug APK
45-
runs-on: ubuntu-latest
46-
needs: lint
47-
steps:
48-
- name: Checkout code
49-
uses: actions/checkout@v4
50-
51-
- name: Set up JDK 17
52-
uses: actions/setup-java@v4
53-
with:
54-
java-version: '17'
55-
distribution: 'temurin'
56-
57-
- name: Make gradlew executable
58-
run: |
59-
sed -i 's/\r$//' gradlew
60-
chmod +x gradlew
61-
62-
- name: Setup Gradle
63-
uses: gradle/actions/setup-gradle@v3
64-
with:
65-
gradle-version: current
66-
67-
- name: Build Debug APK
68-
run: ./gradlew assembleDebug --console=plain
69-
70-
- name: Upload Debug APK
71-
uses: actions/upload-artifact@v4
72-
with:
73-
name: debug-apk
74-
path: app/build/outputs/apk/debug/*.apk
75-
76-
test:
77-
name: Run Unit Tests
78-
runs-on: ubuntu-latest
79-
needs: build
80-
steps:
81-
- name: Checkout code
82-
uses: actions/checkout@v4
83-
84-
- name: Set up JDK 17
85-
uses: actions/setup-java@v4
86-
with:
87-
java-version: '17'
88-
distribution: 'temurin'
89-
90-
- name: Make gradlew executable
91-
run: |
92-
sed -i 's/\r$//' gradlew
93-
chmod +x gradlew
94-
95-
- name: Setup Gradle
96-
uses: gradle/actions/setup-gradle@v3
97-
with:
98-
gradle-version: current
99-
100-
- name: Run Unit Tests
101-
run: ./gradlew testDebugUnitTest --console=plain
102-
103-
- name: Upload Test Results
104-
uses: actions/upload-artifact@v4
105-
if: always()
106-
with:
107-
name: test-results
108-
path: app/build/reports/tests/testDebugUnitTest/
109-
110-
- name: Upload Test Report
111-
uses: actions/upload-artifact@v4
112-
if: always()
113-
with:
114-
name: test-report
115-
path: app/build/test-results/testDebugUnitTest/
1+
name: Android CI
2+
3+
on:
4+
push:
5+
branches: [ main, develop ]
6+
pull_request:
7+
branches: [ main, develop ]
8+
9+
# Cancel in-progress runs for the same branch
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.ref }}
12+
cancel-in-progress: true
13+
14+
env:
15+
GRADLE_OPTS: "-Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.caching=true"
16+
JAVA_VERSION: '17'
17+
18+
jobs:
19+
lint:
20+
name: Lint Check
21+
runs-on: ubuntu-latest
22+
steps:
23+
- name: Checkout code
24+
uses: actions/checkout@v4
25+
with:
26+
fetch-depth: 0
27+
28+
- name: Set up JDK ${{ env.JAVA_VERSION }}
29+
uses: actions/setup-java@v4
30+
with:
31+
java-version: ${{ env.JAVA_VERSION }}
32+
distribution: 'temurin'
33+
cache: 'gradle'
34+
35+
- name: Make gradlew executable
36+
run: |
37+
sed -i 's/\r$//' gradlew
38+
chmod +x gradlew
39+
40+
- name: Setup Gradle
41+
uses: gradle/actions/setup-gradle@v3
42+
with:
43+
gradle-version: current
44+
cache-read-only: ${{ github.ref != 'refs/heads/main' }}
45+
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
46+
dependency-graph: generate-and-submit
47+
48+
- name: Run Lint
49+
run: ./gradlew lintDebug --console=plain --build-cache
50+
51+
- name: Upload Lint Results
52+
uses: actions/upload-artifact@v4
53+
if: always()
54+
with:
55+
name: lint-results
56+
path: app/build/reports/lint-results-debug.html
57+
retention-days: 14
58+
59+
build:
60+
name: Build Debug APK
61+
runs-on: ubuntu-latest
62+
needs: lint
63+
steps:
64+
- name: Checkout code
65+
uses: actions/checkout@v4
66+
with:
67+
fetch-depth: 0
68+
69+
- name: Set up JDK ${{ env.JAVA_VERSION }}
70+
uses: actions/setup-java@v4
71+
with:
72+
java-version: ${{ env.JAVA_VERSION }}
73+
distribution: 'temurin'
74+
cache: 'gradle'
75+
76+
- name: Make gradlew executable
77+
run: |
78+
sed -i 's/\r$//' gradlew
79+
chmod +x gradlew
80+
81+
- name: Setup Gradle
82+
uses: gradle/actions/setup-gradle@v3
83+
with:
84+
gradle-version: current
85+
cache-read-only: ${{ github.ref != 'refs/heads/main' }}
86+
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
87+
88+
- name: Build Debug APK
89+
run: ./gradlew assembleDebug --console=plain --build-cache
90+
91+
- name: Upload Debug APK
92+
uses: actions/upload-artifact@v4
93+
with:
94+
name: debug-apk
95+
path: app/build/outputs/apk/debug/*.apk
96+
retention-days: 14
97+
98+
test:
99+
name: Run Unit Tests
100+
runs-on: ubuntu-latest
101+
needs: build
102+
steps:
103+
- name: Checkout code
104+
uses: actions/checkout@v4
105+
with:
106+
fetch-depth: 0
107+
108+
- name: Set up JDK ${{ env.JAVA_VERSION }}
109+
uses: actions/setup-java@v4
110+
with:
111+
java-version: ${{ env.JAVA_VERSION }}
112+
distribution: 'temurin'
113+
cache: 'gradle'
114+
115+
- name: Make gradlew executable
116+
run: |
117+
sed -i 's/\r$//' gradlew
118+
chmod +x gradlew
119+
120+
- name: Setup Gradle
121+
uses: gradle/actions/setup-gradle@v3
122+
with:
123+
gradle-version: current
124+
cache-read-only: ${{ github.ref != 'refs/heads/main' }}
125+
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
126+
127+
- name: Run Unit Tests
128+
run: ./gradlew testDebugUnitTest --console=plain --build-cache
129+
130+
- name: Upload Test Results
131+
uses: actions/upload-artifact@v4
132+
if: always()
133+
with:
134+
name: test-results
135+
path: app/build/reports/tests/testDebugUnitTest/
136+
retention-days: 14
137+
138+
- name: Upload Test Report
139+
uses: actions/upload-artifact@v4
140+
if: always()
141+
with:
142+
name: test-report
143+
path: app/build/test-results/testDebugUnitTest/
144+
retention-days: 14

.github/workflows/release.yml

Lines changed: 85 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,85 @@
1-
name: Android CI/CD Release
2-
3-
on:
4-
push:
5-
tags:
6-
- 'v*' # Trigger only when you push a tag like v1.0, v2.1.4, etc.
7-
8-
jobs:
9-
build:
10-
runs-on: ubuntu-latest
11-
permissions:
12-
contents: write
13-
steps:
14-
- name: Checkout code
15-
uses: actions/checkout@v4
16-
17-
- name: Set up JDK 17
18-
uses: actions/setup-java@v4
19-
with:
20-
java-version: '17'
21-
distribution: 'temurin'
22-
23-
- name: Decode Keystore
24-
id: decode_keystore
25-
uses: timheuer/base64-to-file@v1.2
26-
with:
27-
fileName: 'release_key.jks'
28-
encodedString: ${{ secrets.SIGNING_KEY }}
29-
30-
- name: Make gradlew executable
31-
run: |
32-
sed -i 's/\r$//' gradlew
33-
chmod +x gradlew
34-
35-
- name: Build Release APK
36-
run: ./gradlew assembleRelease
37-
env:
38-
# These env variables must match your build.gradle signingConfig
39-
RELEASE_STORE_FILE: ${{ steps.decode_keystore.outputs.filePath }}
40-
RELEASE_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
41-
RELEASE_KEY_ALIAS: ${{ secrets.ALIAS }}
42-
RELEASE_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
43-
44-
- name: Create GitHub Release
45-
uses: softprops/action-gh-release@v2
46-
with:
47-
files: "app/build/outputs/apk/release/*.apk"
48-
name: Release ${{ github.ref_name }}
49-
body: "Automated Build for version ${{ github.ref_name }}"
50-
draft: false
51-
prerelease: false
52-
fail_on_unmatched_files: true
53-
env:
54-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Built-in, no need to create
1+
name: Android CI/CD Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
8+
env:
9+
GRADLE_OPTS: "-Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.caching=true"
10+
JAVA_VERSION: '17'
11+
12+
jobs:
13+
build:
14+
runs-on: ubuntu-latest
15+
permissions:
16+
contents: write
17+
steps:
18+
- name: Checkout code
19+
uses: actions/checkout@v4
20+
with:
21+
fetch-depth: 0
22+
23+
- name: Set up JDK ${{ env.JAVA_VERSION }}
24+
uses: actions/setup-java@v4
25+
with:
26+
java-version: ${{ env.JAVA_VERSION }}
27+
distribution: 'temurin'
28+
cache: 'gradle'
29+
30+
- name: Decode Keystore
31+
id: decode_keystore
32+
uses: timheuer/base64-to-file@v1.2
33+
with:
34+
fileName: 'release_key.jks'
35+
encodedString: ${{ secrets.SIGNING_KEY }}
36+
37+
- name: Make gradlew executable
38+
run: |
39+
sed -i 's/\r$//' gradlew
40+
chmod +x gradlew
41+
42+
- name: Setup Gradle
43+
uses: gradle/actions/setup-gradle@v3
44+
with:
45+
gradle-version: current
46+
cache-read-only: false
47+
cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
48+
49+
- name: Build Release APK
50+
run: ./gradlew assembleRelease --console=plain --build-cache
51+
env:
52+
RELEASE_STORE_FILE: ${{ steps.decode_keystore.outputs.filePath }}
53+
RELEASE_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
54+
RELEASE_KEY_ALIAS: ${{ secrets.ALIAS }}
55+
RELEASE_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
56+
57+
- name: Generate Release Notes
58+
id: release_notes
59+
run: |
60+
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
61+
if [ -n "$PREV_TAG" ]; then
62+
COMMITS=$(git log --pretty=format:"- %s" $PREV_TAG..HEAD)
63+
else
64+
COMMITS=$(git log --pretty=format:"- %s" -10)
65+
fi
66+
echo "COMMITS<<EOF" >> $GITHUB_OUTPUT
67+
echo "$COMMITS" >> $GITHUB_OUTPUT
68+
echo "EOF" >> $GITHUB_OUTPUT
69+
70+
- name: Create GitHub Release
71+
uses: softprops/action-gh-release@v2
72+
with:
73+
files: "app/build/outputs/apk/release/*.apk"
74+
name: Release ${{ github.ref_name }}
75+
body: |
76+
## What's Changed
77+
${{ steps.release_notes.outputs.COMMITS }}
78+
79+
---
80+
*Automated build for version ${{ github.ref_name }}*
81+
draft: false
82+
prerelease: false
83+
fail_on_unmatched_files: true
84+
env:
85+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

0 commit comments

Comments
 (0)