Skip to content

Commit c59618d

Browse files
committed
Udated the README.md
1 parent ac53624 commit c59618d

4 files changed

Lines changed: 106 additions & 18 deletions

File tree

.idea/planningMode.xml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 101 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
<p align="center">
99
A native Android client for COMSATS University Islamabad, Abbottabad Campus (CUIIT) students<br/>
10-
to manage, download, and submit assignments without ever opening a browser.
10+
to manage, download, and submit assignments — and view your weekly timetable — without ever opening a browser.
1111
</p>
1212

1313
<p align="center">
@@ -26,7 +26,7 @@
2626

2727
## Overview
2828

29-
Assignly is a purpose-built Android client for the [COMSATS Student Information System (SIS)](https://sis.cuiatd.edu.pk) portal. It authenticates using your student credentials, scrapes the assignment portal, and presents everything in a clean and usable interface — with one-tap download and upload support.
29+
Assignly is a purpose-built Android client for the [COMSATS Student Information System (SIS)](https://sis.cuiatd.edu.pk) portal. It authenticates using your student credentials, scrapes the assignment portal, and presents everything in a clean and usable interface — with one-tap download and upload support, a full weekly timetable planner, background sync with push notifications, and automatic update detection.
3030

3131
No more squinting at a tiny browser, fighting with broken mobile web layouts, or missing deadlines buried inside a clunky table.
3232

@@ -37,7 +37,7 @@ No more squinting at a tiny browser, fighting with broken mobile web layouts, or
3737
### Secure Login & Auto Sign-In
3838

3939
- Log in using your COMSATS registration number (e.g. `SP25-BCS-001`) and password.
40-
- Credentials are stored using **Android EncryptedSharedPreferences** (AES-256 encryption) never in plain text.
40+
- Credentials are stored using **Android EncryptedSharedPreferences** (AES-256 encryption) never in plain text.
4141
- On app launch, Assignly automatically signs you in using saved credentials. No re-typing required.
4242
- Existing plain-text credentials from older versions are automatically migrated to encrypted storage.
4343
- Logout clears all saved credentials and session cookies immediately.
@@ -90,6 +90,21 @@ Tapping this card navigates to the full **Assignment History** screen.
9090

9191
---
9292

93+
### Weekly Timetable Planner
94+
95+
A fully integrated timetable viewer fetches your semester schedule directly from the portal:
96+
97+
- **Swipe navigation** — swipe left and right to smoothly move between days of the week.
98+
- **Pill-style day selector** — tap Mon through Sat to jump to any day. The current day is automatically selected on open.
99+
- **Smart HTML parsing** — extracts clean structured data from the portal's raw timetable, including multi-word lab names (e.g. "DLD Microprocessor Lab", "Physics Lab").
100+
- **Compact class cards** showing course name, session type (Lecture/Lab), time, room, and instructor.
101+
- **Live "Now" indicator** — highlights the class currently in progress.
102+
- **Next Class widget** — shows your upcoming class at a glance when viewing today's schedule.
103+
- **Offline caching** — timetable data is cached locally so it loads instantly on subsequent opens.
104+
- **Performance optimised** — pre-grouped data, memoized computations, and keyed lists for buttery smooth scrolling.
105+
106+
---
107+
93108
### Download Instruction Files
94109

95110
- Tap **Download** on any assignment to fetch instruction files attached by your professor.
@@ -126,22 +141,55 @@ A dedicated screen lists submitted items and missed closed submissions:
126141

127142
---
128143

144+
### Background Sync & Push Notifications
145+
146+
Assignly works even when you're not looking:
147+
148+
- **Periodic background sync** via WorkManager fetches new assignments every 6 hours (configurable in settings).
149+
- **New assignment alerts** — push notifications for newly posted assignments you haven't seen yet.
150+
- **Deadline reminders** — automatic reminders at 24 hours, 6 hours, and 1 hour before each deadline.
151+
- **Upload & download progress** — notification channels for ongoing file transfers.
152+
- **Smart notification permission flow** — prompts for notification access on first launch (Android 13+), and gently re-prompts on the 3rd app open of the day if notifications are still disabled.
153+
- All notification channels are individually configurable in app settings.
154+
155+
---
156+
157+
### Automatic Update Detection
158+
159+
- Checks the **GitHub Releases API** for newer versions using version code tags (e.g. `vc12`).
160+
- **In-app update dialog** — shown every time you open the app when a newer version is available, with a direct link to download.
161+
- **Background update notification** — fires once per day via the background sync worker as a passive reminder.
162+
- Supports update download via the [Assignly website](https://assignly-web.vercel.app/) with automatic fallback to GitHub releases.
163+
164+
---
165+
129166
### Refresh
130167

131-
Hit the refresh icon in the top bar at any time to re-fetch your assignments from the portal. Profile photo and student name are also re-synced on refresh.
168+
Hit the refresh icon in the top bar at any time to re-fetch your assignments and timetable from the portal. Profile photo and student name are also re-synced on refresh.
132169

133170
---
134171

135172
### Loading Skeletons
136173

137-
Instead of a blank screen or a spinner, Assignly shows **animated shimmer skeleton screens** while data loads with separate skeleton layouts for the Pending and Historical screens so transitions feel natural.
174+
Instead of a blank screen or a spinner, Assignly shows **animated shimmer skeleton screens** while data loads — with separate skeleton layouts for the Pending and Historical screens so transitions feel natural.
175+
176+
---
177+
178+
### Settings
179+
180+
A dedicated settings screen lets you configure:
181+
182+
- **Background sync** toggle and interval (1–24 hours)
183+
- **Notification preferences** — independently toggle assignment alerts, deadline reminders, upload notifications, and update notifications
184+
- **Download behaviour** — ask every time, or download directly
185+
- **Theme mode** — Light, Dark, or follow System default
138186

139187
---
140188

141189
### Network Resilience
142190

143191
- Automatic **retry with exponential backoff** for transient `IOException` errors (up to 3 attempts).
144-
- Login timeout: **45 seconds** Upload timeout: **90 seconds**.
192+
- Login timeout: **45 seconds**. Upload timeout: **90 seconds**.
145193
- Descriptive error messages distinguish between: timeout, no internet, wrong credentials, CAPTCHA triggered, and generic server errors.
146194

147195
---
@@ -161,6 +209,7 @@ If the COMSATS portal triggers a CAPTCHA (e.g. after too many failed attempts),
161209
| Networking | OkHttp 4 |
162210
| HTML Parsing | Jsoup 1.18 |
163211
| Credential Storage | AndroidX Security Crypto (EncryptedSharedPreferences) |
212+
| Background Work | AndroidX WorkManager |
164213
| Build System | Gradle (Kotlin DSL) |
165214
| Min SDK | Android 8.0 (API 26) |
166215
| Target SDK | Android 15 (API 35) |
@@ -199,14 +248,51 @@ Release builds enable R8 minification and resource shrinking. Android `Log` call
199248

200249
```
201250
app/src/main/java/com/danycli/assignmentchecker/
202-
├── Assignment.kt # Data model, status enum, deadline parsing
203-
├── MainActivity.kt # All Compose UI: login, lists, skeletons, dialogs
204-
└── PortalRepository.kt # All networking: login, fetch, upload, download
205-
206-
app/src/main/res/
207-
├── values/strings.xml # App name: "Assignly"
208-
├── values/themes.xml # NoActionBar theme
209-
└── xml/ # Backup & data extraction exclusion rules
251+
├── MainActivity.kt # App entry, navigation, update & notification dialogs
252+
├── MainViewModel.kt # ViewModel bridging use cases to UI
253+
├── PortalRepository.kt # All networking: login, fetch, upload, download, timetable
254+
├── PortalUseCases.kt # Clean architecture use cases
255+
256+
├── Assignment.kt # Assignment data model, status enum, deadline parsing
257+
├── Timetable.kt # TimetableLecture data model
258+
├── SettingsModels.kt # Settings enums (DownloadBehavior)
259+
├── ThemeMode.kt # Theme mode enum
260+
├── UiModels.kt # Shared UI models
261+
262+
├── AppSettingsStore.kt # App preferences (sync, notifications, theme)
263+
├── AssignmentCacheStore.kt # Offline assignment cache
264+
├── TimetableCacheStore.kt # Offline timetable cache
265+
├── CredentialsStore.kt # Encrypted credential storage
266+
├── NotificationPromptStore.kt # Daily open tracking & notification prompt state
267+
├── UpdateNotificationStore.kt # Update notification dedup
268+
269+
├── AssignmentNotifications.kt # Notification channels & assignment alerts
270+
├── AssignmentReminderWorker.kt # Deadline reminder WorkManager worker
271+
├── BackgroundSyncWork.kt # Periodic sync scheduler & worker
272+
├── DownloadWork.kt # Background download worker
273+
├── UploadWork.kt # Background upload worker
274+
├── DownloadQueueStore.kt # Download queue persistence
275+
├── UploadQueueStore.kt # Upload queue persistence
276+
├── DownloadNotifier.kt # Download progress notifications
277+
├── UploadNotifier.kt # Upload progress notifications
278+
279+
├── AppUpdateChecker.kt # GitHub Releases API version checker
280+
├── UpdateNavigationManager.kt # Update download URL resolution
281+
├── UpdateNotifier.kt # Update available notification
282+
├── NotificationGate.kt # Notification permission check utility
283+
284+
├── SecurityUtils.kt # Crypto utilities
285+
├── IoRetry.kt # Retry with backoff helper
286+
├── UiUtils.kt # UI constants & helpers
287+
├── SettingsScreen.kt # Settings UI
288+
289+
└── ui/
290+
├── AssignmentsScreen.kt # Pending assignments UI
291+
├── HistoryScreen.kt # Assignment history UI
292+
├── LoginScreen.kt # Login screen UI
293+
├── TimetableScreen.kt # Timetable bottom sheet UI
294+
├── CommonUi.kt # Shared UI components & skeletons
295+
└── theme/ # Material 3 theming
210296
```
211297

212298
---
@@ -232,6 +318,6 @@ This is an **unofficial third-party client** for the COMSATS SIS portal. It is n
232318

233319
## Author
234320

235-
Built by **danycli** a student who got tired of the portal's web experience and decided to fix it.
321+
Built by **danycli** a student who got tired of the portal's web experience and decided to fix it.
236322

237323
*Made with frustration, caffeine, and Jetpack Compose.*

app/src/main/java/com/danycli/assignmentchecker/MainActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,9 +347,9 @@ fun MainScreen(
347347
updateDialogInfo = null
348348
return
349349
}
350-
if (!UpdateNotificationStore.shouldNotifyToday(context)) return
350+
// Always show the in-app dialog when an update is available,
351+
// regardless of whether the background notification already fired today.
351352
updateDialogInfo = remoteInfo
352-
UpdateNotificationStore.markNotifiedToday(context, remoteInfo.latestVersionCode)
353353
}
354354

355355
LaunchedEffect(appSettings) {

0 commit comments

Comments
 (0)