Building BiteBook - an Android food diary app

An Android app that helps you answer: "Where should we eat?"


Friend: What do you wanna eat?
You: I don't know. You decide.
Friend: Idk either. You got any cravings?
You: ¯\_(ツ)_/¯ idk bro

Man, this is hard, you think to yourself. Why is it so hard to decide?

I've lived here my whole life. I've eaten at hundreds, maybe even thousands of places here.

I should be able to think of something.


“Where do you want to eat?” is a question everyone has undoubtedly been asked countless times. Sometimes, the answer is trivial — in school, options are limited and its easy enough to arrive at an answer. But start planning for dates, special occasions, and this question quickly becomes not so simple.

Current solutions are clunky and unintuitive.

Searching “Food near me” on Google

Food blogs

Saving favourite places in lists or sending via telegram

Our solution

Now imagine this. What if you had a list of all the places you've ever eaten at before and enjoyed?

Organised by cuisine, area, price and rating — BiteBook makes it easy for you to remember where and what you've eaten, so you can make a more informed choice and enjoy every meal.

poster.png

BiteBook is a project that I worked on with my group members as part of the module 50.001 : Introduction To Information Systems & Programming as offered by SUTD.

poster.png

Our project was showcased during SUTD's ISTD annual design exhibition 2023 and we won Outstanding Project as recognition of our efforts.

Technical Details

Language: Java

Frontend: Android UI

Auth & DB: Firebase (Auth, Realtime DB, Storage)

Services: Google Play (Location/ Internal storage)

APIs: Google maps, Places (locations, restaurant metadata)


Java

Java is a preferred language for Android app development due to its OOP principles, allowing for reusable and scalable code. It's also platform-independent and has a vast developer community, making it a reliable choice for creating Android apps.

Firebase

We have been exposed to Firebase before in prior modules, and Firebase integration with Java and Android made the developer experience quite seamless. It was the obvious choice for a backend as it allows us to quickly get up and running, with tools and solutions for every backend aspect for our app.

Firebase Authentication

Firebase Realtime Database

Firebase Storage

Services & APIs

BiteBook makes use of Google Maps and Places API to improve the user experience.

Firstly, by using the Google Maps API, the app can access location services, which would allow users to view the restaurants around them on the map.

The Autocomplete API also makes inputting information much easier as users don’t have to type out the whole address.

Moreover, the integration of the Places API would provide metadata such as restaurant names, addresses, and contact information, which is essential for a restaurant-focused food diary application.

Screenshots & Walkthrough

Login & Signup

On launching, a user is greeted with a login screen that accepts username/password or Google one-click sign in.

pic
pic

Home Page

On login, the user is greeted with a homepage of all their entries, arranged chronologically to show recent entries. They can click the expand card option to view more details about each entry including price, location and cuisine type.

pic
pic

Add Page

The Add page is where users can input new entries. The location is autofilled using the Places API to make the experience more seamless and convenient. Users are allowed to input the restaurant name, what they ate, price, area & cuisine type. They can also optionally choose to include a photo or review.

pic

Decide Page

The decide page has 3 major functions:

pic
pic

Map page

We’ve also included a Map page that showcases all entries a user has saved. This gives a better perspective of the places that they’ve been to on a map and they can see nearby locations. They can click on markers to see where they’ve eaten and what they’ve eaten there. The directions button at the bottom also makes it easy for them to decide and navigate to the location.

pic
pic

Design Patterns

Singleton Design Principle

Our team decided to use Singletons in our Firebase Android app because we wanted to ensure that there is only a single instance of a class and that it's globally accessible. Specifically, we chose to use Singleton for database objects such as FirebaseDatabase or FirebaseAuth.

In Firebase, every time our app communicates with the server, it uses a lot of I/O operations, and creating multiple instances of these objects could lead to memory issues and lag in database response. Therefore, creating a Singleton allows access to these objects while maintaining their singular instance.

By only creating one instance of these objects throughout the lifetime of our app, we are optimizing for network latency, database performance, and app efficiency. This approach also makes our code a lot cleaner and more maintainable.

Separation of Concerns

We split our code up into bundles that serve specific purposes whenever we were able to. For instance, we created an Entry class with appropriate constructors and getters. This makes use of the principle of Encapsulation which we were taught in class.

By creating private variables and exposing them via public getters, we are able to limit access to class members and achieve data integrity — ensuring that only intended classes and objects are able to access and mutate data. This also helps in the context of working together as a group as it makes it easier for us to know what we should and should not do.

A FirebaseHelper class was also created to call the Auth and DB singletons. This allowed us to separate the data fetching from the data viewing, creating a barebones implementation of the MVC framework and making our codebase more maintainable.

VCS - GitHub

When collaborating on this project, our group also made use of git to track changes. This allows us to rollback in case of errors and to facilitate changes. Being able to see what each of our group members change in pull requests also makes it easier to cross check each others’ code and catch possible errors before they occur.

Dependencies

Our project uses few dependencies, mostly Google services and things related to the Map API. This ensures longevity as these dependencies are unlikely to be deprecated. The only dependency we used was the Picasso library to make working with bitmaps easier.

Possible Improvements

Social Element

Lists + Create own tags

More media options

Recommendations

Conclusion

I found this project to be immensely rewarding as it allowed us to apply our knowledge of Android programming to produce a tangible product. The end-to-end integration of our work, from ideation to prototyping and final product, was truly an iterative process that taught us invaluable skills and valuable lessons along the way. Through this project, we gained a deeper understanding of not only the technical aspects involved in Android app development but also the importance of effective communication and teamwork in achieving a common goal.

We were also able to showcase this to Singtel engineers, which served as a way of preparation for future code reviews and forces us to make decisions that we know we have to be able to justify and explain, leading to greater code quality.