Activity

Stef

Added 2 widgets:

  • Recent Files (configurable opacity & file count up to 30)
  • Server Stats (configurable opacity)
    Removed unused imports
0
Stef

Finished moving screens to ViewModel, moved:

  • Admin settings
  • Admin users
  • Admin Invites
    Moved tables and notifications from function(content = { ... }) to function() { ... }
    Fixed admin settings not deleting the value if the input was empty as it was not sending null values to the server, now it does
    Admin settings that are in the tampered list are now disabled in the app too
    Moved most variables from remember {} to rememberSaveable to they can survive configuration changes such as screen rotation

in the image “Delete Files Interval” is disabled because it’s tampered

Attachment
0
Stef

move to ViewModel these screens:

  • admin actions
  • folders
  • urls
  • metrics
  • login
  • home screens
    (i think i didn’t forget any?)

fixed ColorPicker not calling onColorChange when pressing automatic pick button in tags
fixed double %% in metrics
fixed commit SHA being full length in VersionDisplay instead of only taking 7 characters

Attachment
0
Stef

Moved the internal app storage keys (like server url, token, biometric auth status etc.) to constants so i’m sure i never typo them
Fixed the “Remove Avatar” button not working (created its own HTTP request for it cause in updateCurrentuser the API would complain of username and password being null when updating the avatar
Fixed the crash when you save the “Viewing Files” user settings (because the .toString() output was different from the enum actual name so .valueOf would error
In the Notification component moved the duration property above content so i can do Notification.show(...) { content } (which is cleaner and more readable) instead of doing Notification.show([...], content)
Started moving the app’s screen from normal remember {} to ViewModels (currently done URLs, upload file, upload text and user settings)

(idk what to put as attachment since it’s mostly internal stuff so i’ll put images of the success messages of the buttons that would previously error or crash)

Attachment
Attachment
Attachment
0
Stef

Added a check for the server version on login and app open (in the loading screen)
The app now remembers the compact state of each page instead of always defaulting to large mode
Fixed VersionDisplay not correctly displaying the latest commit data (i had put a != instead of == skull_cry

Attachment
Attachment
Attachment
0
Stef

Created folders screen
Added a “no data available” message to all pages that have variable options such as invites, users, files, folders etc.
Created the endpoints to edit folders
Added a close button to the PromptPopup
Created a util isChildOf that returns true if the given folder has the given parentId as one of its parents or grandparents, used to make sure the selected folder is not a child of the one you’re deleting or moving
Fixed MoreActionsButton not correctly disabling the options in the dropdown menu

0
Stef

Created 2 share intent for upload files or shortening files

  • Normal: opens the app to allow customization such as deletion date, max views etc.
  • Quick: uploads with all the default options without ever opening the app and copies the URLs to the clipboard
    Fixed LargeFileDisplay not closing the delete file popup when pressing the delete button
    Fixed LargeFileDisplay not opening any other file on home page (when clicking them from the recent files list) after the deletion of another file (this should apply to files screen too)
    Added a popup to prompt for notification (only if they’re not already granted) in the login screen
    Removed unused imports
0
Stef

Migrate from Toast.makeText().show() to Notification.show()
Migrated from Log.d()/Log.e() to Logger.debug()/Logger.error() (a custom class that automatically removes logcat logging in release builds)
Updated manifest file to use dataSync fg service type / DATA_SYNC permission (as it’s intended for upload/downloads) instead of mediaProcessing / MEDIA_PROCESSING which is intended for image/video editing
Added max file size to file preview (otherwise large files would cause an out of memory error and crash the app
Updated Notification component to allow a custom composable as content instead of a normal strings

Attachment
0
Stef

Added a check to see if the device has enough space for the file or export before it starts downloading (to avoid it erroring after it downloaded many GB of data)
Updated links color, should be more readable on the dark bg hopefully
Created a custom Logger class (still unused yet)
Fixed GetServerVersionResponse values to match actual API return values
Fixed login failing to fetch data (like public/web settings & user avatar)
Created user settings screen

0
Stef

Split the admin settings into multiple categories (chosen via a select menu) so they do not render all at once and thus don’t make the app lag when they load

0
Stef

Created admin invites screen
Created admin users screen
Created admin actions screen
Started making admin settings screen
Updated ColorPicker component to actually change the color on user input (when typing the HEX color manually)
updated server settings error response model since it’s different from all other HTTP endpoints’ error response
Added invite related HTTP requests
Added README.md
Made a custom Notification component that will replace the default android Toast

(yeah, i’m tryna fix the sidebar lagging when opening the settings)

1

Comments

Stef
Stef 18 days ago

also damn, that devlog time was precise asf

Stef

Created admin users page (kinda just copied and pasted URLs page and modified it to apply for users)
Fixed some HTTP requests not working correctly
Ggeneralized even more the DeletePromptPopup component
Prompt for password if the file requires it instead of showing error 403
Created AvatarInput component for the user to upload their avatar of (if they’re an admin) update other people’s avatar

0
Stef

Updated ApiClient to optionally also send null values (defaults to omit)
Added a toast success message on all copy buttons
Created the URLs page
Generalized the DeleteFilePromptPopup component and renamed to DeletePromptPopup
Created a util to generate QR codes

0
Stef

Changed the condition for the skeleton loading in FilePreview
Fixed password login not working (i had put a check for if the token was in storage… on the function that fetches the token using username & password… 💀)
Fixed login sometimes getting stuck on an endless loading (related to prev line)
Changed Switch description layout
Added a popup for uploaded files and all the upload headers set by the user via selects, text inputs or switches
Created the UploadTextScreen (pretty much similar to upload file just with a text input)
Added handling of camera

0
Stef

Updated some HTTP requests
Updated download path fetching
Added description to Select & TextInput
Finished files screen with tags & incomplete/pending files
Started doing upload files page
Created a ColorPicker compose

0
Stef

FilePreview component now show a placeholder with loading message instead of skeleton loading
Created about 80/90% of files screen (would’ve finished it but it’s 1AM and i got school at 8AM💀)
Updated how Table component works to make it more customizable (like make it sortable, searchable, clickable)
Added KeyboardActions to TextInput component so i can handle physical keyboard enter press
Created a paging system component for the files page 8will be used for other pages too like URLs
Created a HeaderButton component that will be used in all pages that have any button on top on the Zipline web UI

0
Stef

Finished the LargeFileDisplay component
Created the “Metrics” Screen
Updated the skeleton modifier to add optional height/width
disabled navigation to the same route as current in the sidebar (it just closes the sidebar without navigating)
Added keyboard options to the TextInput component (so i can use number only keyboard)
Fixed splash screen color to match icon color

(the video might look worse since i had to compress it from 105 MB to < 50 MB)

0
Stef

Added app icon
Created login screen
FilePreview now tries to generate thumbnails from the video’s first frames
Recent files on home screen are now clickable and open largeFilePreview
Made sidebar scrollable
Created LargeFileDisplay (some buttons still unfinished and download isn’t really polished yet, in the future it won’t always ask for the save folder but only first time), Select and Tag components
Fix folder delete/remove file from folder HTTP schema (@DELETE doesn’t allow having a body so i opted for @HTTP)
Fix Popup height not correctly converting PX to DP
renamed removeFileToFolder to removeFileFromFolder (i think i copy pasted addFileToFolder and didn’t rename the function correctly 💀)

0
Stef

Fixed getAvatar request erroring cuz trying to parse as JSON a base64 image string
Changed File password from PasswordState to Boolean
Added the user avatar to the Header component as a Button that opens settings
Created the app’s home screen
Created VideoPlayer, Table and FilePreview components
Added a scrollbar to some scrollable views

0
Stef

Added light & dark theme
Added biometric auth screen and loading screen
Added Button, TextInput & Switch and Sidebar (mostly copied copied from my Hackatime app and slightly modified)
Updated some API responses

Attachment
Attachment
Attachment
0
Stef

Created all the typedefs for the Zipline API responses, request bodies, queries etc.

I haven’t made any UI on the Kotlin version yet so for now here’s an image of the react native app just to have an idea of how the login screen will look (i didn’t know what else to put since code pics aren’t allowed)

Attachment
0
Stef

Shipped this project!

Hours: 86.72
Cookies: 🍪 2130
Multiplier: 24.56 cookies/hr

I translated my previously made Hackatime Stats app from react-native w/ Expo to native Kotlin code
This is the first app I made after learning Kotlin but it didn’t seem that hard, the Jetpack Compose / Jetpack Glance layout was kinda similar to HTML in some ways and was easy to understand

Stef

Motivational notifications are now sent at 9 AM/PM in the user’s own timezone instead of any random time (since before it was only sending every 12 hours in the server’s timezone)
Added the remaining splash icon frames needed to make the icon loopable
Updated the build Forgejo action to include the debug symbols in the release
Updated the build.gradle.kts file to enable isShrinkResources, disable isDebuggable and set debug symbols to FULL for the release build
Specified Android NDK version in the build config

0
Stef

Fixed notifications settings resetting when closing and re-opening settings (i had put the wrong type for its response body)

Attachment
0
Stef

Improved Button, OutlinedButton and TextInput disabled colors
Fixed goals screen showing a big skeleton box instead of multiple and now it shows loading every time a new range is selected and disables the range button when loading
Home screen now shows a skeleton loading on texts when loading and disables the range button
Settings now disable everything in the corresponding box (either notifications or app settings) when saving

0
Stef

Moved hardcoded strings to the strings.xml file so it’s easier to translate it in the future
Added a loading spinner in the login screen when logging in
Updated README’s build process to use gradlew instead of old react native code

Attachment
Attachment
Attachment
Attachment
Attachment
Attachment
Attachment
Attachment
0
Stef

Added widget size choice in the preview for widget configuration (only for resizeable ones)
Added current goal widget (along with its configuration screen & a vertical progress bar and circular progress bar components for widgets since the official widget circular progress bar only supports indefinite progress (aka like loading spinner) and the official widget linear progress bar doesn’t support vertical layout)
Added widget image previews
Added an animated splash screen
Fixed widget not actually resizing to 5 cells
Fixed header being cut off on certain screen sizes/devices with bigger status bar
Fixed api key link in login not linking to correct page
Fixed widget config screen not always showing the correct widget’s settings
Applied some ‘code optimization’ (idk how to call them) features suggested by Android Studio’s linter
Removed unused imports

0
Stef

Added top stats widget along with its configuration screen
Fixed widgets background not changing when the system theme changed because it was getting the “raw” color instead of using a ColorProvider
Added cornerRadius constant for widgets
Default widget text to max 1 line

0
Stef

Installed widgets libraries and created the “Today Coding Hours” widget with its configuration screen (WIP top stats widget & goal widget)
I tried to preview the widget directly but i failed so i just decided to make a different component that uses compose features instead of glance to use in the preview
Updated typography declaration (now has a default color)
Added a WallpaperBackground used in widget configuration activities for the wallpaper as widget preview background

0
Stef

Add a check for internet access, and if not available, show a “No Internet” page
Added a loading page instead of showing the login screen
Implemented the biometric authentication switch in the settings and added a biometric authentication page that will be displayed right after loading if the switch is enabled and the user has a fingerprint enrolled
Converted all the icons to rounded (material symbols)
Updated the app icon from default to app’s custom one
Implemented push notifications handling & created 2 notification channels
Updated backend api HTTP request definitions for the endpoint to send the user’s push notification token and fixed updateUserNotificationCategories response type
Updated some libraries

(i know the video shows API keys, but they are only available on my locally hosted instance so it’s fine)

0
Stef

Created the settings screen
Updated ApiClient for a better debugging (using a bool variable instead of commenting & uncommenting code)
Moved all the hard-coded strings to the strings.xml file
Added a check for notifications permission
Added a DebugWrapper that only displays its content in debug build (using build variants)
Added some proguard rules otherwise release build would not work correctly cause of R8 minification

0
Stef

Created the projects screen
Created the goals screen
Added skeleton loading & tooltip to the pie charts in the home page & cancel slice selection on range update
Fixed login screen redirecting twice to home page (so back button would navigate to home page twice before closing the app)
Created some time function utilities
Fixed the body for the backend API requests
Installed a library to easily format data into human readable strings (https://github.com/jacobras/Human-Readable)
Updated all HTTP reqeuests to use apiKey.isNullOrEmpty() instead of apiKey == null || apiKey.isEmpty()
Fixed Goal type (its achieved value was set to Boolean instead of Double and changed goal from Int to Double)
Switched to gradle toolchain as per android studio suggestion

note: i had to compress the video as it was 88.3mb and flavortown allows max 50mb so it might look a little bad

0
Stef

Added a colorHash function that converts any string to a hex color (for pie chart colors)
Added languages, editors*, operating systems* and machines* pie charts (*: Only in “Last 7 Days” range) (when a pie chart section is clicked, it will also scale by 1.2 and a legend will appear under the chart with the name and the hours)
Added a list of programming languages colors that will be preferred (when available) over the colorHash function in the languages pie chart
Fixed “Last 7 Days Overview” line chart that would re-render & re-animate whenever the theme was switched from dark to light or vice versa

Attachment
Attachment
0
Stef

Updated formatMs() function to include a limit parameter that lets it only show first X units (where X is the limit parameter)
Added a new color (onSurfaceVariant) to the light/dark theme color scheme
Created a modifier (Modifier.shimmerable, name from the compose-shimmer library) for skeleton loading
Created a Popup component
Fixed API definitions as some endpoints were incorrect and so they were 404-ing
Continued making the home page

  • Added date range button that shows a Popup with the picker
  • Added “Top OS” card*
  • Added “Top Editor” card*
  • Added “Top Machine” card*
  • Added “Last 7 Days Overview” card with a line chart*

* Only when the range is set to “Last 7 Days”

Attachment
0
Stef

Installed & tested a library for drawing charts (pie & line charts)
Started making the app’s home screen

Attachment
0
Stef
  • finished the TextInput component
  • Added the Switch component
  • Finished the login screen
  • The Header now shows the logged user’s username and disables the settings button when in the settings screen
Attachment
Attachment
Attachment
0
Stef

Created a NavBar component for navigation
Created a Header component
Created a Sidebar component (probably won’t be used cuz navbar looks better & more user friendly)
Created a TextInput component that under the hood uses a styled OutlinedtextField
Applied the Hackatime color scheme to the app’s theme
Applied the Hackatime font (Phantom Sans) to the app’s typography
Started creating the login screen and placed the header & navbar in all screens except login

Attachment
Attachment
0
Stef
  • Finished setting up the template functions for the HTTP requests to both Hackatime API and my own backend (used for push notifications and goals) and I implemented the actual code that handles the fetching for the HTTP requests (I haven’t tested HTTP notifications much yet)
  • Added a SecureStorage to store data using DataStorage (I tried to make it look like react-native’s expo-secure-store (not tested much either)
  • Set up firebase (for now I took the FirebaseMessagingService example from android’s example repository (firebase/snippets-android), I will adapt it to the app once i do the notifications setup)

I still haven’t made any UI yet, i’m focusing on the ‘backend’ part for now

Attachment
0
Stef

Still learning how to make Android apps but I’m trying to rewrite my react-native Hackatime app into native Kotlin code
in this push I just added some template functions for the HTTP request (some still missing)

Expect some bad code as I’m new to Kotlin (not sure what to put as image since I only got code for now, no UI yet)

Attachment
0
Stef

Shipped this project!

Hours: 5.85
Cookies: 🍪 91
Multiplier: 15.57 cookies/hr

The website shows a list of addons for the minecraft Create mod (automatically fetched and updated every 3 hours)

I updated the website to add the create version supported by each addon (by automatically downloading the jar file and reading its config files) when available

Stef

I added a script in the addon fetching that checks if the mod does not have a createversion set in the database, and if it doesn’t, downloads the mod’s jar from either Curseforge or Modrinth and scan it for known mod configuration file that include the dependencies
Also added the create version in the website along with a toggle to filter only mods that have a create version set (as some can not be downloaded since they don’t have a specific create version set as dependency or curseforge returns null as downloadUrl

(off-topic: uhh, not sure why i pasted 1 image but the attachments show 2 images)

Attachment
Attachment
0