AMT Domentation
AMT Domentation
SUBMITTED TO
AFFIIATED TO
DEVELOPED BY : GUIDED BY :
STDENT NAME :SHAIKH NOORMOHAMMAD RASUL Mr. Swapnil S. Patil
ROLL NO.:2546512
SEAT NO. :
STDENT NAME :MAHANTY RITESH KEDARNATH
ROLL NO.:2546534
SEAT NO. :
STDENT NAME :ANISH SHAH ARJUN
ROLL NO.:2546536
SEAT NO. :
Acknowledgement
It gives us great pleasure in submitting this project entitled “Tour and Travel
Application” as a part of the curriculum of BCA (Semester V – Minor
Project).
We heartily thank our guide, Mr. Swapnil S. Patil, who was always there to
guide us through the preparation of the project. He is one of the major sources
behind the success of the project. We immensely appreciate the tips and insights
he has constantly given us during the project. It was an enormous pleasure to
work under his guidance.
We are thankful to the faculties of the institute for their constant guidance not
only during the project work but also throughout our academic journey.
Finally, we would like to thank our parents for their unconditional support
throughout the project. We also owe a special debt to our family and friends for
their blessings, encouragement, and motivation.
Index
Chapter 1: Introduction
Background of travel industry & online booking
Problem statement
Objectives
Scope
Chapter 5: Implementation
Frontend: Android Studio, XML layouts (Login screen, Signup, Home, Booking, Profile, Favorites)
Backend: Kotlin/Java + Firebase/SQLite for database management
Coding Standards & Snippets (important pieces like login validation, booking insert, favorites
add/remove, profile update)
Module descriptions:
o User Authentication (Login/Signup)
o Home Page (Tour Packages, Favorites,cart,Profile)
o Booking Module
o Profile Management
o Favorites Module
Chapter 6: Testing
Chapter 8: References
The travel and tourism industry is one of the fastest growing industries in the world and plays a crucial role
in economic development. According to the World Travel & Tourism Council (WTTC), the travel industry
contributes trillions of dollars to the global GDP every year and provides millions of jobs. Traditionally, the
process of booking tickets, hotels, and tour packages was manual. Customers had to visit travel agencies,
spend time comparing packages, and often had limited flexibility to customize their trips.
With the advancement of information technology, especially the internet and mobile devices, the industry
has undergone a significant digital transformation. Online travel agencies (OTAs) and booking applications
have revolutionized the way people plan their trips. Customers can now check availability, compare prices,
view images of destinations, and make bookings instantly.
Mobile applications, in particular, have taken this convenience further by offering 24/7 accessibility, faster
booking processes, real-time updates, and personalized travel recommendations. Major players such as
MakeMyTrip, Yatra, and ClearTrip dominate the Indian market, while global platforms like Expedia,
[Link], and TripAdvisor lead internationally.
In this competitive environment, our project, Tripoo – A Travel Booking Mobile Application, is designed
to provide a simple, efficient, and cost-effective platform for booking travel packages. The app is built
using Android Studio with Kotlin/Java and is supported by Firebase/SQLite for data storage. Unlike
many existing apps, it focuses on user-friendliness, personalization (favorites), and lightweight design
for smooth performance.
Although multiple online booking platforms are available, they still face some common issues:
1. Complex User Interface – Many apps are overloaded with features, advertisements, and pop-ups,
which makes navigation confusing, especially for first-time users.
2. Hidden Costs – Some travel platforms include hidden charges and convenience fees, which reduces
customer trust.
3. Limited Personalization – Users are unable to mark or save packages/destinations they are
interested in for future reference.
4. Connectivity Dependence – Most apps require high-speed internet for smooth usage. In areas with
low connectivity, performance drops drastically.
5. Data Security Concerns – Storing sensitive user data like email, phone number, and booking
history requires secure handling.
Considering these challenges, there is a need for an app that is easy to use, transparent, and secure. The
main problem we aim to solve is providing a hassle-free booking experience with essential features like
Login, Signup, Profile Management, Favorites, and Booking—without overwhelming the user with
unnecessary complexity.
1.3 Objectives
The objectives of the proposed system are as follows:
1. User Authentication – Provide secure login and signup functionality using Firebase Authentication
or local database support.
2. Travel Package Browsing – Enable users to view available destinations, hotels, and tour packages
with details and images.
3. Booking System – Allow users to confirm bookings easily with minimal steps.
4. Favorites Module – Provide an option to add destinations/packages to a favorites list for future
reference.
5. Profile Management – Allow users to view and update personal details like name, email, contact
number, and profile picture.
6. Data Storage – Maintain a reliable database of users and bookings using Firebase Realtime
Database or SQLite.
7. User-Friendly Interface – Build an attractive and intuitive user interface using XML layouts.
8. Performance and Security – Ensure smooth operation on low-end devices and secure handling of
user information.
9. Scalability – Design the system in such a way that new features like payment gateway integration,
chatbots, or AI-based suggestions can be added in the future.
1.4 Scope
The scope of this project can be divided into three categories: User Scope, Functional Scope, and
Technical Scope.
The application is targeted towards travelers who want a simple and effective mobile solution for
booking trips.
It can be used by students, professionals, and frequent travelers who need quick bookings at their
fingertips.
Frontend: Designed in Android Studio using XML layouts for screens such as Login, Signup,
Home, Booking, Favorites, and Profile.
Backend: Implemented using Kotlin/Java with Firebase/SQLite for database management.
Libraries: Glide for image loading, Google Maps API (optional future integration).
Platform Compatibility: Optimized for Android smartphones and tablets.
Architecture: Follows client-server design where the app acts as a client and database
(Firebase/SQLite) works as the server.
1.4.4 Future Enhancements
The project is designed with extensibility in mind. Possible future features include:
Conclusion
This chapter provided an introduction to the travel industry and the importance of online booking platforms.
It discussed the existing problems faced by travelers and how our project, Tripoo, aims to solve them
through a mobile-based travel booking system. The objectives and scope were defined clearly, ensuring that
the project remains focused, feasible, and scalable for future improvements.
Chapter 2: Literature Survey
2.1 Introduction
The rapid growth of mobile applications has significantly transformed the way people plan, book, and
manage their travel experiences. Traditional booking methods involving travel agents and physical offices
have largely been replaced by mobile-based travel apps. As smartphones have become more accessible,
travel apps now cater to a wide audience—offering flight bookings, hotel reservations, package tours, and
itinerary planning at the user’s fingertips.
To build a competitive and user-friendly travel booking application like Tripoo, it is essential to study
existing solutions, identify their limitations, and define how our system can offer a better alternative. This
chapter discusses popular travel applications, their limitations, and how the design and database of our
system address those gaps.
b) Yatra
c) ClearTrip
e) [Link]
Limitation Description
High Dependency on Most travel apps do not work without internet, which limits accessibility in remote
Internet areas.
No Local Data Caching Information like bookings, favorites, and packages is not available offline.
Performance Issues Heavy UI and remote API calls slow down the experience on budget devices.
Complex Architecture Use of complex backends increases the scope for bugs and network failures.
Privacy Concerns Data stored in cloud servers may raise privacy/security concerns for some users.
All user and package data is stored in SQLite, making it available even when offline.
Ensures fast access with minimal battery and memory consumption.
Data like packages, favorites, and cart items are available without internet.
Preloaded packages help users explore destinations without needing server responses.
Each core feature (Users, Packages, Favorites, Cart) is managed via its own table:
o users table handles login, signup, and profile updates.
o packages table holds preloaded tour and hotel data.
o favorites allows users to bookmark packages they like.
o cart manages booking pipeline with selected packages.
With toggleFavorite() and addToCart(), users can easily manage their preferred destinations.
Seamless storage and retrieval ensure smoother UX compared to remote-only apps.
Login and user authentication are handled locally via secure password checks in SQLite.
No sensitive user data is transmitted or stored in the cloud, reducing security risks.
On first install, default packages like Dubai, Rome, Paris, Maldives are inserted automatically via
insertDefaultPackages() method.
Makes the app usable instantly without needing server data.
Table
Fields
Name
id, title, location, price, duration, available, type, description, homeImage, images, flight, bookingDate,
packages
flightTime, flightPlace
2.7 Summary
The literature survey highlights that while leading travel booking apps provide rich features, they are often
over-engineered, cloud-dependent, and unfriendly to low-resource users or offline usage scenarios.
Simplicity,
Offline accessibility,
Secure local storage,
Fast performance using SQLite, and
Core features like login, booking, favorites, and profile management.
By leveraging local databases and avoiding heavy API calls, your application is ideal for users who need
fast, reliable, and accessible travel planning—especially in areas with limited internet connectivity.
Chapter 3: System Analysis
3.1 Introduction
System analysis involves understanding the functional and non-functional aspects of the proposed
application, analyzing feasibility, defining data structures, and identifying hardware and software
requirements. In this chapter, we analyze how the Tripoo travel booking system is designed to fulfill user
needs through modular components such as Login, Signup, Booking, Favorites, Profile Management, and
more.
Signup: Allows users to register with their name, phone, email, and password.
Login: Authenticates registered users by validating email and password from the SQLite users
table.
Validation: Input validation for correct format and non-empty fields.
Session Management: Keeps user logged in until manually logged out.
Users can view and edit profile details like name, photo, phone number, and password.
Profile picture path is stored in photoPath in the users table.
Update operations are executed using SQL UPDATE statements.
3.3.1 Performance
Fast database operations due to use of SQLite, which is lightweight and embedded.
Optimized UI rendering using RecyclerView, ViewHolder patterns, and image caching.
Smooth performance even on low-end Android devices.
3.3.2 Security
Passwords are stored locally in the database (for simplicity; hashing can be added in future versions).
Unique email enforcement ensures no duplicate users.
Local storage avoids cloud data leaks or unauthorized server access.
3.3.3 Usability
Simple UI makes the app operable by users with basic mobile experience.
App is self-contained and doesn't require training or support.
Works without internet for viewing packages, favorites, and cart items.
RAM 2 GB or higher
3.6.1 ArrayList
PackageModel and UserModel implement Serializable to allow data transfer between activities.
3.7 Summary
The system analysis reveals that Tripoo is a feature-rich, offline-capable, and user-friendly Android
application developed using SQLite and standard Android components. It focuses on:
Efficient performance
Seamless local data handling
Low development cost
Intuitive interface
Offline support
This analysis ensures that the system is both technically and operationally feasible and meets the goals
outlined in the project’s objectives.
Chapter 4: System Design
This chapter provides a comprehensive and detailed overview of the TripOO application's
design. It delves into the system's architecture, data management, and the flow of user interactions, all of
which are built on a robust, client-centric model. The design prioritizes a smooth, offline-first experience by
handling all core functionalities directly on the user's device using a local SQLite database.
System Architecture
The Tripoo app operates on a Single-Tier Client Architecture. This means the entire application—
including the user interface, business logic, and data storage—resides and functions on the Android device
itself. This design choice is a key differentiator, offering significant benefits in performance and reliability.
Android App (Client): The application is a self-contained unit composed of various activities and
fragments. These components handle all user interactions, from displaying package details to
managing form submissions. All actions, such as adding to a cart or favoriting an item, are processed
locally without making network requests.
Local Database (DBHelper Singleton): All persistent data is managed by the DBHelper class, which
serves as a singleton. This ensures that every part of the application uses the same database
connection, preventing data inconsistencies and resource conflicts. This single, centralized data layer
handles user authentication, package information, and all booking-related data.
Shared Preferences: For simple, temporary data like the user's login session, the app uses
SharedPreferences. This allows the application to remember a user's logged-in state even after the
app is closed and reopened.
This architecture guarantees that the app remains fully functional even in areas with poor or no network
connectivity. It offers a fast and responsive user experience but does not support real-time data
synchronization or multi-device access.
Data Flow Diagram (DFD)
The Data Flow Diagram illustrates how information moves through the application. It highlights the key
processes and their interactions with the database via the central DBHelper.
Level 0: Context Diagram This high-level view shows the TripOO App as a single process
interacting with the User, its only external entity. The user provides input (e.g., login credentials,
booking details) and receives output (e.g., package lists, booking confirmations).
Level 1: Core Processes This detailed diagram breaks down the system into its primary functional
areas and shows their relationship with the database. All processes—User Management, Package
Management, and Cart & Favorites Management—communicate with the DBHelper to read from
or write to the database tables.
ER Diagram (Entity-Relationship Diagram)
The ER Diagram visually represents the structure of your database, as defined in [Link]. It shows the
tables (entities) and the relationships between them.
users Table: Stores all user account information. The email field is marked as UNIQUE, ensuring
that each user has a distinct account.
packages Table: The master list of all available travel packages. This table is pre-populated with
default data to make the app ready to use immediately after installation.
favorites Table: This table stores a list of packages a user has marked as favorites. It's a simple,
flat table that holds a copy of the package details.
cart Table: This table stores packages that a user intends to book. It includes additional booking-
specific information like bookingDate and flightTime.
UI Design / Frontend Screenshots
The user interface is designed for simplicity and ease of use, following a clean, modern aesthetic. Here are
screenshots of the main screens that illustrate the app's frontend design and functionality.
1. Login Page
This is the entry point for existing users. The design is straightforward, with clear fields for email and
password. A button navigates users to the signup page if they don't have an account.
2. Signup Page
The signup page allows new users to create an account. It requires essential information like name, phone
number, email, and a password, with a confirmation field to prevent typos. The form includes validation to
ensure all fields are filled correctly.
3. Home Page
The home page is the central hub for discovering travel packages. It features a search bar at the top, a
horizontal list for Featured Packages, and a vertical list for Popular Packages. This layout allows users to
quickly browse a variety of options.
4. Package Detail Page
This is where a user finalizes a booking. The form is designed to be intuitive, collecting
necessary details like name, contact info, and preferred flight time. It includes payment options and a date
picker for easy selection.
6. Profile Page
The profile page gives users a dedicated space to manage their account. They can view their
personal information, update their profile picture, and securely change their password. A Logout button
provides a simple way to end the session.
Chapter 5: Implementation
This chapter outlines the implementation phase of the project, focusing on both frontend
and backend development. It describes the tools used, coding standards followed, and a breakdown of each
functional module with corresponding UI and logic flow.
Login Screen
Signup Screen
Home Page
Booking Screen
Favorites Screen
Profile Page
Technology Stack:
Activity_Login.xml
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Welcome Back!"
android:textColor="@color/white"
android:textStyle="bold"
android:textSize="35sp"
android:layout_centerInParent="true"/>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">
<EditText
android:id="@+id/emailEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:hint="Email"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:background="@drawable/bg_edittext"
android:padding="16dp"
android:inputType="textEmailAddress"
android:minHeight="50dp" />
<EditText
android:id="@+id/passwordEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="Password"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:background="@drawable/bg_edittext"
android:padding="16dp"
android:inputType="textPassword"
android:minHeight="50dp" />
<Button
android:id="@+id/loginButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Login"
android:layout_marginTop="20dp"
android:backgroundTint="@color/blue"
android:textColor="@android:color/white"
android:padding="12dp" />
<Button
android:id="@+id/goToSignupButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Don't have an account? Sign Up"
android:layout_marginTop="10dp"
android:backgroundTint="@color/blue"
android:textColor="@color/white"
android:padding="12dp" />
</LinearLayout>
</ScrollView>
</LinearLayout>
Activity_singup_xml
<LinearLayout xmlns:android="[Link]
xmlns:app="[Link]
xmlns:tools="[Link]
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity_signup">
<!-- 🔷 Top Half (Blue Background with Bottom Rounded Corners) -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="250sp"
android:background="@drawable/top_rounded_bg">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Explore Your Trips!"
android:textColor="#FFFFFF"
android:textSize="35sp"
android:textStyle="bold" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">
<EditText
android:id="@+id/nameEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Username"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:inputType="textPersonName"
android:background="@drawable/bg_edittext"
android:minHeight="50dp"
android:importantForAutofill="no"/>
<EditText
android:id="@+id/phoneEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="Phone"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:background="@drawable/bg_edittext"
android:inputType="phone"
android:minHeight="50dp" />
<EditText
android:id="@+id/emailEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="Email"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:background="@drawable/bg_edittext"
android:inputType="textEmailAddress"
android:minHeight="50dp" />
<EditText
android:id="@+id/passwordEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="Password"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:inputType="textPassword"
android:background="@drawable/bg_edittext"
android:minHeight="50dp" />
<EditText
android:id="@+id/pass2EditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="Confirm Password"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:background="@drawable/bg_edittext"
android:inputType="textPassword"
android:importantForAutofill="no"
android:minHeight="50dp" />
<Button
android:id="@+id/signupButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Sign Up"
android:layout_marginTop="20dp" />
<Button
android:id="@+id/goToLoginButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Already have an account? Login"
android:layout_marginTop="10dp" />
</LinearLayout>
</ScrollView>
</LinearLayout>
Activity_home.xml
<[Link] xmlns:android="[Link]
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:background="@color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<!-- 📝 Heading -->
<TextView
android:id="@+id/tvHeading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:textStyle="bold"
android:layout_marginTop="20sp"
android:textColor="@color/black"
android:layout_marginBottom="12dp" />
<EditText
android:id="@+id/etSearch"
android:layout_width="match_parent"
android:layout_height="48dp"
android:drawableStart="@drawable/ic_location"
android:drawablePadding="8dp"
android:background="@drawable/bg_edittext"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:textSize="18sp" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Featured Destinations"
android:textStyle="bold"
android:textSize="20sp"
android:layout_marginTop="20dp"
android:layout_marginBottom="8dp" />
<[Link]
android:id="@+id/rvFeatured"
android:layout_width="match_parent"
android:layout_height="212dp"
android:overScrollMode="never"
android:layoutDirection="ltr" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Popular Packages"
android:textStyle="bold"
android:textSize="20sp"
android:layout_marginTop="20dp"
android:layout_marginBottom="8dp" />
android:id="@+id/rvPopular"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
android:nestedScrollingEnabled="false" />
</LinearLayout>
</[Link]>
Activvity_favorite.xml
<LinearLayout xmlns:android="[Link]
xmlns:tools="[Link]
android:id="@+id/favLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".FavouriteFragment">
<TextView
android:id="@+id/favText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="350sp"
android:layout_gravity="center_horizontal"
android:visibility="gone" />
<[Link]
android:id="@+id/favRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"/>
</LinearLayout>
Activity_cart.xml
<TextView
android:id="@+id/cartText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Your Cart is Empty!"
android:layout_marginTop="10dp"
android:textSize="20sp"
android:textStyle="bold" />
<[Link]
android:id="@+id/recyclerCart"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
Activity_profile.xml
<ScrollView xmlns:android="[Link]
xmlns:card_view="[Link]
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="253dp"
android:background="@drawable/top_rounded_bg"
android:orientation="vertical"
android:padding="24dp"
android:paddingTop="40dp"
android:paddingBottom="40dp">
<TextView
android:id="@+id/profileHeading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dp"
android:text="Your Profile"
android:textColor="@android:color/white"
android:textSize="25sp"
android:textStyle="bold" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<ImageView
android:id="@+id/userPhoto"
android:layout_width="120dp"
android:layout_height="120dp"
android:background="@drawable/bg_circle_white"
android:clipToOutline="true"
android:contentDescription="User Photo"
android:outlineProvider="background"
android:scaleType="centerCrop"
android:src="@drawable/icon_placeholder" />
<ImageView
android:id="@+id/cameraIcon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="bottom|end"
android:layout_margin="3dp"
android:background="@drawable/bg_circle_white"
android:contentDescription="Change Photo"
android:elevation="4dp"
android:padding="6dp"
android:src="@drawable/icon_camera" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:indeterminate="true"
android:visibility="gone"
android:progressTint="@color/blue" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp"
android:background="@android:color/white">
<[Link]
android:layout_width="match_parent"
android:layout_height="45sp"
android:layout_marginBottom="16dp"
card_view:cardElevation="4dp"
card_view:cardCornerRadius="8dp"
android:padding="12dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:layout_width="30dp"
android:layout_height="30sp"
android:layout_marginLeft="10dp"
android:layout_marginEnd="12dp"
android:contentDescription="Name Icon"
android:src="@drawable/icon_user" />
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Name"
android:textColor="#000"
android:textSize="16sp" />
</LinearLayout>
</[Link]>
<[Link]
android:layout_width="match_parent"
android:layout_height="45sp"
android:layout_marginBottom="16dp"
card_view:cardElevation="4dp"
card_view:cardCornerRadius="8dp"
android:padding="12dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginEnd="12dp"
android:contentDescription="Phone Icon"
android:src="@drawable/icon_phone" />
<TextView
android:id="@+id/phoneTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Phone"
android:textColor="#000"
android:textSize="16sp" />
</LinearLayout>
</[Link]>
<[Link]
android:layout_width="match_parent"
android:layout_height="45sp"
android:layout_marginBottom="16dp"
card_view:cardElevation="4dp"
card_view:cardCornerRadius="8dp"
android:padding="12dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginEnd="12dp"
android:contentDescription="Email Icon"
android:src="@drawable/icon_mail" />
<TextView
android:id="@+id/emailTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Email"
android:textColor="#000"
android:textSize="16sp" />
</LinearLayout>
</[Link]>
<[Link]
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
card_view:cardElevation="4dp"
card_view:cardCornerRadius="8dp"
android:padding="12dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginEnd="10dp"
android:contentDescription="Password Icon"
android:padding="1dp"
android:src="@drawable/icon_password" />
<TextView
android:id="@+id/passwordTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="******"
android:textColor="#000"
android:textSize="16sp"
android:padding="12dp" />
<ImageView
android:id="@+id/editPasswordIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="Edit Password"
android:padding="4dp"
android:src="@drawable/icon_edit" />
</LinearLayout>
</[Link]>
<[Link]
android:id="@+id/aboutRow"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginBottom="16dp"
card_view:cardElevation="4dp"
card_view:cardCornerRadius="8dp"
android:clickable="true"
android:focusable="true"
android:padding="12dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:layout_width="30sp"
android:layout_height="30sp"
android:layout_marginEnd="10dp"
android:contentDescription="About Icon"
android:padding="2dp"
android:src="@drawable/ic_about" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="About"
android:textColor="#000"
android:textSize="16sp" />
</LinearLayout>
</[Link]>
<Button
android:id="@+id/logoutButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Logout"
android:layout_gravity="center"
android:backgroundTint="@color/blue"
android:textColor="@android:color/white"
android:layout_marginTop="20dp"
android:padding="12dp" />
</LinearLayout>
</LinearLayout>
</ScrollView>
5.2 Backend Development
The backend was implemented using Kotlin for logic and Firebase Authentication for login/signup.
SQLite was used as the local database for managing bookings, favorites, and user profiles.
Technologies Used:
Login Validation
Signup Functionality
Booking Insertion
Favorites Toggle
Profile Update
if ([Link]() || [Link]()) {
[Link](this, "Please enter all fields", Toast.LENGTH_SHORT).show()
return
}
[Link]().signInWithEmailAndPassword(email, password)
.addOnCompleteListener { task ->
if ([Link]) {
startActivity(Intent(this, HomeActivity::[Link]))
finish()
} else {
[Link](this, "Login failed: ${[Link]?.message}", Toast.LENGTH_LONG).show()
}
}
}
if (password != confirmPassword) {
[Link](this, "Passwords do not match", Toast.LENGTH_SHORT).show()
return
}
[Link]().createUserWithEmailAndPassword(email, password)
.addOnSuccessListener {
val user = [Link]().currentUser
val uid = user?.uid ?: return@addOnSuccessListener
val db = [Link]()
val userMap = hashMapOf(
"name" to name,
"phone" to phone,
"email" to email
)
[Link]("users").document(uid).set(userMap)
.addOnSuccessListener {
[Link](this, "Signup successful", Toast.LENGTH_SHORT).show()
startActivity(Intent(this, HomeActivity::[Link]))
finish()
}
}
.addOnFailureListener {
[Link](this, "Signup failed: ${[Link]}", Toast.LENGTH_LONG).show()
}
}
if (isFavorite) {
[Link](destinationId)
} else {
[Link](destinationId)
}
}
[Link]().collection("users").document(uid)
.update(updatedData)
.addOnSuccessListener {
[Link](this, "Profile updated", Toast.LENGTH_SHORT).show()
}
.addOnFailureListener {
[Link](this, "Failed to update profile", Toast.LENGTH_SHORT).show()
}
}
This module allows users to log in or register using their email and password. Firebase Authentication
handles user verification and session management.
[Link] [Link]
import [Link]
import [Link]
import [Link]
import [Link] // 🔹 Log import karein
import [Link]
import [Link]
import [Link]
import [Link]
// Initialize views
emailInput = findViewById([Link])
passwordInput = findViewById([Link])
loginButton = findViewById([Link])
goToSignupButton = findViewById([Link])
[Link] {
val email = [Link]().trim()
val password = [Link]().trim()
if ([Link]() || [Link]()) {
[Link](this, "Please enter email and password",
Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
[Link] {
val intent = Intent(this, SignupActivity::[Link])
startActivity(intent)
finish()
}
}
}
[Link]
package [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
[Link](savedInstanceState)
setContentView([Link].activity_signup)
nameInput = findViewById([Link])
phoneInput = findViewById([Link])
emailInput = findViewById([Link])
passwordInput = findViewById([Link])
confirmPasswordInput = findViewById([Link].pass2EditText)
signupButton = findViewById([Link])
goToLoginButton = findViewById([Link])
dbHelper = [Link](this)
[Link] {
[Link]() || [Link]()
){
return@setOnClickListener
if (password != confirmPassword) {
return@setOnClickListener
}
if ([Link] < 6) {
return@setOnClickListener
if (success) {
startActivity(Intent(this, LoginActivity::[Link]))
finish()
} else {
[Link] {
startActivity(Intent(this, LoginActivity::[Link]))
finish()
package [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
savedInstanceState: Bundle?
): View? {
recyclerViewFeatured = [Link]([Link])
recyclerViewPopular = [Link]([Link])
etSearch = [Link]([Link])
[Link] =
[Link] =
[Link] = false
dbHelper = DBHelper(requireContext())
favoriteManager = FavoriteManager(dbHelper)
if ([Link]().isEmpty()) {
insertInitialPackages()
allPackages = ArrayList([Link]())
[Link]()
[Link]([Link](4))
[Link]()
// Setup featuredAdapter
featuredAdapter = FeaturedAdapter(
filteredFeaturedList,
[Link]("package", packageModel)
startActivity(intent)
},
[Link](packageModel)
[Link]()
},
[Link] = featuredAdapter
popularAdapter = PopularAdapter(
filteredPopularList,
[Link]("package", packageModel)
startActivity(intent)
},
[Link](packageModel)
[Link]()
},
favoriteManager = favoriteManager
[Link] = popularAdapter
[Link](object : TextWatcher {
filterLists(query)
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
})
return view
[Link]()
[Link]()
if ([Link]()) {
[Link]([Link](4))
[Link]([Link](6))
} else {
[Link]().contains(query) || [Link]().contains(query)
[Link]([Link](4))
[Link]([Link](6))
[Link]()
[Link]()
PackageModel(
title = "Dubai", location = "United Arab Emirates", price = "$120", duration = "5 Days, 4 Nights",
available = "Jan - Dec 2025", type = "City Tour",
),
PackageModel(
title = "Rome", location = "Italy", price = "$150", duration = "4 Days, 3 Nights",
description = "Rome, the capital of Italy, is famous for its rich history...",
),
PackageModel(
title = "Paris", location = "France", price = "$180", duration = "3 Days, 2 Nights",
description = "Paris, known as the 'City of Light,' is famous for its romantic ambiance...",
),
PackageModel(
title = "Hotel Dubai Luxury", location = "Dubai", price = "$250 / night", duration = "4 Days, 3
Nights",
description = "Hotel Dubai Luxury offers an elegant and modern stay in the heart of Dubai...",
),
PackageModel(
title = "Beach Resort", location = "Maldives", price = "$300 / night", duration = "7 Days, 6
Nights",
description = "Beach Resort is a tranquil paradise located on pristine white sandy beaches...",
),
PackageModel(
title = "Paris Hotel", location = "France", price = "$220 / night", duration = "5 Days, 4 Nights",
description = "Paris Hotel offers an elegant stay in the heart of the city of love...",
[Link](pkg)
[Link]
package [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
import [Link]
// Adapter class
class PopularAdapter(
) : [Link]<[Link]>() {
[Link]([Link])
[Link] = [Link]
[Link] = [Link]
[Link] = [Link]
[Link](
[Link]([Link], colorRes),
[Link].SRC_IN
[Link] { onItemClick(item) }
[Link] {
onFavoriteToggle(item)
notifyItemChanged(position) // Refresh this item to update favorite icon color
Users can select a package, view its details, and book it. The data is inserted into the SQLite database, and
the booking screen confirms the details.
]:
if ([Link]) {
val upiId = [Link]()
if ([Link]()) {
confirmBooking(updatedPackage, "Booking Confirmed at $selectedFlightTime with UPI Payment")
} else {
[Link](this, "Please enter UPI ID", Toast.LENGTH_SHORT).show()
}
} else if ([Link]) {
confirmBooking(updatedPackage, "Booking Confirmed at $selectedFlightTime with QR
Code Payment")
} else {
[Link](this, "Please select payment option", Toast.LENGTH_SHORT).show()
}
} else {
[Link](this, "Please fill all details", Toast.LENGTH_SHORT).show()
}
}
To update the profile photo, the image is selected from the gallery, saved to internal storage, and its path is
stored in SQLite using:
[Link] = [Link]
try {
val inputStream: InputStream? = requireContext().[Link](uri)
val bitmap: Bitmap? = [Link](inputStream)
inputStream?.close()
if (bitmap == null) {
[Link](requireContext(), "Failed to decode image", Toast.LENGTH_SHORT).show()
[Link] = [Link]
return
}
All profile updates are persisted using the following DBHelper functions:
These methods execute SQL UPDATE queries and return a success boolean.
Users can mark/unmark tour packages as favorites by clicking the heart icon. The state is saved in SQLite
and displayed in the Favorites screen.
Below is the logic used to toggle (add/remove) a package from favorites, using FavoriteManager:
// Inside [Link]
� SQLite Persistence
Favorite data is persistently stored in SQLite, ensuring users' preferences are saved even after closing the
app.
🖼� UI Integration
The heart icon toggles between filled/unfilled state depending on favorite status.
RecyclerView (favRecyclerView) lists all favorites using FavouriteAdapter.
5.5 Summary
The implementation involved designing a responsive and interactive UI using XML and building backend
logic with Kotlin. Firebase ensures secure user management, while SQLite provides efficient local data
storage. All modules were developed with reusability and scalability in mind.
Chapter 6: Testing
Definition: Tests the application without looking at the internal code. Focuses on
input/output behavior.
Applied To:
o Login and Sign-up flows
o Profile update
o Favorites addition/removal
o Booking flow
o Logout process
Objective: Ensure that the application behaves as expected from a user perspective.
Definition: Tests the internal structure, logic, and code paths of the application.
Applied To:
o SQLite database queries (insert, update, delete)
o SharedPreferences logic
o Conditional checks (e.g., null values, validation)
Objective: Validate code execution paths and handle edge cases like null data, invalid
input, etc.
✅ Example Flow:
Login Test:
1. User logs in with valid credentials
2. DBHelper fetches correct user info
3. UI updates with fetched data
✅ Scenarios Covered:
Profile update Tap profile → Edit text fields → Updated values saved and
TC006 ✅ Pass
(Name/Phone) Save displayed
Tap camera icon → Pick from New image shown and saved
TC007 Profile photo update ✅ Pass
gallery → Confirm in SQLite
App relaunch after Kill app → Relaunch → Check User remains logged in and
TC010 ✅ Pass
login session data loaded
✅ Summary
Testing Technique Applied? Remarks
System Testing ✅ Yes App tested on multiple devices and Android versions
Chapter 7: Conclusion & Future Scope
7.1 Conclusion
The development of the travel booking application successfully met the outlined objectives by creating an
efficient, intuitive, and reliable platform that enhances the traditional process of travel planning and
booking. This project incorporated multiple essential features such as user authentication, profile
management, tour package browsing, favorites management, and booking history. These features work
cohesively to offer a seamless and personalized user experience.
By leveraging SQLite for local data storage and management, the application ensures data persistence and
security, providing users with the confidence that their booking history and preferences are maintained
reliably. The modular design and clean architecture of the app facilitate easy maintenance and scalability,
enabling future upgrades and feature additions without significant rework.
The inclusion of a favorites module allows users to mark preferred packages, thereby simplifying the search
process and enabling quicker access to commonly selected tours. Profile management empowers users to
update their personal details and profile photos, enhancing engagement and ownership over their accounts.
Testing phases, including unit, integration, and system testing, validated the app’s performance, stability,
and accuracy across different scenarios, confirming that the application meets the necessary quality
standards. The application effectively demonstrates the practical application of software engineering
principles and Android development skills.
Overall, this project contributes a meaningful solution to the travel industry by digitalizing and streamlining
the booking workflow, which can be particularly beneficial for users seeking a hassle-free method to plan
their trips.
7.2 Limitations
Despite its comprehensive feature set, the current version of the application has some inherent limitations
that provide scope for improvement:
One of the most significant limitations is the lack of integration with a payment gateway. Users cannot
complete transactions or make payments within the app, which limits the system’s usability to only booking
management rather than fully end-to-end travel booking. This restricts the app’s commercial viability as
users need to rely on external methods to finalize their bookings.
7.2.2 Limited Tour Package Catalog
The available tour packages are limited in both number and variety. This is primarily due to
initial project scope constraints and data availability. A wider and more diverse range of tours including
international destinations, thematic packages (e.g., adventure, cultural, eco-tourism), and seasonal offers
could significantly enhance user interest and retention.
While the interface is functional and user-friendly, it follows a minimalistic and straightforward design
approach. The lack of advanced animations, interactive elements, and modern UI trends may result in a less
engaging experience compared to competitive commercial apps. Improved UI/UX design is necessary to
attract and retain users.
Some features of the application require an active internet connection, such as fetching updated tour
packages and images. This may reduce usability for users in remote areas or regions with unstable network
access. Incorporating offline mode capabilities would improve accessibility.
The current authentication mechanism is basic, with no multi-factor authentication or encryption for
sensitive data beyond standard SQLite security. For enhanced security and compliance with privacy
standards, more robust authentication and data protection methods are necessary.
Implementing artificial intelligence and machine learning can provide personalized tour suggestions based
on user preferences, past bookings, browsing behavior, and seasonal trends. This will increase user
engagement by making the app more intuitive and responsive to individual needs.
To broaden the app’s user base globally, introducing multi-language support is critical. Providing
localization for popular languages such as Spanish, French, Mandarin, and Hindi would make the app
accessible to non-English speakers and enhance international usability.
Adding secure and trusted payment gateways like PayPal, Stripe, or native Google Pay will enable users to
complete transactions seamlessly within the app. This will make the app a one-stop solution for searching,
booking, and paying, significantly improving the overall user experience.
7.3.4 Chatbot and Virtual Assistant
Integrating a chatbot assistant can help users navigate the app, answer FAQs, resolve
booking issues, and even recommend packages dynamically. This will provide real-time assistance, improve
customer support, and reduce reliance on human agents.
Embedding Google Maps will allow users to visualize destinations, plan routes, and discover nearby points
of interest. Map-based features such as location markers, distance calculation, and route optimization will
add significant value.
Redesigning the UI with modern design principles—such as Material Design components, animations,
responsive layouts, and gesture-based navigation—can make the app more engaging and intuitive. Enhanced
accessibility features should also be included to cater to users with disabilities.
Developing offline capabilities, where users can access previously loaded tour packages, booking history,
and favorites without an internet connection, will improve reliability. Implementing data caching and
synchronization methods will enhance performance and usability in low-connectivity scenarios.
Implementing multi-factor authentication, biometric login (fingerprint or face recognition), and data
encryption will elevate the security standards of the application. This will protect user data and build trust,
especially for financial transactions post payment gateway integration.
7.4 Summary
In summary, this project lays a strong foundation for a scalable and user-centric travel booking application.
It combines essential functionalities with a straightforward design to deliver value to end users. While some
limitations exist, the roadmap for future enhancements is clear and promising. By incorporating advanced
technologies and expanding the app’s capabilities, this project has the potential to evolve into a
comprehensive travel companion, facilitating seamless trip planning and booking experiences for users
worldwide.
Chapter 8: References
This chapter documents all the key references, resources, and materials utilized during the development and
research of this project. These references provided foundational knowledge, technical guidance, and
practical solutions for implementing various features in the travel booking application.
Books and academic research papers were critical in understanding software engineering principles, mobile
application design, and user experience optimization. These works helped to guide the system architecture,
coding standards, and testing methodologies applied throughout the project.
The official Android documentation was the primary source of technical reference for all Android-specific
development tasks, including UI design, data storage, permissions management, and integrating third-party
libraries.
Firebase services were referenced extensively to integrate backend features such as authentication and cloud
data storage, ensuring scalability and real-time data syncing.
Firebase. Firebase Realtime Database Documentation.
Available at: [Link]
This documentation guided the implementation of real-time data updates and
synchronization for user bookings and package details.
Firebase. Firebase Authentication Documentation.
Available at: [Link]
Provided detailed instructions on integrating secure login and signup functionality using Firebase
Authentication, supporting email/password and third-party providers.
Firebase. Cloud Firestore Overview.
Offered an alternative to Realtime Database for flexible, scalable cloud storage solutions considered
during the app’s development.
Several reputable online platforms and community forums were used to solve specific programming
challenges, understand API usage, and follow tutorials for Android app development.
Summary
The combination of academic literature, official documentation, and community-driven resources enabled
the successful development of a feature-rich and robust travel booking application. These references not
only helped in technical implementation but also ensured adherence to industry standards and best practices.
Continuous learning and adaptation from these materials contributed significantly to the project’s overall
quality and usability.