An all-in-one travel planning application
Proposed level of achievement: Apollo 11
Click here to download the apk
When you are trying to plan your own trip, be it overseas or local, you realise you have been switching between numerous websites and applications, picking up bits and pieces of information from various places and trying to put everything together to form your itinerary.
Many may have reached the point where everything feels like a mess as the information you need is scattered around various sources. Furthermore, you don’t know where to get certain information from. So why isn't there a place where you can find and put all the information you need for your trip together, all organised in one place?
We hope to make trip planning processes simpler by bringing different aspects of trip planning all together in one application.
- As a person planning my own trip to a country, I would like to know what are the popular attractions and restaurants that I can visit during my trip.
- As a person planning my own trip to a country, I would like to plan an itinerary and have a comprehensive schedule that I can refer to.
- As a person planning my own trip to a country, I would like to have a place to write down relevant important information that I can refer to together with my itinerary.
- As a person planning my own trip to a country, I would like to know about the travelling time needed between locations when planning my itinerary for more efficient allocation of time.
- As a tourist guide, I would want to be able to write reviews for hotels, attractions and restaurants.
- As a local citizen, I would want to look up the reviews and ratings to decide leisure destinations during short public holidays.
- As a frequent traveller, I would like to share my travelling experiences with the public.
- A Scheduler allows users to arrange their itinerary during the trip and will be the main page of the application
- A Map feature will be provided for the users to search for locations on the map. Transportation methods will also be shown when searching for directions.
- A Hotel Search feature
- Attached with brief details such as description and address
- Links to websites for hotel bookings
- Users can post reviews and ratings of attractions
- An Attraction Search feature
- Attached with brief details such as descriptions and address
- Users can post reviews and ratings of the attractions
- A Restaurant Search feature
- Attached with brief details such as description and address
- Users can post reviews and ratings
- Checklist feature for users to check their to-do tasks or create a packing list.
- Notes provides a platform for users to write down any other information
- Displaying 5-day Weather Forecast for an area.
- Klook and Trip.com:
- Only shows the booking of different attractions and accommodations, without having a clear visible schedule for reference
- No link to map to show the location of the place, find directions and compare the distance between accommodations and attractions booked
- No feature to jot down important notes
- TripIt: Travel Planner
- A mobile application that creates itineraries
- Does not contain features that help users find suitable accommodation, attractions and restaurants
- Goals
- The application should be comprehensive to minimise the need to refer to other applications or websites when planning an itinerary. Thus, the features of the application should include most things that people need when planning an itinerary.
- User interface should be simple and easy to use.
- Assumptions
- It is assummed that the user will have connection to the internet.
- Constraints
- We are unable to obtain a datbase of hotels, attractions and restaurants. Thus, an API will be used to obtain information required.
The activity diagram shows the overview of the actions that users can take at various pages and the relationship between pages in the application.
Click here to view a walkthrough of the application.
- Android Studio
- Firebase
- Travel Advisor API
- Google Maps API
- OpenWeatherMap API
- Splash screen
- Delay for 2.5s before starting Login Activity
- Account System
- Link to Firebase Authentication: authentication using email and password
- New users need to set a username during sign up
- Write profile information to database: Profiles -> userID
- FirebaseAuth.AuthStateListener: If there is already a user signed in, application will skip login page when launched
- Navigation drawer
- Drawer Activity to manage the navigation drawer
- Features are contained in fragments
- Header displays profile information
- Profile picture and username: Read from database Profiles -> userID
- Email: FirebaseUser.getEmail()
- Itinerary screen
- Reads ItineraryItems from Firebase Realtime Database: Users -> userID -> Itinerary -> Date
- Display ItineraryItems in recycler view
- Add to itinerary button: add custom event dialog opens
- Select start and end time with timepicker dialog
- Check that duration is valid: end time is later than start time
- Check for overlapping itinerary: open confirmation dialog if there is overlap
- Write new ItineraryItem to database: Users -> userID -> Itinerary -> Date
- On click for events added through Accommodation, Attraction and Food features: check type and navigate to corresponding detail fragment
- On right swipe, users will open edit itinerary dialog
- Choose new date with DatePickerDialog
- Choose new timing with TimePickerDialog
- Cross ImageButton to cancel changes
- Update button for users to save changes
- Check that duration is valid: end time is later than start time
- Check for overlapping itinerary
- Change in date: get ItineraryItem from old database reference, add to new database reference, update fields and delete ItineraryItem at old reference
- No change in date: update time values
- On left swipe, users will open delete event confirmation dialog
- Confirm button for users to delete event from itinerary: removeValue() from database reference
- Search screen (AccommodationFragment, AttractionFragment and FoodFragment are subclasses of SearchFragment)
- SearchView for users to key in query location
- Make API call with Volley library
- Call Travel Advisor API location search to obtain a location ID
- Use ID to call Travel Advisor API hotel/restaurant/attraction list search
- Create new AccommodationItineraryItem, AttractionItineraryItem, FoodItineraryItem respectively (subclasses of ItineraryItem)
- Display search results in recycler view
- On click, corresponding itinerary item is passed to the corresponding details fragment in a bundle
- Details screen for Accommodation (AccommodationDetailFragment which is a subclass of DetailFragment)
- Navigation from search fragment:
- Retrieve AccommodationItineraryItem from bundle
- Call Travel Advisor API hotel details search using Volley library as there is some information that cannot be obtained from hotel list API call
- Set information obtained from call to AccommodationItineraryItem and details layout
- Add to itinerary floating action button: dialog opens
- Select start and end date with DatePickerDialog
- Select start and end time with TimePickerDialog
- Add button:
- Check that duration is valid: end is later than start
- Breakdown the time period according to the date: full day is from 00.00am to 11.59pm
- Check overlap and write AccommodationItineraryItem to database for each date: Users -> userID -> Itinerary -> Date
- Navigation from search fragment:
- Details screen for Attractions and Food (AttractionDetailFragment and FoodDetailFragment are subclasses of DetailFragment)
- Navigation from search fragment:
- Retrieve corresponding itinerary item from bundle
- Display information on details layout
- Add to itinerary floating action button: dialog opens
- Select date with DatePickerDialog
- Select start and end time with TimePickerDialog
- Check that duration is valid: end is later than start
- Check overlap and write corresponding AttractionItineraryItem, FoodItineraryItem (subclasses of ItineraryItem) to database: userID -> Itinerary -> Date
- Navigation from search fragment:
- Details screen for Accommodation, Attractions and Food
- Navigation from Itinerary
- Hide add to itinerary floating action button
- Read corresponding itinerary item from database: Users -> userID -> Itinerary -> Date
- Display information on details layout
- Read ReviewItems from database: Reviews -> locationID
- Display reviews with recycler view
- Read username and profile picture of user who wrote the review from database using userID in ReviewItem: Profiles -> userID
- Click username on review: pass userID in ReviewItem to ProfileFragment in a bundle
- Add reviews button: open add review dialog
- Set rating with rating bar
- Create new ReviewItem
- Write ReviewItem to database: Reviews -> locationID and Profiles -> userID -> Reviews
- Navigation from Itinerary
- Map screen
- SearchView for users to key in query location
- Call Maps SDK for Android to obtain latitude coordinates for query location
- Zoom in to location on map
- When users click the marker, directions button will appear and direct users to google map application to search for directions
- Notes screen
- Read NoteItems from database: Users -> userID -> notes
- Display in recycler view with note title and date it was last saved
- On click, corresponding NoteItem is passed to the NotesViewFragment in a bundle
- Add new note floating action button: open dialog
- User can key in title of new note
- Create new NoteItem with empty content
- Pass NoteItem to NotesViewFragment
- On right swipe: open edit note title dialog
- Edit button to save changes: update note title in database
- On left swipe: open delete note confirmation dialog
- Confirm button for users to delete note: removeValue() from database reference
- Notes View screen
- Read note content from database: Users- > userID -> Notes -> noteID
- Users can edit the text
- Save floating action button: Update NoteItem content on database
- Weather screen
- Get current location coordinates of user with FusedLocationProviderClient
- Use coordinates to call OpenWeatherMap API current weather data and onecall
- Display data on layout and 5-day forecast on recycler view
- Change city button: open change city dialog
- Call current weather data API with new city name to obtain current weather and coordinates of city
- Call onecall API with coordinates of city to obtain 5-day forecast
- Checklist screen
- Read ChecklistItems from database: Users -> userID -> Checklist
- Display in recycler view with task and checkbox
- Sorted with checked tasks at the bottom
- On change in checkbox status:
- Update database
- Sort list of ChecklistItems
- On right swipe: open edit task dialog
- Edit button to save changes: update task in database
- On left swipe: open delete task confirmation dialog
- Confirm button for users to delete task: removeValue() from database reference
- Profile screen
- User viewing their own profile:
- Read profile picture URL, username and reviews written from database: Profiles -> userID
- Get email from FirebaseUser
- Display reviews in recycler view and profile infomration on layout
- Edit profile button: open edit profile dialog
- Change profile picture button: launch gallery activity to get image uri
- Edit button:
- Save uri to Firebase Storage: images -> userID.jpg
- Obtain URL from Firebase Storage and save in database: Profiles -> userID -> image
- Update database with new username: Profiles -> userID -> username
- User viewing other users' profiles: navigation from review
- Read profile picture URL, username and reviews written from database: Profiles -> userID
- Hide user email and edit profile button
- Display reviews in recycler view
- User viewing their own profile:
The diagram above shows the structure of the Firebase Realtime Database. The main Users branch stores the information of each user: itinerary, notes and checklist. Only the user himself will have read and write access to the information stored in Users under their userID. Users' itineraries are stored as ItineraryItems. AccommodationItineraryItem, AttractionItineraryItem and FoodItineraryItem are subtypes of ItineraryItem and they inherit the fields of ItineraryItem. The Profiles branch stores information about each user that is available to all users. The Reviews branch stores reviews for locations based on their locationID.
System testing was carried out to check for bugs and ensure that the application runs smoothly. Test cases were planned based on the possible usage of the various features in the application.
Apart from testing the features, tests for the error messages and error prevention mechanisms were also carried out to ensure that the application runs smoothly. https://docs.google.com/document/d/1fr_anTTLY5FdYji6faao-MRCSdDYTrQDerVoqc1jDtM/edit?usp=sharing
- Travel Advisor API
- The search results obtained from the accommodation, attractions and food features depend on the Travel Advisor API. The results returned may not be up-to-date and may not be comprehensive. As a result, users might not be able to find some locations on the application. Therefore, there is the option for users to add custom events to their itinerary on the itinerary page.
- Reviews
- As we do not have a big user database to write reviews and gather ratings for our reviews database, most of the locations do not have reviews currently. The ratings shown for the locations are currently retrieved from the Travel Advisor API.
- Directions
- As we are unable to get access to the Directions API, the application currently does not have a directions feature where users can search for directions in the application. Users will be directed to the maps application on their phones to search for directions.
There are some improvements to the application that we thought of and gathered from user feedback. However, due to time constraints, we were unable to work on them.
- Markings on Calendar to indicate that there is itinerary for that date
- Directions function
- Placeholder for empty recycler views in itinerary, notes, checklist and search pages
User testing were carried out by us, before letting our friends try out the application. The general idea of the user testing was to have two different user groups, one being a tourist who wishes to use our app for their upcoming trip, and the other being a tour guide planning the trip for his or her tourist group. Reason behind splitting our user groups is that we would like to analyse whether our application is suitable for our different target groups, who have different objectives in mind when using our application. This will allow us to improve our application in a neater fashion, and our blindspots when designing the application could be better discovered when the users are only using the applications for a specific query.
The same apk and questionaire were given out to both groups.
For the "tour guide" group, we made an additional comment saying that they should try to fit in as many travel events as they can, while taking note that none of the events should overlap and they should take the travelling time into consideration by using the map function implemented.
For the "tourist" group, we asked them to pay more attention to the UI design of the application, and whether it was easy for them to execute the tasks that were given to them. A screenshot of the questionaire that was sent to them is attached below.
Week | Tasks |
---|---|
4 (31/5 - 6/6) |
|
5 (7/6 - 13/6) |
|
6 (14/6 - 20/6) |
|
7 (21/6 - 27/6) |
|
8 (28/6 - 4/7) |
|
9 (5/7 - 11/7) |
|
10 (12/7 - 18/7) |
|
11 (19/7 - 25/7) |
|