Assignment 3: Convergent Design
Pitch
Introducing ADDapp: a revolution in social media for focus and inclusion
Do you struggle with sensory overload, distraction, or find it challenging to keep up with your online world?
Enter ADDapp, where we've redefined social media to cater to individuals with ADD, ADHD, and those on the autism spectrum. We've taken lessons from in-depth interviews to create a platform that truly understands your unique needs.
Experience peaceful scrolling: tired of visual chaos? ADDapp boasts a clean, clutter-free interface that reduces visual pollution, letting you focus on what matters.
Red mode for better sleep: say goodbye to endless scrolling nights! Activate our soothing red mode during late-night scrolling sessions to ease into a restful slumber. Your sleep cycle deserves a break from the blue light.
Image summaries: no more information overload! We've introduced image summaries that capture the essence of each post, making content easier to digest, even when you're on the go.
Personalized daily highlights: feel overwhelmed by constant updates? You're in control! Specify the day, and ADDapp curates the most important posts from that date, ensuring you never miss a beat without the pressure to be "always on."
Discover ADDapp, the social media that's designed to make your online world a more inclusive, peaceful, and manageable place. Join us today and experience the difference for yourself!
An image summary of ADDapp!
Functional design
Standard parts
concept Authentication
purpose
provide authentication
principle
after registration, returns the object associated with provided credentials if they're right
state
registered: set User
username, password: registered -> one String
actions
register(name, pwd: String, out u: User)
authenticate(name, pwd: String, out u: User)
concept Authentication
purpose
provide authentication
principle
after registration, returns the object associated with provided credentials if they're right
state
registered: set User
username, password: registered -> one String
actions
register(name, pwd: String, out u: User)
authenticate(name, pwd: String, out u: User)
concept Session[User]
purpose
provide authentication for extended period
principle
after a session starts (and before it ends), authentication won't be needed again, until the session is ended.
state
active: set Session
user: active -> one User
actions
start(u: User, out s: Session)
getUser(s: Session, out u: User)
end(s: Session)
concept Session[User]
purpose
provide authentication for extended period
principle
after a session starts (and before it ends), authentication won't be needed again, until the session is ended.
state
active: set Session
user: active -> one User
actions
start(u: User, out s: Session)
getUser(s: Session, out u: User)
end(s: Session)
concept Tag[Item]
purpose
provide systematic classification
principle
after associating tags to objects, when given a set of tags, returns a set of objects that have those tags associated (has to include all of them)
state
tags: set Tag
tagging: tags -> many Item
actions
setTagToItem(tag: Tag, item: Item)
deleteTagFromItem(tag: Tag, item: Item)
allWithTag(tag: set Tag, out u: set Item)
concept Tag[Item]
purpose
provide systematic classification
principle
after associating tags to objects, when given a set of tags, returns a set of objects that have those tags associated (has to include all of them)
state
tags: set Tag
tagging: tags -> many Item
actions
setTagToItem(tag: Tag, item: Item)
deleteTagFromItem(tag: Tag, item: Item)
allWithTag(tag: set Tag, out u: set Item)
concept TextToImage[Post]
purpose
create images that convey the tone of a text
principle
for every post, there'll be a thumbnail, a visual representation of the tone in the text.
state
thumbnails: set Thumbnail
assignments: thumbnails -> many Post
actions
generateImage(post: Post, out u: Thumbnail)
deleteThumbnail(post: Post)
concept TextToImage[Post]
purpose
create images that convey the tone of a text
principle
for every post, there'll be a thumbnail, a visual representation of the tone in the text.
state
thumbnails: set Thumbnail
assignments: thumbnails -> many Post
actions
generateImage(post: Post, out u: Thumbnail)
deleteThumbnail(post: Post)
concept Feed[Item, User]
purpose
bring together content from multiple sources into a single, centralized location
principle
add objects to a feed, that can be retrieved when lookup (sorted differently according to whom it belongs)
state
items: set Item
feeds: Feed -> many User
actions
createFeed(user: User, out u: Feed)
addToFeed(item: Item, user: User, out u: Feed)
removeFromFeed(item: Item, user: User)
lookupFeed(user: User, out u: Feed)
concept Feed[Item, User]
purpose
bring together content from multiple sources into a single, centralized location
principle
add objects to a feed, that can be retrieved when lookup (sorted differently according to whom it belongs)
state
items: set Item
feeds: Feed -> many User
actions
createFeed(user: User, out u: Feed)
addToFeed(item: Item, user: User, out u: Feed)
removeFromFeed(item: Item, user: User)
lookupFeed(user: User, out u: Feed)
concept Post
purpose
allow users to contribute to the community
principle
after creating content, it is made into an object that allows removing and editing
state
posts: set Post
actions
addPost(text: String, out u: Post)
removePost(post: Post)
editPost(newText: String, out u: Post)
concept Post
purpose
allow users to contribute to the community
principle
after creating content, it is made into an object that allows removing and editing
state
posts: set Post
actions
addPost(text: String, out u: Post)
removePost(post: Post)
editPost(newText: String, out u: Post)
concept Highlight[Post]
purpose
set apart important items among a set of items
principle
after adding or removing objects and their dates, given a date, returns a summary of the most important objects related to that date
state
dateToPosts: Date -> many Post
highlights: Date -> Highlight
actions
addPost(date: Date, post: Post)
removePost(date: Date, post: Post)
getHighlights(date: Date, out u: Highlight)
concept Highlight[Post]
purpose
set apart important items among a set of items
principle
after adding or removing objects and their dates, given a date, returns a summary of the most important objects related to that date
state
dateToPosts: Date -> many Post
highlights: Date -> Highlight
actions
addPost(date: Date, post: Post)
removePost(date: Date, post: Post)
getHighlights(date: Date, out u: Highlight)
Synchronizations
app ADDapp
include Authentication
include Session
include Post
include Feed[Post.Post]
include TextToImage[Post.Post]
include Tag[Post.Post]
include Highlight[Post.Post]
sync register(name, password: String)
Authentication.register(name, password)
sync login(name, password: String)
when Authentication.authenticate(name, password, user)
Session.start(user)
sync logout(s: Session)
Session.end(s)
sync post(content: String, date: Highlight.Date)
when Post.addPost(content, post)
for user in Authentication:
Feed.addToFeed(post, user)
TextToImage.generateImage(post)
Highlight.addPost(date, post)
// put the tag of the current date to the post
// so filtering by date is just a tag lookup
Tag.setTagToItem(date, post)
sync filter(tags: set Tag)
Tag.allWithTag(tags, posts)
sync highlight(date: Highlight.Date)
Highlight.getHighlights(date, highlight)
app ADDapp
include Authentication
include Session
include Post
include Feed[Post.Post]
include TextToImage[Post.Post]
include Tag[Post.Post]
include Highlight[Post.Post]
sync register(name, password: String)
Authentication.register(name, password)
sync login(name, password: String)
when Authentication.authenticate(name, password, user)
Session.start(user)
sync logout(s: Session)
Session.end(s)
sync post(content: String, date: Highlight.Date)
when Post.addPost(content, post)
for user in Authentication:
Feed.addToFeed(post, user)
TextToImage.generateImage(post)
Highlight.addPost(date, post)
// put the tag of the current date to the post
// so filtering by date is just a tag lookup
Tag.setTagToItem(date, post)
sync filter(tags: set Tag)
Tag.allWithTag(tags, posts)
sync highlight(date: Highlight.Date)
Highlight.getHighlights(date, highlight)
Dependency diagram
Wireframes
Design tradeoffs
How big the elements should be
I caught myself struggling to decide the size of the elements on the screen. At the same time I wanted to include most features on a single page, so the user wouldn't need to hunt them down through paths in the website, I, as a person with ADHD, feel overwhelmed by a lot of options in the same place. I decided to make them big and visually easy to spot, compromising a bit the navigation (although I think I was able to make this better - the maximum depth an user have to go is 3).
Create or not a page for search
Since the filter feature is one of the app's main characteristics, I thought that I should create a new page for it so users can choose their filters in an extremely thorough way. It would also be an advantage visually, because the user wouldn't be overwhelmed by the other features appearing. However, I figured the user would have to use arrows to go back to the normal navigation, and the search would feel disconnected from the main app. I still wanted to show a bit of background or anything that could set up the environment like ADDapp. This way, the search is a drop-down menu (that can be expanded for more results) with the background blurry (diminishing visual pollution).
How to create reference to the recap feature
I didn't know if I would put a bell (like notification), a banner with posts switching views, a simple button, or the writing that I eventually picked. I preferred writing "Click here to see what you missed yesterday!" because it explicitly conveys the purpose (unlike the bell), and it does so in a non-invasive (like the banner) and friendly (unlike the button) way.