Options as data, not as form fields
Hard-coding print options into the layout would mean a code change for every new product. Storing options and their allowed combinations in the database let the catalogue grow without touching the application.
A digital printing service application that allows customers to browse printing products, customise orders, upload designs and track order progress.
Small printing businesses take orders over messaging apps, where specifications get lost and artwork arrives compressed. PrintXpress puts the whole order into one structured record.
A printing order is a set of dependent choices — material constrains finish, finish constrains quantity pricing. Modelling that on a small screen without overwhelming the customer was the core design problem.
I designed the screens and the data model, and built the application, including the role-based navigation and the order lifecycle.
Each layer, and the reasoning that shaped it.
A layered Android application: activities and fragments for presentation, a service layer for order rules, and a repository layer over SQLite. Business rules sit outside the UI classes so they can be reasoned about on their own.
XML layouts with a consistent spacing and type scale, constraint-based layouts for varied screen sizes, and touch targets sized for real use rather than for the emulator.
Java service classes hold order validation and pricing rules. Options are modelled as an explicit set with allowed combinations, which prevents impossible orders from being submitted.
SQLite with a normalised schema for products, options, orders and users. Uploaded artwork is stored on the file system with the path referenced from the order row.
Local-first by design for the academic scope, with the repository layer written so a remote data source could replace SQLite without touching the screens.
Three roles, one application, with navigation and permissions that follow the signed-in user.
A catalogue of printing products with specifications, options and indicative pricing.
Customers attach their own design files to an order and see them on the confirmation screen.
Size, material, quantity and finish are selected as structured options rather than free text.
Each order carries a visible status that staff update as the job moves through production.
SQLite and local file storage keep the application usable without a permanent connection.
Placeholder frames — swap for real captures once they exist.
Every architecture is a set of choices. These are the ones that mattered most, and why they went the way they did.
Hard-coding print options into the layout would mean a code change for every new product. Storing options and their allowed combinations in the database let the catalogue grow without touching the application.
Separate applications for customer and staff would have doubled the work for a small business. Role-driven navigation kept a single codebase while making each user's view feel purpose-built.
Want the detail behind any of these decisions?
Start a conversation