diff --git a/1.png b/1.png
new file mode 100644
index 00000000..e8b02862
Binary files /dev/null and b/1.png differ
diff --git a/2.png b/2.png
new file mode 100644
index 00000000..78b97ae3
Binary files /dev/null and b/2.png differ
diff --git a/3.png b/3.png
new file mode 100644
index 00000000..0891b132
Binary files /dev/null and b/3.png differ
diff --git a/4.png b/4.png
new file mode 100644
index 00000000..981341b9
Binary files /dev/null and b/4.png differ
diff --git a/README.md b/README.md
index 877fb545..c5f8b2e5 100644
--- a/README.md
+++ b/README.md
@@ -1,32 +1,139 @@
-# Code-with-Google-Maps-2023 - Hack2skill
+# TRIPN
+
+
+
+
+ TRIPN
+
+
-Welcome to the official repository for the Code-with-Google-Maps-2023 organized by Hack2skill!
+Smart plan maker by the user choice!!
-## Getting Started
-To get started with the Code-with-Google-Maps-2023 repository, follow these steps:
+## About
-### Submission Instruction:
- 1. Fork this repository
- 2. Create a folder with your Team Name
- 3. Upload all the code and necessary files in the created folder
- 4. Upload a **README.md** file in your folder with the below mentioned informations.
- 5. Generate a Pull Request with your Team Name. (Example: submission-XYZ_team)
+This project was created for with Maps Hackathon
-### README.md must consist of the following information:
+## Video Presentation:
-#### Team Name -
-#### Problem Statement -
-#### Team Leader Email -
+- [Youtube](https://youtu.be/lt8JlCf0XDs)
-### A Brief of the Prototype:
- This section must include UML Diagrams and prototype description
+## Apk Download:
+
+- [Tripn](https://drive.google.com/file/d/1HwsJDHB45no_icQoOCBjdI-Kq6y2Fsdp/view?usp=drive_link)
+## Team Name:
+Mark-10
+## Team Members:
+
+- [Goutham C Arun](https://github.com/GouthamCArun)
+- [Alfred Jimmy](https://github.com/alffy007)
+- [Athul Babu](https://github.com/ATHULB04)
+
+## Team Leader Email
+
+-gouthamchennamakkal@gmail.com
+
+
+ Problem Statement •
+ Solution •
+ Tech-Stacks used •
+ Backend Repo •
+
+
+
-### Tech Stack:
- List Down all technologies used to Build the prototype
-
+
+
+
+
+## The Problem We Solve: Time is precious; let's automate your adventures, no travel time calculations needed..
+"Planning outings is time-consuming, and people often face the challenge of choosing destinations and calculating travel times. We need an AI solution to recommend suitable places to visit based on a user's available time and preferences, simplifying planning and enabling users to maximize their leisure time."
+
+## Solution: Elevate your outings, make traveling easy, and reclaim time for unforgettable adventures.
+Our product will have the following features:
+
+### 1. Plan trip base on user need
+-Trip Planning: The core feature allows users to plan their trips based on their preferences and needs. This feature will consider factors like available time, interests, and location.
+
+### 2. Different Rrestaurants and other services are shown in the plans.
+- The app will provide a diverse range of recommendations, including restaurants and other services, to enhance the user's travel experience.
+
+
+### 3.Include brief descriptions with each recommendation to give users more information about the suggested places, helping them make informed decisions.
+- To help users make informed decisions, the app will include brief descriptions of the suggested places. These descriptions will offer valuable information about the recommended locations, making it easier for users to choose their destinations.
+
+Tripn Descriptions:
+
+An AI-driven service app for generates personalized trip plans, showcasing various restaurants and services, while also providing informative place descriptions for user convenience.
+
+### Railway for Hosting
+Furthermore, for hosting our project, we chose Railway. Railway is a cloud platform that simplifies the deployment and management of web applications. By utilizing Railway for hosting, we were able to easily deploy our project and make it accessible to users over the internet. Railway's user-friendly interface and seamless setup process allowed us to integrate our project with their platform effortlessly. With Railway, we benefit from reliable hosting infrastructure and automatic scaling, ensuring that our application can handle incoming traffic effectively.
+
+
+
+ This is How it works
+
+
+
+
+
+
Google APi Key Used/h3>
+
+
+
+
+
+
+
+ ScreenShots of our app
+
+
+
+
+### TECH STACKS USED
+
+
+ 1. Flutter
+
+ 2.ChatGPT with LangChain
+
+ 4. Flask Rest API (Backend for API calls)
+
+ 5. Railway
+
+
+### FUTURE SCOPE
+
+*Travel Made Simple:*
+ With TripN, just tell us what you need, and we'll plan and book everything – from transport to accommodation. Your perfect trip, hassle-free.
+ Meet TripN, your virtual travel companion. Just like a trusted friend, it offers guidance, advice, and information for a stress-free and enjoyable journey.
+
### Step-by-Step Code Execution Instructions:
- This Section must contain a set of instructions required to clone and run the prototype so that it can be tested and deeply analyzed
-
-### Future Scope:
- Write about the scalability and futuristic aspects of the prototype developed
+## backend
+1. Create a virtual environment:
+ ```bash
+ cd backend
+ python -m venv env
+ source env/Scripts/./Activate.ps1
+ ```
+
+2. Install the dependencies
+ ```bash
+ pip install -r requirements.txt
+
+3. Start the development server:
+ ```bash
+ python main.py
+
+4. Access the API in your browser at http://127.0.0.1:6000/text.
+ ```bash
+ example of post request:
+ {"text":"I have no office today where can I go from 8 am to 5 pm. I wanna chill",
+ "address": "Govt.Model Engineering College, Thrikakara",
+ "latitude": "10.02817195",
+ "longitude": "76.32843611331214"}
+
diff --git a/api.png b/api.png
new file mode 100644
index 00000000..c71f0526
Binary files /dev/null and b/api.png differ
diff --git a/backend-flask/map/.gitignore b/backend-flask/map/.gitignore
new file mode 100644
index 00000000..e45cd7ad
--- /dev/null
+++ b/backend-flask/map/.gitignore
@@ -0,0 +1,159 @@
+
+# Created by https://www.toptal.com/developers/gitignore/api/python
+# Edit at https://www.toptal.com/developers/gitignore?templates=python
+
+### Python ###
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coveage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+pytestdebug.log
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+doc/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+pythonenv*
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# profiling data
+.prof
+
+# Virtualenv
+# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
+.Python
+[Bb]in
+[Ii]nclude
+[Ll]ib
+[Ll]ib64
+[Ll]ocal
+[Ss]cripts
+pyvenv.cfg
+.venv
+pip-selfcheck.json
+
+
+# End of https://www.toptal.com/developers/gitignore/api/python
diff --git a/backend-flask/map/Procfile b/backend-flask/map/Procfile
new file mode 100644
index 00000000..19452012
--- /dev/null
+++ b/backend-flask/map/Procfile
@@ -0,0 +1 @@
+web: gunicorn main:app
diff --git a/backend-flask/map/finaltest.py b/backend-flask/map/finaltest.py
new file mode 100644
index 00000000..5d9c2c83
--- /dev/null
+++ b/backend-flask/map/finaltest.py
@@ -0,0 +1,491 @@
+import requests
+import googlemaps
+from math import cos, radians
+import os
+import ast
+from langchain.schema import HumanMessage
+from langchain.chat_models import ChatOpenAI
+
+os.environ["OPENAI_API_KEY"] = os.environ.get('OPENAI_API_KEY')
+os.environ["API_KEY"] = os.environ.get('API_KEY')
+api_key=os.environ.get('API_KEY')
+
+def text_evaluator_prompt_maker(transcribed_txt, start_address, lat, lng):
+ instructions = """You are a text evaluator. Your duty is to analyze the text and return the time he wants to go in railway time.
+ and hours he is free.
+ You must only return a list, no sentences.
+ also return the time in 24-hour format with a '.' not a ':'. i.e., if it's 13:00, return 13.00.
+ Return a list like this [start_time, end_time, free hours].
+ """
+
+ data = str(transcribed_txt)
+ question = f"Give me a list in this format [start_time, end_time, free hours]."
+ prompt = instructions + data + question
+ return text_evaluator_ask_gpt(prompt, start_address, lat, lng)
+
+def text_evaluator_ask_gpt(prompt, start_address, lat, lng):
+ chat_model = ChatOpenAI(temperature=0.0, model='gpt-3.5-turbo', openai_api_key=os.environ.get("OPENAI_API_KEY"), max_tokens=250, stop=["\n"])
+ output = chat_model([HumanMessage(content=prompt)])
+ response = output.content
+ parsed_list = ast.literal_eval(response)
+ # print(parsed_list)
+ # print(type(parsed_list))
+ return plan_travel(api_key, start_address,parsed_list[0],parsed_list[1], lat, lng,parsed_list[2])
+
+def get_farthest_best_place(api_key, lat, lng, radius, num_results, place_type, keyword):
+ url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json'
+ params = {
+ 'location': f'{lat},{lng}',
+ 'radius': radius,
+ 'key': api_key,
+ 'keyword': keyword,
+ 'name': place_type,
+ }
+
+ response = requests.get(url, params=params)
+
+ if response.status_code == 200:
+ data = response.json()
+ results = data.get('results', [])
+
+ if results:
+
+ def custom_sort(place):
+ rating = place.get('rating', 0)
+
+
+ categories = place.get('types', [])
+ if any(category in categories for category in ['park', 'nature_reserve', 'scenic_lookout']):
+ rating += 0.15
+
+
+ lat2 = place['geometry']['location']['lat']
+ lng2 = place['geometry']['location']['lng']
+ distance = ((lat - lat2) ** 2 + (lng - lng2) ** 2) ** 0.5
+
+
+ return (-rating, distance, place['name'])
+
+ sorted_results = sorted(results, key=custom_sort)
+
+ top_places = []
+ for i, place in enumerate(sorted_results[:num_results]):
+ name = place['name']
+ rating = place.get('rating', 'Rating not available')
+ address = place.get('vicinity', 'Address not available')
+ lat = place['geometry']['location']['lat'] # Get latitude
+ lng = place['geometry']['location']['lng']
+ place_info = {
+ 'name': name,
+ 'rating': rating,
+ 'address': address,
+ 'lat': lat,
+ 'lng': lng,
+ }
+ top_places.append(place_info)
+ # print(top_places)
+ return top_places
+ else:
+ return []
+
+ else:
+ print('Error in the API request. Status code:', response.status_code)
+ return []
+
+
+def get_top_places_between(api_key, start_address, end_address):
+ gmaps = googlemaps.Client(key=api_key)
+
+ geocode_start = gmaps.geocode(start_address)
+ geocode_end = gmaps.geocode(end_address)
+
+ if geocode_start and geocode_end:
+ start_lat = geocode_start[0]['geometry']['location']['lat']
+ start_lng = geocode_start[0]['geometry']['location']['lng']
+ end_lat = geocode_end[0]['geometry']['location']['lat']
+ end_lng = geocode_end[0]['geometry']['location']['lng']
+
+ num_points = 10
+
+ start_latitude_in_radians = radians(start_lat)
+ one_degree_in_km = 1 / ((111.32 * 1000) * cos(start_latitude_in_radians))
+ min_distance_in_degrees = 0.02
+ places_along_route = []
+
+ for i in range(1, num_points + 1):
+ intermediate_lat = start_lat + i * (end_lat - start_lat) / (num_points + 1)
+ intermediate_lng = start_lng + i * (end_lng - start_lng) / (num_points + 1)
+ distance_from_start = ((intermediate_lat - start_lat) ** 2 + (intermediate_lng - start_lng) ** 2) ** 0.5
+ distance_from_end = ((intermediate_lat - end_lat) ** 2 + (intermediate_lng - end_lng) ** 2) ** 0.5
+
+ if (
+ distance_from_start >= min_distance_in_degrees
+ and distance_from_end >= min_distance_in_degrees
+ ):
+ midpoint_lat = intermediate_lat
+ midpoint_lng = intermediate_lng
+ radius = 2000
+ place_type = 'nature|entertainment|zoo|museum|theater|cinema|amusement park|art gallery|scenic lookout|shopping mall'
+ keyword = "tourist attraction|sightseeing|shopping|entertainment|mall's"
+
+ params = {
+ 'location': (midpoint_lat, midpoint_lng),
+ 'radius': radius,
+ 'type': place_type,
+ 'keyword': keyword,
+ }
+
+ places = gmaps.places_nearby(**params)
+
+ if 'results' in places:
+ places_along_route.extend(places['results'])
+
+ if places_along_route:
+ def custom_sort(place):
+ rating = place.get('rating', 0)
+ categories = place.get('types', [])
+ if any(category in categories for category in ['park', 'nature_reserve', 'scenic_lookout']):
+ rating += 0.15
+ return rating
+
+ sorted_places_by_rating = sorted(places_along_route, key=custom_sort, reverse=True)
+
+ top_10_places = []
+ added_places = set() # Set to track added places
+
+ for i, place in enumerate(sorted_places_by_rating):
+ name = place.get('name', 'Name not available')
+ rating = place.get('rating', 'Rating not available')
+ address = place.get('vicinity', 'Address not available')
+ lat = place['geometry']['location']['lat'] # Get latitude
+ lng = place['geometry']['location']['lng']
+
+ # Create a unique identifier for the place
+ place_identifier = f"{name}-{rating}-{address}"
+
+ if place_identifier not in added_places:
+ place_info = {'name': name, 'rating': rating, 'address': address, 'lat': lat, 'lng': lng}
+ top_10_places.append(place_info)
+ added_places.add(place_identifier)
+ if len(top_10_places) == 10:
+ break
+
+ place_info_list = top_10_places
+
+ if place_info_list:
+ return place_info_list
+ else:
+ return []
+ else:
+ return []
+ else:
+ return []
+
+
+def get_travel_time(api_key, start_address, destination_address):
+
+ gmaps = googlemaps.Client(key=api_key)
+
+ geocode_result_start = gmaps.geocode(start_address)
+ if not geocode_result_start:
+ return "Error: Starting address not found"
+
+ start_location = geocode_result_start[0]['geometry']['location']
+ start_lat = start_location['lat']
+ start_lng = start_location['lng']
+
+ geocode_result_destination = gmaps.geocode(destination_address)
+ if not geocode_result_destination:
+ return "Error: Destination address not found"
+
+ destination_location = geocode_result_destination[0]['geometry']['location']
+ destination_lat = destination_location['lat']
+ destination_lng = destination_location['lng']
+
+ params = {
+ 'origins': f'{start_lat},{start_lng}',
+ 'destinations': f'{destination_lat},{destination_lng}',
+ 'departure_time': 'now',
+ 'mode': 'driving',
+ }
+
+ response = gmaps.distance_matrix(**params)
+
+ if response['status'] == 'OK':
+ duration_in_seconds = response['rows'][0]['elements'][0]['duration_in_traffic']['value']
+ duration_in_hours = duration_in_seconds / 3600.0
+ formatted_duration = f"{duration_in_hours:.3f}"
+ return formatted_duration
+
+ return "Error: Unable to calculate travel time"
+def get_place_photo(api_key, place_name):
+ gmaps = googlemaps.Client(key=api_key)
+ places = gmaps.places(place_name)
+
+ if places['status'] == 'OK' and len(places['results']) > 0:
+ place_id = places['results'][0]['place_id']
+ photos = gmaps.place(place_id, fields=['photo'])
+
+ if 'photos' in photos['result']:
+ photo_reference = photos['result']['photos'][0]['photo_reference']
+ photo_url = f"https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference={photo_reference}&key={api_key}"
+ return photo_url
+ else:
+ return None
+ else:
+ return None
+
+def find_restaurant(api_key, start_location, end_location):
+ gmaps = googlemaps.Client(key=api_key)
+
+ geocode_start = gmaps.geocode(start_location)
+ geocode_end = gmaps.geocode(end_location)
+
+ if geocode_start and geocode_end:
+ start_lat = geocode_start[0]['geometry']['location']['lat']
+ start_lng = geocode_start[0]['geometry']['location']['lng']
+ end_lat = geocode_end[0]['geometry']['location']['lat']
+ end_lng = geocode_end[0]['geometry']['location']['lng']
+
+ midpoint_lat = (start_lat + end_lat) / 2
+ midpoint_lng = (start_lng + end_lng) / 2
+
+ radius = 1000 # Set the radius to 1000 meters
+ place_type = 'restaurant'
+ keyword = 'food'
+
+ params = {
+ 'location': (midpoint_lat, midpoint_lng),
+ 'radius': radius,
+ 'type': place_type,
+ 'keyword': keyword,
+ }
+
+ places = gmaps.places_nearby(**params)
+
+ if 'results' in places:
+ # Sort places based on rating in descending order
+ sorted_places = sorted(places['results'], key=lambda x: x.get('rating', 0), reverse=True)
+
+ if sorted_places:
+ place = sorted_places[0] # Get the top-rated restaurant
+ name = place.get('name', 'Name not available')
+ rating = place.get('rating', 'Rating not available')
+ address = place.get('vicinity', 'Address not available')
+ lat = place['geometry']['location']['lat'] # Get latitude
+ lng = place['geometry']['location']['lng']
+
+ return {
+ 'name': name,
+ 'rating': rating,
+ 'address': address,
+ 'lat': lat,
+ 'lng': lng
+
+ }
+ else:
+ return {'error': 'No restaurants found along the route.'}
+ else:
+ return {'error': 'No restaurants found along the route.'}
+ else:
+ return {'error': 'Error in geocoding the starting or ending location'}
+def description_prompt_maker(place):
+ instructions = """You are a travel assistant .You duty is to give one line descripion of place that user ask for.
+ Your description must be in one line.
+ """
+
+ data = str(place)
+ question = f"Give me a one line description of {place}."
+ prompt = instructions + data + question
+ return description_ask_gpt(prompt)
+
+def description_ask_gpt(prompt):
+ chat_model = ChatOpenAI(temperature=0.0, model='gpt-3.5-turbo', openai_api_key=os.environ.get("OPENAI_API_KEY"), max_tokens=250, stop=["\n"])
+ output = chat_model([HumanMessage(content=prompt)])
+ response = output.content
+ return response
+
+def plan_travel(api_key, start_address, start_time,end_time,lat, lng,available_time):
+ plan=[]
+ tea = 0
+ breakfast = 0
+ lunch = 0
+ dinner = 0
+ place_type = 'park|zoo|museum|theater|cinema|amusement park|art gallery|nature reserve|scenic lookout|shopping mall'
+ keyword = 'tourist attraction|sightseeing|shopping|entertainment'
+ speed=40
+ num_results=1
+ radius=available_time*speed*1000
+ # print("radius",radius)
+ top_places = get_farthest_best_place(api_key, lat, lng, radius, num_results, place_type, keyword)
+ # print("top places",top_places)
+ end_address = top_places[0]['name'] +","+ top_places[0]['address']
+ # print("end adress",end_address)
+ time_for_final = get_travel_time(api_key, start_address, end_address)
+ # print("time for final",time_for_final)
+ n_available_time = float(float(available_time) - (2 * float(time_for_final)))
+ c_time=end_time-2*float(time_for_final)
+ # print(c_time)
+ # print("n_available_time",n_available_time)
+ while (n_available_time < 0):
+ speed=speed-10
+ radius=available_time*speed*1000
+ top_places = get_farthest_best_place(api_key, lat, lng, radius, num_results, place_type, keyword)
+ end_address = top_places[0]['name'] +","+ top_places[0]['address']
+ time_for_final = get_travel_time(api_key, start_address, end_address)
+ n_available_time = float(float(available_time) - (2 * float(time_for_final)))
+ # print("n_available_time",n_available_time)
+ if n_available_time >= 0.5:
+ # print("if")
+ places_between = get_top_places_between(api_key, start_address, end_address)
+ print("places between",places_between)
+ # print("first place is ",places_between[1]['name'] + "," +places_between[1]['address'])
+ t = get_travel_time(api_key, start_address, places_between[1]['name'] + "," +places_between[1]['address'])
+ # print("t",t)
+ e_t = float(float(start_time) + float(t))
+ # restaurant = find_restaurant(api_key, start_address, places_between[1]['name'] + "," +places_between[1]['address'])
+ place_data = {'name': places_between[1]['name'], 'rating': places_between[1]['rating'], 'address': places_between[1]['address'],'lat':places_between[1]['lat'],'lng':places_between[1]['lng'], 'stime': start_time, 'etime': e_t, 'ttime': t, 'type': 'travel'}
+ n_available_time = float(float(n_available_time) - float(t))
+ plan.append(place_data)
+ i = 1
+
+ # print("plan is ",plan)
+
+ while n_available_time > 0 and i < len(places_between) and (plan[i-1]['stime'] 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ n_available_time = float(float(n_available_time) - float(t))
+ if n_available_time > 0:
+ place_data = {'name': places_between[i]['name'], 'rating': places_between[i]['rating'], 'address': places_between[i]['address'],'lat':places_between[i]['lat'],'lng':places_between[i]['lng'], 'stime': start_time, 'etime': e_t, 'ttime': t, 'type': 'travel'}
+ plan.append(place_data)
+ if (float(e_t) > 16.30 and float(e_t)< 17.30 and tea == 0):
+ restaurant = find_restaurant(api_key, plan[i]['name'] + plan[i]['address'], places_between[i + 1]['name'] + places_between[i + 1]['address'])
+ rt = get_travel_time(api_key, plan[i]['name'] + plan[i]['address'], restaurant['name'] + restaurant['address'])
+ e_t = float(float(plan[i]['etime']) + 0.5)
+ fractional_part = float(e_t)- int(e_t)
+ if (fractional_part> 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ place_data = {'name': restaurant['name'], 'rating': restaurant['rating'], 'address': restaurant['address'],'lat':restaurant['lat'],'lng':restaurant['lng'], 'stime': plan[i]['etime'], 'etime': e_t, 'ttime': rt, 'type': 'restaurant'}
+ plan.append(place_data)
+ n_available_time = float(float(n_available_time) - 0.5)
+ tea = 1
+ if (float(e_t) > 9 and float(e_t)<10 and breakfast == 0):
+ restaurant = find_restaurant(api_key, plan[i]['name'] + plan[i]['address'], places_between[i + 1]['name'] + places_between[i + 1]['address'])
+
+ rt = get_travel_time(api_key, plan[i]['name'] + plan[i]['address'], restaurant['name'] + ","+ restaurant['address'])
+ e_t = float(float(plan[i]['etime']) + 0.5)
+ fractional_part = float(e_t)- int(e_t)
+ if (fractional_part> 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ place_data = {'name': restaurant['name'], 'rating': restaurant['rating'], 'address': restaurant['address'],'lat':restaurant['lat'],'lng':restaurant['lng'], 'stime': plan[i]['etime'], 'etime': e_t, 'ttime': rt, 'type': 'restaurant'}
+ plan.append(place_data)
+ n_available_time = float(float(n_available_time) - 0.5)
+ breakfast = 1
+ if (float(e_t) > 13.00 and float(e_t) > 14.00 and lunch == 0):
+ restaurant = find_restaurant(api_key, plan[i]['name'] + plan[i]['address'], places_between[i + 1]['name'] + places_between[i + 1]['address'])
+ rt = get_travel_time(api_key, plan[i]['name'] + plan[i]['address'], restaurant['name'] + restaurant['address'])
+ e_t = float(float(plan[i]['etime']) + 0.5)
+ fractional_part = float(e_t)- int(e_t)
+ if (fractional_part> 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ place_data = {'name': restaurant['name'], 'rating': restaurant['rating'], 'address': restaurant['address'],'lat':restaurant['lat'],'lng':restaurant['lng'], 'stime': plan[i]['etime'], 'etime': e_t, 'ttime': rt, 'type': 'restaurant'}
+ plan.append(place_data)
+ n_available_time = float(float(n_available_time) - 0.5)
+ lunch = 1
+ if (float(e_t) > 20.00 and float(e_t) > 21.00 and dinner == 0):
+ restaurant = find_restaurant(api_key, plan[i]['name'] + plan[i]['address'], places_between[i + 1]['name'] + places_between[i + 1]['address'])
+ rt = get_travel_time(api_key, plan[i]['name'] + plan[i]['address'], restaurant['name'] + restaurant['address'])
+ e_t = float(float(plan[i]['etime']) + 0.5)
+ fractional_part = float(e_t)- int(e_t)
+ if (fractional_part> 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ place_data = {'name': restaurant['name'], 'rating': restaurant['rating'], 'address': restaurant['address'],'lat':restaurant['lat'],'lng':restaurant['lng'], 'stime': plan[i]['etime'], 'etime': e_t, 'ttime': rt, 'type': 'restaurant'}
+ plan.append(place_data)
+ n_available_time = float(float(n_available_time) - 0.5)
+ dinner = 1
+ i += 1
+
+ t = get_travel_time(api_key, plan[i - 2]['name'] + plan[i - 2]['address'], top_places[0]['name'] + top_places[0]['address'])
+ place_data = {'name': top_places[0]['name'], 'rating': top_places[0]['rating'], 'address': top_places[0]['address'],'lat':top_places[0]['lat'],'lng':top_places[0]['lng'], 'stime': plan[i - 2]['etime'], 'ttime': t, 'type': 'travel'}
+ plan.append(place_data)
+ else:
+ # print(top_places)
+ # print(n_available_time)
+ # print(end_address)
+ # print("else")
+ time_for_final = get_travel_time(api_key, start_address, end_address)
+ e_t = float(float(start_time) + float(time_for_final))
+ # print(e_t)
+ place_data = {'name': top_places[0]['name'], 'rating': top_places[0]['rating'], 'address': top_places[0]['address'], 'lat':top_places[0]['lat'],'lng':top_places[0]['lng'],'stime': start_time,'etime': e_t, 'ttime': time_for_final, 'type': 'travel'}
+ plan.append(place_data)
+
+ if n_available_time > 0:
+ if (float(e_t) > 16.30 and float(e_t)< 17.30 and tea == 0):
+ restaurant = find_restaurant(api_key, plan[0]['name'] + ","+ plan[0]['address'],start_address)
+ # print("rest",restaurant)
+ rt = get_travel_time(api_key, plan[0]['name'] + plan[0]['address'], restaurant['name'] + restaurant['address'])
+ e_t = float(float(plan[0]['etime']) + 0.5)
+ fractional_part = float(e_t)- int(e_t)
+ if (fractional_part> 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ place_data = {'name': restaurant['name'], 'rating': restaurant['rating'], 'address': restaurant['address'],'lat':restaurant['lat'],'lng':restaurant['lng'], 'stime': plan[i]['etime'], 'etime': e_t, 'ttime': rt, 'type': 'restaurant'}
+ plan.append(place_data)
+ n_available_time = float(float(n_available_time) - 0.5)
+ tea = 1
+ if (float(e_t) > 9 and float(e_t)<10 and breakfast == 0):
+ restaurant = find_restaurant(api_key, plan[0]['name'] + ","+ plan[0]['address'],start_address)
+ rt = get_travel_time(api_key, plan[0]['name'] + plan[0]['address'], restaurant['name'] + restaurant['address'])
+ e_t = float(float(plan[0]['etime']) + 0.5)
+ fractional_part = float(e_t)- int(e_t)
+ if (fractional_part> 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ place_data = {'name': restaurant['name'], 'rating': restaurant['rating'], 'address': restaurant['address'],'lat':restaurant['lat'],'lng':restaurant['lng'], 'stime': plan[i]['etime'], 'etime': e_t, 'ttime': rt, 'type': 'restaurant'}
+ plan.append(place_data)
+ n_available_time = float(float(n_available_time) - 0.5)
+ breakfast = 1
+ if (float(e_t) > 13.00 and float(e_t) > 14.00 and lunch == 0):
+ restaurant = find_restaurant(api_key, plan[0]['name'] + ","+ plan[0]['address'],start_address)
+ rt = get_travel_time(api_key, plan[0]['name'] + plan[0]['address'], restaurant['name'] + restaurant['address'])
+ e_t = float(float(plan[0]['etime']) + 0.5)
+ fractional_part = float(e_t)- int(e_t)
+ if (fractional_part> 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ place_data = {'name': restaurant['name'], 'rating': restaurant['rating'], 'address': restaurant['address'],'lat':restaurant['lat'],'lng':restaurant['lng'], 'stime': plan[i]['etime'], 'etime': e_t, 'ttime': rt, 'type': 'restaurant'}
+ plan.append(place_data)
+ n_available_time = float(float(n_available_time) - 0.5)
+ lunch = 1
+ if (float(e_t) > 20.00 and float(e_t) > 21.00 and dinner == 0):
+ restaurant = find_restaurant(api_key, plan[0]['name'] + ","+ plan[0]['address'],start_address)
+ rt = get_travel_time(api_key, plan[0]['name'] + plan[0]['address'], restaurant['name'] + restaurant['address'])
+ e_t = float(float(plan[0]['etime']) + 0.5)
+ fractional_part = float(e_t)- int(e_t)
+ if (fractional_part> 0.60):
+ e_t = float(int(e_t)+1.00)+(fractional_part-0.60)
+ place_data = {'name': restaurant['name'], 'rating': restaurant['rating'], 'address': restaurant['address'],'lat':restaurant['lat'],'lng':restaurant['lng'], 'stime': plan[i]['etime'], 'etime': e_t, 'ttime': rt, 'type': 'restaurant'}
+ plan.append(place_data)
+ n_available_time = float(float(n_available_time) - 0.5)
+ dinner = 1
+ for i in range(len(plan)):
+ plan[i]['description'] = description_prompt_maker(plan[i]['name']+plan[i]['address'])
+ for i in range(len(plan)):
+ plan[i]['pic']=get_place_photo(api_key, plan[i]['name']+","+plan[i]['address'])
+
+ unique_addresses = set()
+ unique_data = []
+
+ for item in plan:
+ address = item['address']
+ if address not in unique_addresses:
+ unique_data.append(item)
+ unique_addresses.add(address)
+ return unique_data
+
+
+
+
+
+
diff --git a/backend-flask/map/main.py b/backend-flask/map/main.py
new file mode 100644
index 00000000..44cf66e9
--- /dev/null
+++ b/backend-flask/map/main.py
@@ -0,0 +1,17 @@
+from flask import *
+import finaltest
+app=Flask(__name__)
+
+@app.route("/text",methods=['POST'])
+def index():
+ transcribed_txt=request.json["text"]
+ start_address=request.json["address"]
+ lat=float(request.json["latitude"])
+ lng=float(request.json["longitude"])
+ r=finaltest.text_evaluator_prompt_maker(transcribed_txt, start_address, lat, lng)
+ return({"result":r})
+
+
+
+if __name__=="__main__":
+ app.run(debug=True,port=6000)
\ No newline at end of file
diff --git a/backend-flask/map/requirements.txt b/backend-flask/map/requirements.txt
new file mode 100644
index 00000000..198b334b
--- /dev/null
+++ b/backend-flask/map/requirements.txt
@@ -0,0 +1,18 @@
+Flask==1.1.2
+PyPDF2==3.0.1
+gunicorn==20.0.4
+Jinja2==2.11.3
+click==7.1.2
+itsdangerous==1.1.0
+Jinja2==2.11.3
+MarkupSafe==1.1.1
+Werkzeug==1.0.1
+firebase_admin==6.2.0
+openai==0.27.7
+langchain==0.0.174
+gcloud==0.18.3
+google_cloud_firestore==2.11.1
+google-api-core==2.11.1
+openpyxl==3.1.2
+googlemaps==4.10.0
+requests==2.20.0
diff --git a/flow.png b/flow.png
new file mode 100644
index 00000000..3bcdfaa3
Binary files /dev/null and b/flow.png differ
diff --git a/frontend_mobile_app/tripn/.gitattributes b/frontend_mobile_app/tripn/.gitattributes
new file mode 100644
index 00000000..dfe07704
--- /dev/null
+++ b/frontend_mobile_app/tripn/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/frontend_mobile_app/tripn/.gitignore b/frontend_mobile_app/tripn/.gitignore
new file mode 100644
index 00000000..24476c5d
--- /dev/null
+++ b/frontend_mobile_app/tripn/.gitignore
@@ -0,0 +1,44 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/frontend_mobile_app/tripn/.metadata b/frontend_mobile_app/tripn/.metadata
new file mode 100644
index 00000000..8e2946d5
--- /dev/null
+++ b/frontend_mobile_app/tripn/.metadata
@@ -0,0 +1,45 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "12fccda598477eddd19f93040a1dba24f915b9be"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ base_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ - platform: android
+ create_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ base_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ - platform: ios
+ create_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ base_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ - platform: linux
+ create_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ base_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ - platform: macos
+ create_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ base_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ - platform: web
+ create_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ base_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ - platform: windows
+ create_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+ base_revision: 12fccda598477eddd19f93040a1dba24f915b9be
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/frontend_mobile_app/tripn/README.md b/frontend_mobile_app/tripn/README.md
new file mode 100644
index 00000000..50aebeff
--- /dev/null
+++ b/frontend_mobile_app/tripn/README.md
@@ -0,0 +1,2 @@
+# Tripn
+ "Tripn: Your Journey, Our Passion!"
diff --git a/frontend_mobile_app/tripn/analysis_options.yaml b/frontend_mobile_app/tripn/analysis_options.yaml
new file mode 100644
index 00000000..f9b30346
--- /dev/null
+++ b/frontend_mobile_app/tripn/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:flutter_lints/flutter.yaml
diff --git a/frontend_mobile_app/tripn/android/.gitignore b/frontend_mobile_app/tripn/android/.gitignore
new file mode 100644
index 00000000..6f568019
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/.gitignore
@@ -0,0 +1,13 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/frontend_mobile_app/tripn/android/app/build.gradle b/frontend_mobile_app/tripn/android/app/build.gradle
new file mode 100644
index 00000000..7559b515
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/build.gradle
@@ -0,0 +1,69 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+android {
+ namespace "com.example.tripn"
+ compileSdkVersion flutter.compileSdkVersion
+ ndkVersion flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "com.example.tripn"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
+ minSdkVersion 21
+ targetSdkVersion flutter.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation "androidx.activity:activity:1.6.0-alpha05"
+}
diff --git a/frontend_mobile_app/tripn/android/app/src/debug/AndroidManifest.xml b/frontend_mobile_app/tripn/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 00000000..399f6981
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/frontend_mobile_app/tripn/android/app/src/main/AndroidManifest.xml b/frontend_mobile_app/tripn/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..f5332194
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/android/app/src/main/kotlin/com/example/tripn/MainActivity.kt b/frontend_mobile_app/tripn/android/app/src/main/kotlin/com/example/tripn/MainActivity.kt
new file mode 100644
index 00000000..b3052dce
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/src/main/kotlin/com/example/tripn/MainActivity.kt
@@ -0,0 +1,6 @@
+package com.example.tripn
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/drawable-v21/launch_background.xml b/frontend_mobile_app/tripn/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 00000000..f74085f3
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/drawable/launch_background.xml b/frontend_mobile_app/tripn/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 00000000..304732f8
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..db77bb4b
Binary files /dev/null and b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..17987b79
Binary files /dev/null and b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..09d43914
Binary files /dev/null and b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..d5f1c8d3
Binary files /dev/null and b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..4d6372ee
Binary files /dev/null and b/frontend_mobile_app/tripn/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/values-night/styles.xml b/frontend_mobile_app/tripn/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 00000000..06952be7
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/android/app/src/main/res/values/styles.xml b/frontend_mobile_app/tripn/android/app/src/main/res/values/styles.xml
new file mode 100644
index 00000000..cb1ef880
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/android/app/src/profile/AndroidManifest.xml b/frontend_mobile_app/tripn/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 00000000..399f6981
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/frontend_mobile_app/tripn/android/build.gradle b/frontend_mobile_app/tripn/android/build.gradle
new file mode 100644
index 00000000..93c6a210
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/build.gradle
@@ -0,0 +1,32 @@
+buildscript {
+ ext.kotlin_version = '1.9.0'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+
+ classpath 'com.android.tools.build:gradle:7.3.0'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
diff --git a/frontend_mobile_app/tripn/android/gradle.properties b/frontend_mobile_app/tripn/android/gradle.properties
new file mode 100644
index 00000000..94adc3a3
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/frontend_mobile_app/tripn/android/gradle/wrapper/gradle-wrapper.properties b/frontend_mobile_app/tripn/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..3c472b99
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
diff --git a/frontend_mobile_app/tripn/android/settings.gradle b/frontend_mobile_app/tripn/android/settings.gradle
new file mode 100644
index 00000000..55c4ca8b
--- /dev/null
+++ b/frontend_mobile_app/tripn/android/settings.gradle
@@ -0,0 +1,20 @@
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return flutterSdkPath
+ }
+ settings.ext.flutterSdkPath = flutterSdkPath()
+
+ includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
+
+ plugins {
+ id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false
+ }
+}
+
+include ":app"
+
+apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/frontend_mobile_app/tripn/assets/images/Logo.png b/frontend_mobile_app/tripn/assets/images/Logo.png
new file mode 100644
index 00000000..fbcc9ab6
Binary files /dev/null and b/frontend_mobile_app/tripn/assets/images/Logo.png differ
diff --git a/frontend_mobile_app/tripn/assets/images/Tripn_logo.png b/frontend_mobile_app/tripn/assets/images/Tripn_logo.png
new file mode 100644
index 00000000..454edd4f
Binary files /dev/null and b/frontend_mobile_app/tripn/assets/images/Tripn_logo.png differ
diff --git a/frontend_mobile_app/tripn/assets/images/adventurer.png b/frontend_mobile_app/tripn/assets/images/adventurer.png
new file mode 100644
index 00000000..7e8cb610
Binary files /dev/null and b/frontend_mobile_app/tripn/assets/images/adventurer.png differ
diff --git a/frontend_mobile_app/tripn/assets/images/budget.png b/frontend_mobile_app/tripn/assets/images/budget.png
new file mode 100644
index 00000000..4d1ca074
Binary files /dev/null and b/frontend_mobile_app/tripn/assets/images/budget.png differ
diff --git a/frontend_mobile_app/tripn/assets/images/explore.png b/frontend_mobile_app/tripn/assets/images/explore.png
new file mode 100644
index 00000000..4523095a
Binary files /dev/null and b/frontend_mobile_app/tripn/assets/images/explore.png differ
diff --git a/frontend_mobile_app/tripn/assets/images/foodtrip.png b/frontend_mobile_app/tripn/assets/images/foodtrip.png
new file mode 100644
index 00000000..00787706
Binary files /dev/null and b/frontend_mobile_app/tripn/assets/images/foodtrip.png differ
diff --git a/frontend_mobile_app/tripn/assets/images/scooter.png b/frontend_mobile_app/tripn/assets/images/scooter.png
new file mode 100644
index 00000000..aba3d8cd
Binary files /dev/null and b/frontend_mobile_app/tripn/assets/images/scooter.png differ
diff --git a/frontend_mobile_app/tripn/assets/images/video1.mp4 b/frontend_mobile_app/tripn/assets/images/video1.mp4
new file mode 100644
index 00000000..bb44333c
Binary files /dev/null and b/frontend_mobile_app/tripn/assets/images/video1.mp4 differ
diff --git a/frontend_mobile_app/tripn/flutter_01.png b/frontend_mobile_app/tripn/flutter_01.png
new file mode 100644
index 00000000..593cb5f6
Binary files /dev/null and b/frontend_mobile_app/tripn/flutter_01.png differ
diff --git a/frontend_mobile_app/tripn/flutter_02.png b/frontend_mobile_app/tripn/flutter_02.png
new file mode 100644
index 00000000..f440786f
Binary files /dev/null and b/frontend_mobile_app/tripn/flutter_02.png differ
diff --git a/frontend_mobile_app/tripn/flutter_03.png b/frontend_mobile_app/tripn/flutter_03.png
new file mode 100644
index 00000000..0cbaf0b8
Binary files /dev/null and b/frontend_mobile_app/tripn/flutter_03.png differ
diff --git a/frontend_mobile_app/tripn/flutter_04.png b/frontend_mobile_app/tripn/flutter_04.png
new file mode 100644
index 00000000..1b650777
Binary files /dev/null and b/frontend_mobile_app/tripn/flutter_04.png differ
diff --git a/frontend_mobile_app/tripn/ios/.gitignore b/frontend_mobile_app/tripn/ios/.gitignore
new file mode 100644
index 00000000..7a7f9873
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/.gitignore
@@ -0,0 +1,34 @@
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/frontend_mobile_app/tripn/ios/Flutter/AppFrameworkInfo.plist b/frontend_mobile_app/tripn/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 00000000..9625e105
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 11.0
+
+
diff --git a/frontend_mobile_app/tripn/ios/Flutter/Debug.xcconfig b/frontend_mobile_app/tripn/ios/Flutter/Debug.xcconfig
new file mode 100644
index 00000000..592ceee8
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Flutter/Debug.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/frontend_mobile_app/tripn/ios/Flutter/Release.xcconfig b/frontend_mobile_app/tripn/ios/Flutter/Release.xcconfig
new file mode 100644
index 00000000..592ceee8
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Flutter/Release.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.pbxproj b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..c34f633f
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,614 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 97C146ED1CF9000F007C117D;
+ remoteInfo = Runner;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C8080294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 331C807D294A63A400263BE5 /* Sources */,
+ 331C807E294A63A400263BE5 /* Frameworks */,
+ 331C807F294A63A400263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1430;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C8080294A63A400263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 97C146ED1CF9000F007C117D;
+ };
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ 331C8080294A63A400263BE5 /* RunnerTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C807F294A63A400263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C807D294A63A400263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 97C146ED1CF9000F007C117D /* Runner */;
+ targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 331C8088294A63A400263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Debug;
+ };
+ 331C8089294A63A400263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Release;
+ };
+ 331C808A294A63A400263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C8088294A63A400263BE5 /* Debug */,
+ 331C8089294A63A400263BE5 /* Release */,
+ 331C808A294A63A400263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..919434a6
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..87131a09
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner.xcworkspace/contents.xcworkspacedata b/frontend_mobile_app/tripn/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..1d526a16
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend_mobile_app/tripn/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend_mobile_app/tripn/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner/AppDelegate.swift b/frontend_mobile_app/tripn/ios/Runner/AppDelegate.swift
new file mode 100644
index 00000000..70693e4a
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..d36b1fab
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 00000000..dc9ada47
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 00000000..7353c41e
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 00000000..797d452e
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 00000000..6ed2d933
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 00000000..4cd7b009
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 00000000..fe730945
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 00000000..321773cd
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 00000000..797d452e
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 00000000..502f463a
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 00000000..0ec30343
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 00000000..0ec30343
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 00000000..e9f5fea2
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 00000000..84ac32ae
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 00000000..8953cba0
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 00000000..0467bf12
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 00000000..0bedcf2f
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 00000000..89c2725b
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/frontend_mobile_app/tripn/ios/Runner/Base.lproj/LaunchScreen.storyboard b/frontend_mobile_app/tripn/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 00000000..f2e259c7
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner/Base.lproj/Main.storyboard b/frontend_mobile_app/tripn/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 00000000..f3c28516
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner/Info.plist b/frontend_mobile_app/tripn/ios/Runner/Info.plist
new file mode 100644
index 00000000..9d52f33f
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Tripn
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ tripn
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/frontend_mobile_app/tripn/ios/Runner/Runner-Bridging-Header.h b/frontend_mobile_app/tripn/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 00000000..308a2a56
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/frontend_mobile_app/tripn/ios/RunnerTests/RunnerTests.swift b/frontend_mobile_app/tripn/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000..86a7c3b1
--- /dev/null
+++ b/frontend_mobile_app/tripn/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/frontend_mobile_app/tripn/lib/constants.dart b/frontend_mobile_app/tripn/lib/constants.dart
new file mode 100644
index 00000000..0c3ffe92
--- /dev/null
+++ b/frontend_mobile_app/tripn/lib/constants.dart
@@ -0,0 +1,4 @@
+import 'package:flutter/material.dart';
+
+const String googleApiKey = "APIKEY";
+const Color primaryColor = Color(0xFFA679E0);
diff --git a/frontend_mobile_app/tripn/lib/main.dart b/frontend_mobile_app/tripn/lib/main.dart
new file mode 100644
index 00000000..da0a630e
--- /dev/null
+++ b/frontend_mobile_app/tripn/lib/main.dart
@@ -0,0 +1,21 @@
+import 'package:flutter/material.dart';
+import 'package:sizer/sizer.dart';
+import 'package:tripn/view/Screens/homescreen.dart';
+
+void main() {
+ runApp(const MainApp());
+}
+
+class MainApp extends StatelessWidget {
+ const MainApp({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Sizer(builder: (context, orientation, deviceType) {
+ return const MaterialApp(
+ debugShowCheckedModeBanner: false,
+ home: HomeScreen(),
+ );
+ });
+ }
+}
diff --git a/frontend_mobile_app/tripn/lib/view/Screens/dashboard.dart b/frontend_mobile_app/tripn/lib/view/Screens/dashboard.dart
new file mode 100644
index 00000000..567d61e0
--- /dev/null
+++ b/frontend_mobile_app/tripn/lib/view/Screens/dashboard.dart
@@ -0,0 +1,366 @@
+// ignore_for_file: file_names
+import 'dart:convert';
+import 'package:http/http.dart' as http;
+import 'package:flutter/material.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:lottie/lottie.dart';
+import 'package:sizer/sizer.dart';
+import '../widgets/mapsview.dart';
+
+bool isVisible = false;
+
+class DashBoard extends StatefulWidget {
+ const DashBoard({super.key});
+
+ @override
+ State createState() => _DashBoardState();
+}
+
+class _DashBoardState extends State {
+ final TextEditingController _controller = TextEditingController();
+
+ @override
+ Widget build(BuildContext context) {
+ return Stack(
+ children: [
+ SingleChildScrollView(
+ child: Column(
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AppBar(
+ elevation: 0,
+ actions: [
+ Icon(
+ Icons.camera_alt_outlined,
+ color: Colors.black54,
+ size: 4.h,
+ ),
+ SizedBox(
+ width: 5.w,
+ )
+ ],
+ title: Image.asset(
+ 'assets/images/Logo.png',
+ width: 23.w,
+ ),
+ backgroundColor: const Color(0xffffffff)),
+
+ const Divider(
+ thickness: 0.7,
+ color: Colors.grey,
+ ),
+ Padding(
+ padding: EdgeInsets.only(left: 3.h, top: 2.h, right: 2.h),
+ child: SearchBar(
+ controller: _controller,
+ leading: Padding(
+ padding: EdgeInsets.all(8.0.sp),
+ child: const Icon(
+ Icons.location_pin,
+ color: Color(0xff009955),
+ ),
+ ),
+ hintText: 'Where can i take you today?',
+ hintStyle: MaterialStatePropertyAll(
+ GoogleFonts.poppins(fontWeight: FontWeight.w500),
+ ),
+ trailing: [
+ IconButton.filled(
+ onPressed: () {
+ getTrip(_controller.text, context);
+ setState(() {
+ isVisible = true;
+ });
+ },
+ icon: const Icon(
+ Icons.send,
+ color: Color(0xff009955),
+ )),
+ ],
+ elevation: const MaterialStatePropertyAll(0),
+ backgroundColor: const MaterialStatePropertyAll(
+ Color.fromARGB(205, 178, 239, 212)),
+ ),
+ ),
+ SizedBox(
+ height: 2.h,
+ ),
+ Align(
+ alignment: Alignment.center,
+ child: FloatingActionButton.extended(
+ onPressed: () {},
+ elevation: 0,
+ backgroundColor: const Color(0xff009955),
+ hoverColor: const Color.fromARGB(205, 227, 255, 246),
+ focusColor: const Color(0xff009955),
+ label: const Text('Tap to talk'),
+ icon: const Icon(Icons.mic),
+ ),
+ ),
+ SizedBox(
+ height: 2.h,
+ ),
+ Align(
+ alignment: Alignment.center,
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(10),
+ child: Image.asset(
+ 'assets/images/explore.png',
+ width: 90.w,
+ ),
+ )),
+ SizedBox(
+ height: 2.h,
+ ),
+ Padding(
+ padding: EdgeInsets.only(left: 3.h),
+ child: Text(
+ 'Quick Trip!',
+ style: GoogleFonts.poppins(
+ fontSize: 16.sp,
+ color: const Color(0xff009955),
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.only(left: 3.h, top: 2.h),
+ child: quickTrip(),
+ )
+ ],
+ ),
+ ],
+ ),
+ ),
+ Visibility(
+ visible: isVisible,
+ child: Container(
+ decoration: BoxDecoration(
+ color: Colors.black.withOpacity(0.5),
+ ),
+ child: Center(
+ child: Material(
+ borderRadius: BorderRadius.circular(20),
+ child: Lottie.network(
+ 'https://lottie.host/8851ec49-bcae-4550-9917-f22b19c40926/lpGgyiL5Mk.json',
+ width: 20.h),
+ ),
+ ),
+ ),
+ )
+ ],
+ );
+ }
+
+ Row quickTrip() {
+ return Row(
+ children: [
+ Column(
+ children: [
+ Container(
+ width: 9.h,
+ height: 9.h,
+ decoration: BoxDecoration(
+ color: const Color(0xFCCECECE),
+ borderRadius: BorderRadius.circular(10.sp),
+ ),
+ child: Image.asset(
+ 'assets/images/scooter.png',
+ )),
+ Text(
+ 'One day',
+ style: GoogleFonts.poppins(
+ fontSize: 10.sp, fontWeight: FontWeight.w400),
+ ),
+ ],
+ ),
+ SizedBox(
+ width: 1.8.h,
+ ),
+ Column(
+ children: [
+ Container(
+ width: 9.h,
+ height: 9.h,
+ decoration: BoxDecoration(
+ color: const Color(0xFCCECECE),
+ borderRadius: BorderRadius.circular(10.sp),
+ ),
+ child: Image.asset(
+ 'assets/images/budget.png',
+ ),
+ ),
+ Text(
+ 'Budget',
+ style: GoogleFonts.poppins(
+ fontSize: 10.sp, fontWeight: FontWeight.w400),
+ )
+ ],
+ ),
+ SizedBox(
+ width: 1.8.h,
+ ),
+ Column(
+ children: [
+ Container(
+ width: 9.h,
+ height: 9.h,
+ decoration: BoxDecoration(
+ color: const Color(0xFCCECECE),
+ borderRadius: BorderRadius.circular(10.sp),
+ ),
+ child: Image.asset(
+ 'assets/images/foodtrip.png',
+ ),
+ ),
+ Text(
+ 'Food trip',
+ style: GoogleFonts.poppins(
+ fontSize: 10.sp, fontWeight: FontWeight.w400),
+ )
+ ],
+ ),
+ SizedBox(
+ width: 1.8.h,
+ ),
+ Column(
+ children: [
+ Container(
+ width: 9.h,
+ height: 9.h,
+ decoration: BoxDecoration(
+ color: const Color(0xFCCECECE),
+ borderRadius: BorderRadius.circular(10.sp),
+ ),
+ child: Image.asset(
+ 'assets/images/adventurer.png',
+ ),
+ ),
+ Text(
+ 'Adventures',
+ style: GoogleFonts.poppins(
+ fontSize: 10.sp, fontWeight: FontWeight.w400),
+ )
+ ],
+ )
+ ],
+ );
+ }
+
+ Future getTrip(question, context) async {
+ Map resultMap = {};
+ print(question);
+ final result = await http.post(
+ Uri.parse('https://web-production-77cb.up.railway.app/text'),
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: jsonEncode({
+ "address": "Govt.Model Engineering College,Thrikakara",
+ "latitude": "10.02817195",
+ "longitude": "76.32843611331214",
+ "text": question
+ }),
+ );
+ if (result.statusCode == 200) {
+ // If the server returns a successful response, navigate to the next page.
+ final decodedData = jsonDecode(result.body);
+ // Ensure you're in a StatefulWidget context and use setState to navigate
+ setState(() {
+ resultMap = decodedData;
+ isVisible = false;
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => MapSample(
+ pointMap: resultMap,
+ )),
+ );
+ });
+ print(
+ resultMap,
+ );
+ } else {
+ // If there's an error in the HTTP request, you may want to handle it here.
+ setState(() {
+ isVisible = false;
+ });
+ throw Exception(result.statusCode);
+ }
+ }
+}
+
+class StoryBlock extends StatelessWidget {
+ const StoryBlock({
+ super.key,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ List names = [
+ 'Alfred Jimmy',
+ 'Goutham C arun',
+ 'Athul Babu',
+ 'Anand a',
+ 'Jamal P',
+ 'Jeff Prakash',
+ 'Akshay John'
+ ];
+ List url = [
+ 'https://images.pexels.com/photos/208745/pexels-photo-208745.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1',
+ 'https://images.pexels.com/photos/678725/pexels-photo-678725.jpeg?auto=compress&cs=tinysrgb&w=1600',
+ 'https://images.pexels.com/photos/2884866/pexels-photo-2884866.jpeg?auto=compress&cs=tinysrgb&w=1600',
+ 'https://images.pexels.com/photos/3073666/pexels-photo-3073666.jpeg?auto=compress&cs=tinysrgb&w=1600',
+ 'https://images.pexels.com/photos/372490/pexels-photo-372490.jpeg?auto=compress&cs=tinysrgb&w=1600',
+ 'https://images.pexels.com/photos/1831545/pexels-photo-1831545.jpeg?auto=compress&cs=tinysrgb&w=1600',
+ 'https://images.pexels.com/photos/3214975/pexels-photo-3214975.jpeg?auto=compress&cs=tinysrgb&w=1600'
+ ];
+ return Padding(
+ padding: EdgeInsets.only(
+ top: 0.5.h,
+ ),
+ child: SizedBox(
+ height: 14.5.h,
+ child: ListView.builder(
+ scrollDirection: Axis.horizontal,
+ physics: const BouncingScrollPhysics(),
+ itemCount: names.length,
+ itemBuilder: (context, index) {
+ return Padding(
+ padding: EdgeInsets.only(left: 1.5.h),
+ child: SizedBox(
+ width: 24.w,
+ child: Column(
+ children: [
+ CircleAvatar(
+ radius: 12.w,
+ backgroundColor: const Color.fromARGB(255, 0, 201, 111),
+ child: CircleAvatar(
+ backgroundColor: Colors.white,
+ radius: 11.w,
+ child: CircleAvatar(
+ radius: 10.w,
+ backgroundImage: NetworkImage(url[index]),
+ ),
+ ),
+ ),
+ Text(
+ names[index],
+ style: GoogleFonts.poppins(
+ fontSize: 8.sp,
+ fontWeight: FontWeight.w500,
+ textStyle: const TextStyle(
+ overflow: TextOverflow.ellipsis,
+ )),
+ )
+ ],
+ ),
+ ),
+ );
+ }),
+ ),
+ );
+ }
+}
diff --git a/frontend_mobile_app/tripn/lib/view/Screens/homescreen.dart b/frontend_mobile_app/tripn/lib/view/Screens/homescreen.dart
new file mode 100644
index 00000000..2445503e
--- /dev/null
+++ b/frontend_mobile_app/tripn/lib/view/Screens/homescreen.dart
@@ -0,0 +1,26 @@
+import 'package:flutter/material.dart';
+import '../widgets/backgroundvideo.dart';
+
+class HomeScreen extends StatefulWidget {
+ const HomeScreen({super.key});
+
+ @override
+ State createState() => _HomeScreenState();
+}
+
+class _HomeScreenState extends State {
+
+
+
+
+ @override
+ Widget build(BuildContext context) {
+ return const Scaffold(
+ body: Stack(
+ children: [
+ BackgroundVideoWidget(),
+ ],
+ )
+ );
+ }
+}
diff --git a/frontend_mobile_app/tripn/lib/view/navigationpage.dart b/frontend_mobile_app/tripn/lib/view/navigationpage.dart
new file mode 100644
index 00000000..1ba7243b
--- /dev/null
+++ b/frontend_mobile_app/tripn/lib/view/navigationpage.dart
@@ -0,0 +1,182 @@
+import 'package:flutter/material.dart';
+import 'package:animated_notch_bottom_bar/animated_notch_bottom_bar/animated_notch_bottom_bar.dart';
+import 'package:tripn/view/Screens/dashboard.dart';
+import 'package:tripn/view/widgets/mapsview.dart';
+
+Map pointMap = {
+ "result": [
+ {
+ "address": "272F+6MH, Queens Walkway, Mulavukad, Kochi, Ernakulam",
+ "description":
+ "A scenic fishing spot with a stunning view of Queens Walkway in Mulavukad, Kochi, Ernakulam.",
+ "etime": 10.512,
+ "lat": 10.0005704,
+ "lng": 76.27423689999999,
+ "name": "Fishing & View Point",
+ "pic":
+ "No photos found for Fishing & View Point,272F+6MH, Queens Walkway, Mulavukad, Kochi, Ernakulam.",
+ "rating": 5,
+ "stime": 10.0,
+ "ttime": "0.512",
+ "type": "travel"
+ },
+ {
+ "address":
+ "273G+W5F, Safdar Hashmi Ln, Shanmugapuram Colony, Pachalam, Kochi, Ernakulam",
+ "description":
+ "Fishland273G+W5F is a seafood restaurant located in Shanmugapuram Colony, Kochi, offering a delightful culinary experience.",
+ "etime": 11.536000000000001,
+ "lat": 10.0047437,
+ "lng": 76.2754405,
+ "name": "Fishland",
+ "pic":
+ "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=AcJnMuFfXMa1o8y2xI9K9TNpxAK_PjjcsLXbCL9W1wD2DEFFfRLK9gtBmXIss9VyPTwyyebb8bRtra2J4Lvdjev3XbP_lspkDtQO4RIGTGZ3f0SwQLs-5B2WT34a3IAWBZ3fW_mUjJ3bxeudWyPJK75N-TjDE85X708r01BooR8Qi9EN6G4K&key=AIzaSyD1eYmck8n38D1TdPRc52RCtg-HnpU0B9U",
+ "rating": 5,
+ "stime": 11.024000000000001,
+ "ttime": "0.512",
+ "type": "travel"
+ },
+ {
+ "address": "X7XF+H5G, Goshree Chathiyath Rd, Pachalam, Ernakulam",
+ "description":
+ "Queen's Walkway is a scenic pathway located in Pachalam, Ernakulam, offering a delightful stroll along Goshree Chathiyath Road.",
+ "etime": 12.061000000000002,
+ "lat": 9.9989255,
+ "lng": 76.27296249999999,
+ "name": "Queen's Walkway",
+ "pic":
+ "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=AcJnMuFN68Msk5-8MZ7cLEVNA-4eKJC3JZIc6OvPqIK6xhYPXwnWdVMPyE1fh4JEKw3G9OfXrrGDZK1QeOdhrtgv9BmesGMCUAz9dN5Y2S-faVP7LuPH2GK6vZenRU8qZuUuyIVbbQm1tki0NQgNd8netwTPVtm7YVHgHRTZtUTuKAs01FIu&key=AIzaSyD1eYmck8n38D1TdPRc52RCtg-HnpU0B9U",
+ "rating": 4.6,
+ "stime": 11.536000000000001,
+ "ttime": "0.525",
+ "type": "travel"
+ },
+ {
+ "address": "High Court Junction, Marine Drive, Kochi, Ernakulam",
+ "description":
+ "Kochi water metroHigh Court Junction, Marine Drive, Kochi, Ernakulam: A scenic and convenient mode of transportation to explore the beautiful waterways of Kochi.",
+ "etime": 12.592000000000002,
+ "lat": 9.983779199999999,
+ "lng": 76.27395059999999,
+ "name": "Kochi water metro",
+ "pic":
+ "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=AcJnMuH4RO5wHgVphzYTBCsmElfLXZK7G1DDB3s60e7bCplZt22Jpsttro33rH_NvWGJiA5vSk9JoaCGt-D5JOhZ_HNeO_xk8yg4QDNsHfhwusl_YZS5EsgPz27hwCGKOCks-WDPAVrhzD8jaBBn7uGV88us32435kLZjKIswgWb-q4AnwUJ&key=AIzaSyD1eYmck8n38D1TdPRc52RCtg-HnpU0B9U",
+ "rating": 4.5,
+ "stime": 12.061000000000002,
+ "ttime": "0.531",
+ "type": "travel"
+ },
+ {
+ "address": "Abdul Kalam Marg, Marine Drive, Kochi, Ernakulam",
+ "description":
+ "New Marine Drive in Kochi offers a scenic coastal promenade with stunning views of the Arabian Sea.",
+ "name": "New Marine Drive",
+ "pic":
+ "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=AcJnMuHxjo0UaSZMOR7ChrqANZnV2GJR08C4MaK4uLBzcsNW9wXXMrWbqhPCBZNJHMMYEfSDy7SjOGdb7PZnC_TfIHrjPRNFYSohRqUqIHmIYXAVBmBUDrFCpnsMCd7m7blhlCOeRxklTLUvo3ljouBa1sML0CtLTZlyyq502vgK8RCpLF5-&key=AIzaSyD1eYmck8n38D1TdPRc52RCtg-HnpU0B9U",
+ "rating": 4.5,
+ "stime": 12.592000000000002,
+ "ttime": "0.393",
+ "type": "travel"
+ }
+ ]
+ };
+
+
+class NavigationPage extends StatefulWidget {
+ const NavigationPage({super.key, this.Page});
+ final Page;
+ @override
+ State createState() => _NavigationPageState();
+}
+
+class _NavigationPageState extends State {
+ int maxCount = 2;
+
+ @override
+ void dispose() {
+ _pageController.dispose();
+ super.dispose();
+ }
+
+
+ /// Controller to handle PageView and also handles initial page
+ final _pageController = PageController(initialPage: 0);
+
+ /// Controller to handle bottom nav bar and also handles initial page
+ final _controller = NotchBottomBarController(index: 0);
+
+ /// widget list
+ final List bottomBarPages = [
+ const DashBoard(),
+ const MapSample(),
+ ];
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ resizeToAvoidBottomInset: false,
+ backgroundColor: Colors.white,
+ body: PageView(
+ controller: _pageController,
+ physics: const NeverScrollableScrollPhysics(),
+ children: List.generate(
+ bottomBarPages.length, (index) => bottomBarPages[index]),
+ ),
+ extendBody: true,
+ bottomNavigationBar: (bottomBarPages.length <= maxCount)
+ ? AnimatedNotchBottomBar(
+ /// Provide NotchBottomBarController
+ notchBottomBarController: _controller,
+ color: Colors.white,
+ showLabel: false,
+ notchColor: Colors.white,
+
+ /// restart app if you change removeMargins
+ removeMargins: false,
+ bottomBarWidth: 500,
+ durationInMilliSeconds: 300,
+ bottomBarItems: const [
+ BottomBarItem(
+ inActiveItem: Icon(
+ Icons.home_filled,
+ color: Colors.blueGrey,
+ ),
+ activeItem: Icon(
+ Icons.home_filled,
+ color: Color(0xff009955),
+ ),
+ itemLabel: 'Page 1',
+ ),
+ BottomBarItem(
+ inActiveItem: Icon(
+ Icons.map,
+ color: Colors.blueGrey,
+ ),
+ activeItem: Icon(
+ Icons.map,
+ color: Color(0xff009955),
+ ),
+ itemLabel: 'Page 4',
+ ),
+ BottomBarItem(
+ inActiveItem: Icon(
+ Icons.person,
+ color: Colors.blueGrey,
+ ),
+ activeItem: Icon(
+ Icons.person,
+ color: Color(0xff009955),
+ ),
+ itemLabel: 'Page 5',
+ ),
+ ],
+ onTap: (index) {
+ /// perform action on tab change and to update pages you can update pages without pages
+ // log('current selected index {$index}');
+ _pageController.jumpToPage(widget.Page ?? index);
+ },
+ )
+ : null,
+ );
+ }
+}
diff --git a/frontend_mobile_app/tripn/lib/view/widgets/backgroundvideo.dart b/frontend_mobile_app/tripn/lib/view/widgets/backgroundvideo.dart
new file mode 100644
index 00000000..eda4e04e
--- /dev/null
+++ b/frontend_mobile_app/tripn/lib/view/widgets/backgroundvideo.dart
@@ -0,0 +1,29 @@
+import 'package:flutter/material.dart';
+import 'package:video_player/video_player.dart';
+
+class BackgroundVideoWidget extends StatefulWidget {
+ const BackgroundVideoWidget({super.key});
+
+ @override
+ State createState() => _BackgroundVideoWidgetState();
+}
+
+class _BackgroundVideoWidgetState extends State {
+ late final VideoPlayerController _Controller;
+ @override
+ void initState() {
+ _Controller = VideoPlayerController.asset('assets/images/video1.mp4')
+ ..initialize().then((value) {
+ _Controller.play();
+ _Controller.setLooping(true);
+ });
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return VideoPlayer(
+
+ _Controller);
+ }
+}
diff --git a/frontend_mobile_app/tripn/lib/view/widgets/mapsview.dart b/frontend_mobile_app/tripn/lib/view/widgets/mapsview.dart
new file mode 100644
index 00000000..9b189b66
--- /dev/null
+++ b/frontend_mobile_app/tripn/lib/view/widgets/mapsview.dart
@@ -0,0 +1,407 @@
+import 'dart:async';
+import 'package:flutter/material.dart';
+import 'package:flutter_polyline_points/flutter_polyline_points.dart';
+import 'package:flutter_rating_stars/flutter_rating_stars.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:google_maps_flutter/google_maps_flutter.dart';
+import 'package:location/location.dart';
+import 'package:sizer/sizer.dart';
+import 'package:tripn/constants.dart';
+
+const LatLng currentLocationlatlong = LatLng(10.072406, 76.309342);
+
+class MapSample extends StatefulWidget {
+ const MapSample({super.key, this.pointMap});
+ final pointMap;
+ @override
+ State createState() => MapSampleState();
+}
+
+class MapSampleState extends State {
+ final Completer _controller =
+ Completer();
+
+ static const CameraPosition _kGooglePlex = CameraPosition(
+ target: currentLocationlatlong,
+ tilt: 59.440717697143555,
+ zoom: 19.151926040649414);
+
+ static const CameraPosition _kLake = CameraPosition(
+ bearing: 192.8334901395799,
+ target: LatLng(10.072406, 76.309342),
+ tilt: 59.440717697143555,
+ zoom: 19.151926040649414);
+
+ List polyLineCordinates = [];
+ LocationData? currentLocation;
+
+
+
+ void getPolyPoints() async {
+ PolylinePoints polylinePoints = PolylinePoints();
+ PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
+ googleApiKey,
+ travelMode: TravelMode.driving,
+ PointLatLng(currentLocation!.latitude!, currentLocation!.longitude!),
+ PointLatLng(
+ places[places.length - 1]["lat"], places[places.length - 1]["lng"]),
+ );
+ if (result.points.isNotEmpty) {
+ for (var point in result.points) {
+ polyLineCordinates.add(
+ LatLng(point.latitude, point.longitude),
+ );
+ }
+ setState(() {});
+ }
+ }
+
+ List places = [
+ {
+ "address": "272F+6MH, Queens Walkway, Mulavukad, Kochi, Ernakulam",
+ "description":
+ "A scenic fishing spot with a stunning view of Queens Walkway in Mulavukad, Kochi, Ernakulam.",
+ "etime": 10.512,
+ "lat": 10.0005704,
+ "lng": 76.27423689999999,
+ "name": "Fishing & View Point",
+ "pic": null,
+ "rating": 5,
+ "stime": 10.0,
+ "ttime": "0.512",
+ "type": "travel"
+ },
+ {
+ "address":
+ "273G+W5F, Safdar Hashmi Ln, Shanmugapuram Colony, Pachalam, Kochi, Ernakulam",
+ "description":
+ "Fishland273G+W5F is a seafood restaurant located in Shanmugapuram Colony, Kochi, offering a delightful culinary experience.",
+ "etime": 11.536000000000001,
+ "lat": 10.0047437,
+ "lng": 76.2754405,
+ "name": "Fishland",
+ "pic":
+ "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=AcJnMuFfXMa1o8y2xI9K9TNpxAK_PjjcsLXbCL9W1wD2DEFFfRLK9gtBmXIss9VyPTwyyebb8bRtra2J4Lvdjev3XbP_lspkDtQO4RIGTGZ3f0SwQLs-5B2WT34a3IAWBZ3fW_mUjJ3bxeudWyPJK75N-TjDE85X708r01BooR8Qi9EN6G4K&key=AIzaSyD1eYmck8n38D1TdPRc52RCtg-HnpU0B9U",
+ "rating": 5,
+ "stime": 11.024000000000001,
+ "ttime": "0.512",
+ "type": "travel"
+ },
+ {
+ "address": "X7XF+H5G, Goshree Chathiyath Rd, Pachalam, Ernakulam",
+ "description":
+ "Queen's Walkway is a scenic pathway located in Pachalam, Ernakulam, offering a delightful stroll along Goshree Chathiyath Road.",
+ "etime": 12.061000000000002,
+ "lat": 9.9989255,
+ "lng": 76.27296249999999,
+ "name": "Queen's Walkway",
+ "pic":
+ "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=AcJnMuFN68Msk5-8MZ7cLEVNA-4eKJC3JZIc6OvPqIK6xhYPXwnWdVMPyE1fh4JEKw3G9OfXrrGDZK1QeOdhrtgv9BmesGMCUAz9dN5Y2S-faVP7LuPH2GK6vZenRU8qZuUuyIVbbQm1tki0NQgNd8netwTPVtm7YVHgHRTZtUTuKAs01FIu&key=AIzaSyD1eYmck8n38D1TdPRc52RCtg-HnpU0B9U",
+ "rating": 4.6,
+ "stime": 11.536000000000001,
+ "ttime": "0.525",
+ "type": "travel"
+ },
+ {
+ "address": "High Court Junction, Marine Drive, Kochi, Ernakulam",
+ "description":
+ "Kochi water metroHigh Court Junction, Marine Drive, Kochi, Ernakulam: A scenic and convenient mode of transportation to explore the beautiful waterways of Kochi.",
+ "etime": 12.592000000000002,
+ "lat": 9.983779199999999,
+ "lng": 76.27395059999999,
+ "name": "Kochi water metro",
+ "pic":
+ "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=AcJnMuH4RO5wHgVphzYTBCsmElfLXZK7G1DDB3s60e7bCplZt22Jpsttro33rH_NvWGJiA5vSk9JoaCGt-D5JOhZ_HNeO_xk8yg4QDNsHfhwusl_YZS5EsgPz27hwCGKOCks-WDPAVrhzD8jaBBn7uGV88us32435kLZjKIswgWb-q4AnwUJ&key=AIzaSyD1eYmck8n38D1TdPRc52RCtg-HnpU0B9U",
+ "rating": 4.5,
+ "stime": 12.061000000000002,
+ "ttime": "0.531",
+ "type": "travel"
+ },
+ {
+ "address": "Abdul Kalam Marg, Marine Drive, Kochi, Ernakulam",
+ "description":
+ "New Marine Drive in Kochi offers a scenic coastal promenade with stunning views of the Arabian Sea.",
+ "name": "New Marine Drive",
+ "pic":
+ "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=AcJnMuHxjo0UaSZMOR7ChrqANZnV2GJR08C4MaK4uLBzcsNW9wXXMrWbqhPCBZNJHMMYEfSDy7SjOGdb7PZnC_TfIHrjPRNFYSohRqUqIHmIYXAVBmBUDrFCpnsMCd7m7blhlCOeRxklTLUvo3ljouBa1sML0CtLTZlyyq502vgK8RCpLF5-&key=AIzaSyD1eYmck8n38D1TdPRc52RCtg-HnpU0B9U",
+ "rating": 4.5,
+ "stime": 12.592000000000002,
+ "ttime": "0.393",
+ "type": "travel"
+ }
+ ];
+ @override
+ void initState() {
+
+ getPolyPoints();
+ places = widget.pointMap["result"];
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: currentLocation == null
+ ? const Center(child: CircularProgressIndicator())
+ : Stack(
+ children: [
+ GoogleMap(
+ mapType: MapType.normal,
+ myLocationButtonEnabled: true,
+ zoomControlsEnabled: true,
+ zoomGesturesEnabled: true,
+ polylines: {
+ Polyline(
+ polylineId: const PolylineId("route"),
+ points: polyLineCordinates,
+ color: Colors.green,
+ width: 10,
+ )
+ },
+ markers: {
+ Marker(
+ markerId: const MarkerId("current locaton"),
+ position: LatLng(currentLocation!.latitude!,
+ currentLocation!.longitude!),
+ ),
+ Marker(
+ markerId: const MarkerId("source"),
+ position: LatLng(places[0]["lat"], places[0]["lng"]),
+ ),
+ Marker(
+ markerId: const MarkerId("destination"),
+ position: LatLng(places[places.length - 1]["lat"],
+ places[places.length - 1]["lng"]),
+ ),
+ },
+ initialCameraPosition: _kGooglePlex,
+ onMapCreated: (GoogleMapController controller) {
+ _controller.complete(controller);
+ },
+ ),
+ DraggableScrollableSheet(
+ initialChildSize: 0.35, // Set the initial size as needed.
+ minChildSize: 0.25, // Set the minimum size as needed.
+ maxChildSize: 0.9, // Set the maximum size as needed.
+ builder: (BuildContext context,
+ ScrollController scrollController) {
+ return Container(
+ decoration: BoxDecoration(
+ boxShadow: [
+ BoxShadow(
+ color: Colors.grey.shade600,
+ spreadRadius: 1,
+ blurRadius: 7)
+ ],
+ color: const Color.fromARGB(255, 248, 246, 246),
+ borderRadius: BorderRadius.circular(25)),
+ child: SingleChildScrollView(
+ controller: scrollController,
+ child: Column(
+ children: [
+ Icon(
+ Icons.remove,
+ size: 40.sp,
+ ),
+ Padding(
+ padding:
+ EdgeInsets.symmetric(horizontal: 2.2.h),
+ child: Row(
+ crossAxisAlignment:
+ CrossAxisAlignment.center,
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ crossAxisAlignment:
+ CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Today\'s Trip',
+ style: GoogleFonts.poppins(
+ fontSize: 24.sp,
+ fontWeight: FontWeight.w600,
+ color: Colors.black87),
+ ),
+ Text(
+ 'Starting Time: ${places[0]["stime"].floor().toString()} pm',
+ style: GoogleFonts.poppins(
+ fontSize: 11.sp,
+ fontWeight: FontWeight.w400,
+ color: Colors.black54),
+ ),
+ MaterialButton(
+ onPressed: () {},
+ elevation: 0,
+ color: Colors.green[800],
+ child: Text(
+ 'Start Trip',
+ style: GoogleFonts.poppins(
+ fontSize: 15.sp,
+ fontWeight: FontWeight.w600,
+ color: Colors.white),
+ ),
+ )
+ ],
+ ),
+ Column(
+ children: [
+ Text(
+ '3',
+ style: GoogleFonts.poppins(
+ fontSize: 20.sp,
+ fontWeight: FontWeight.bold,
+ color: Colors.green[900]),
+ ),
+ Text(
+ 'hrs',
+ style: GoogleFonts.poppins(
+ fontSize: 9.sp,
+ fontWeight: FontWeight.w400,
+ color: Colors.black54),
+ )
+ ],
+ )
+ ],
+ ),
+ ),
+ SizedBox(
+ height: double.maxFinite,
+ child: ListView.builder(
+ physics: const BouncingScrollPhysics(),
+ itemCount: places.length,
+ itemBuilder: (context, index) {
+ return triPlan(places, index);
+ }),
+ ),
+ ],
+ ),
+ ));
+ },
+ )
+ ],
+ )
+ // floatingActionButton: FloatingActionButton.extended(
+ // onPressed: _goToTheLake,
+ // label: const Text('To the lake!'),
+ // icon: const Icon(Icons.directions_boat),
+ // ),
+ );
+ }
+
+ Column triPlan(places, index) {
+ String timetake = places[index]["ttime"];
+ double doubleValue = double.parse(timetake);
+ double inMinutes = doubleValue * 60;
+ return Column(
+ children: [
+ const Divider(),
+ Padding(
+ padding: EdgeInsets.all(1.1.h),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: EdgeInsets.only(left: 1.2.h),
+ child: Container(
+ height: 12.h,
+ width: 12.h,
+ decoration: BoxDecoration(
+ image: DecorationImage(
+ fit: BoxFit.fill,
+ image: NetworkImage(
+ places[index]["pic"] ??
+ 'https://images.pexels.com/photos/5359389/pexels-photo-5359389.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1',
+ ),
+ ),
+ borderRadius: BorderRadius.circular(10),
+ ),
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.only(left: 1.h),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SizedBox(
+ width: 50.w,
+ child: Text(
+ places[index]["name"],
+ style: GoogleFonts.poppins(
+ fontWeight: FontWeight.w600,
+ color: Colors.green[800],
+ fontSize: 13.sp,
+ textStyle: const TextStyle(
+ overflow: TextOverflow.ellipsis)),
+ ),
+ ),
+ Row(
+ children: [
+ Text(
+ '${places[index]["stime"].toStringAsFixed(1)} pm',
+ style: GoogleFonts.poppins(
+ fontSize: 11.sp,
+ fontWeight: FontWeight.w500,
+ color: Colors.grey[700],
+ ),
+ ),
+ SizedBox(
+ width: 1.w,
+ ),
+ RatingStars(
+ starSize: 10.sp,
+ value: places[index]["rating"].toDouble(),
+ valueLabelColor: Colors.green,
+ ),
+ ],
+ ),
+ SizedBox(
+ width: 50.w,
+ child: Text(
+ places[index]["description"],
+ style: GoogleFonts.poppins(
+ fontSize: 8.sp,
+ color: Colors.black54,
+ fontWeight: FontWeight.w500,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ Padding(
+ padding: EdgeInsets.symmetric(horizontal: 2.w),
+ child: Column(
+ children: [
+ Image.network(
+ 'https://img.icons8.com/metro/26/646464/car.png'),
+ Text(
+ inMinutes.toStringAsFixed(1),
+ style: GoogleFonts.poppins(
+ fontSize: 12.sp,
+ fontWeight: FontWeight.bold,
+ color: Colors.black87),
+ ),
+ Text(
+ 'min',
+ style: GoogleFonts.poppins(
+ fontSize: 9.sp,
+ fontWeight: FontWeight.w500,
+ color: Colors.black54),
+ )
+ ],
+ ),
+ )
+ ],
+ ),
+ ),
+ const Divider()
+ ],
+ );
+ }
+
+ Future _goToTheLake() async {
+ final GoogleMapController controller = await _controller.future;
+ await controller.animateCamera(CameraUpdate.newCameraPosition(_kLake));
+ }
+}
diff --git a/frontend_mobile_app/tripn/linux/.gitignore b/frontend_mobile_app/tripn/linux/.gitignore
new file mode 100644
index 00000000..d3896c98
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/.gitignore
@@ -0,0 +1 @@
+flutter/ephemeral
diff --git a/frontend_mobile_app/tripn/linux/CMakeLists.txt b/frontend_mobile_app/tripn/linux/CMakeLists.txt
new file mode 100644
index 00000000..38c81908
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/CMakeLists.txt
@@ -0,0 +1,139 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.10)
+project(runner LANGUAGES CXX)
+
+# The name of the executable created for the application. Change this to change
+# the on-disk name of your application.
+set(BINARY_NAME "tripn")
+# The unique GTK application identifier for this application. See:
+# https://wiki.gnome.org/HowDoI/ChooseApplicationID
+set(APPLICATION_ID "com.example.tripn")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(SET CMP0063 NEW)
+
+# Load bundled libraries from the lib/ directory relative to the binary.
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
+
+# Root filesystem for cross-building.
+if(FLUTTER_TARGET_PLATFORM_SYSROOT)
+ set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+endif()
+
+# Define build configuration options.
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+endif()
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_14)
+ target_compile_options(${TARGET} PRIVATE -Wall -Werror)
+ target_compile_options(${TARGET} PRIVATE "$<$>:-O3>")
+ target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+
+add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
+
+# Define the application target. To change its name, change BINARY_NAME above,
+# not the value here, or `flutter run` will no longer work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME}
+ "main.cc"
+ "my_application.cc"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add dependency libraries. Add any application-specific dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter)
+target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
+
+# Only the install-generated bundle's copy of the executable will launch
+# correctly, since the resources must in the right relative locations. To avoid
+# people trying to run the unbundled copy, put it in a subdirectory instead of
+# the default top-level location.
+set_target_properties(${BINARY_NAME}
+ PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
+)
+
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# By default, "installing" just makes a relocatable bundle in the build
+# directory.
+set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+# Start with a clean build bundle directory every time.
+install(CODE "
+ file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
+ " COMPONENT Runtime)
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
+ install(FILES "${bundled_library}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endforeach(bundled_library)
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
+ install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
diff --git a/frontend_mobile_app/tripn/linux/flutter/CMakeLists.txt b/frontend_mobile_app/tripn/linux/flutter/CMakeLists.txt
new file mode 100644
index 00000000..d5bd0164
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/flutter/CMakeLists.txt
@@ -0,0 +1,88 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.10)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+
+# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
+# which isn't available in 3.10.
+function(list_prepend LIST_NAME PREFIX)
+ set(NEW_LIST "")
+ foreach(element ${${LIST_NAME}})
+ list(APPEND NEW_LIST "${PREFIX}${element}")
+ endforeach(element)
+ set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
+endfunction()
+
+# === Flutter Library ===
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
+pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
+
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "fl_basic_message_channel.h"
+ "fl_binary_codec.h"
+ "fl_binary_messenger.h"
+ "fl_dart_project.h"
+ "fl_engine.h"
+ "fl_json_message_codec.h"
+ "fl_json_method_codec.h"
+ "fl_message_codec.h"
+ "fl_method_call.h"
+ "fl_method_channel.h"
+ "fl_method_codec.h"
+ "fl_method_response.h"
+ "fl_plugin_registrar.h"
+ "fl_plugin_registry.h"
+ "fl_standard_message_codec.h"
+ "fl_standard_method_codec.h"
+ "fl_string_codec.h"
+ "fl_value.h"
+ "fl_view.h"
+ "flutter_linux.h"
+)
+list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
+target_link_libraries(flutter INTERFACE
+ PkgConfig::GTK
+ PkgConfig::GLIB
+ PkgConfig::GIO
+)
+add_dependencies(flutter flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CMAKE_CURRENT_BINARY_DIR}/_phony_
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
+ ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+)
diff --git a/frontend_mobile_app/tripn/linux/flutter/generated_plugin_registrant.cc b/frontend_mobile_app/tripn/linux/flutter/generated_plugin_registrant.cc
new file mode 100644
index 00000000..e71a16d2
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,11 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+
+void fl_register_plugins(FlPluginRegistry* registry) {
+}
diff --git a/frontend_mobile_app/tripn/linux/flutter/generated_plugin_registrant.h b/frontend_mobile_app/tripn/linux/flutter/generated_plugin_registrant.h
new file mode 100644
index 00000000..e0f0a47b
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/flutter/generated_plugin_registrant.h
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GENERATED_PLUGIN_REGISTRANT_
+#define GENERATED_PLUGIN_REGISTRANT_
+
+#include
+
+// Registers Flutter plugins.
+void fl_register_plugins(FlPluginRegistry* registry);
+
+#endif // GENERATED_PLUGIN_REGISTRANT_
diff --git a/frontend_mobile_app/tripn/linux/flutter/generated_plugins.cmake b/frontend_mobile_app/tripn/linux/flutter/generated_plugins.cmake
new file mode 100644
index 00000000..2e1de87a
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/flutter/generated_plugins.cmake
@@ -0,0 +1,23 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+)
+
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})
+ target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/frontend_mobile_app/tripn/linux/main.cc b/frontend_mobile_app/tripn/linux/main.cc
new file mode 100644
index 00000000..e7c5c543
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/main.cc
@@ -0,0 +1,6 @@
+#include "my_application.h"
+
+int main(int argc, char** argv) {
+ g_autoptr(MyApplication) app = my_application_new();
+ return g_application_run(G_APPLICATION(app), argc, argv);
+}
diff --git a/frontend_mobile_app/tripn/linux/my_application.cc b/frontend_mobile_app/tripn/linux/my_application.cc
new file mode 100644
index 00000000..b0340c65
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/my_application.cc
@@ -0,0 +1,104 @@
+#include "my_application.h"
+
+#include
+#ifdef GDK_WINDOWING_X11
+#include
+#endif
+
+#include "flutter/generated_plugin_registrant.h"
+
+struct _MyApplication {
+ GtkApplication parent_instance;
+ char** dart_entrypoint_arguments;
+};
+
+G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
+
+// Implements GApplication::activate.
+static void my_application_activate(GApplication* application) {
+ MyApplication* self = MY_APPLICATION(application);
+ GtkWindow* window =
+ GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
+
+ // Use a header bar when running in GNOME as this is the common style used
+ // by applications and is the setup most users will be using (e.g. Ubuntu
+ // desktop).
+ // If running on X and not using GNOME then just use a traditional title bar
+ // in case the window manager does more exotic layout, e.g. tiling.
+ // If running on Wayland assume the header bar will work (may need changing
+ // if future cases occur).
+ gboolean use_header_bar = TRUE;
+#ifdef GDK_WINDOWING_X11
+ GdkScreen* screen = gtk_window_get_screen(window);
+ if (GDK_IS_X11_SCREEN(screen)) {
+ const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
+ if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
+ use_header_bar = FALSE;
+ }
+ }
+#endif
+ if (use_header_bar) {
+ GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
+ gtk_widget_show(GTK_WIDGET(header_bar));
+ gtk_header_bar_set_title(header_bar, "tripn");
+ gtk_header_bar_set_show_close_button(header_bar, TRUE);
+ gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
+ } else {
+ gtk_window_set_title(window, "tripn");
+ }
+
+ gtk_window_set_default_size(window, 1280, 720);
+ gtk_widget_show(GTK_WIDGET(window));
+
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
+
+ FlView* view = fl_view_new(project);
+ gtk_widget_show(GTK_WIDGET(view));
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
+
+ fl_register_plugins(FL_PLUGIN_REGISTRY(view));
+
+ gtk_widget_grab_focus(GTK_WIDGET(view));
+}
+
+// Implements GApplication::local_command_line.
+static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
+ MyApplication* self = MY_APPLICATION(application);
+ // Strip out the first argument as it is the binary name.
+ self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
+
+ g_autoptr(GError) error = nullptr;
+ if (!g_application_register(application, nullptr, &error)) {
+ g_warning("Failed to register: %s", error->message);
+ *exit_status = 1;
+ return TRUE;
+ }
+
+ g_application_activate(application);
+ *exit_status = 0;
+
+ return TRUE;
+}
+
+// Implements GObject::dispose.
+static void my_application_dispose(GObject* object) {
+ MyApplication* self = MY_APPLICATION(object);
+ g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
+ G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
+}
+
+static void my_application_class_init(MyApplicationClass* klass) {
+ G_APPLICATION_CLASS(klass)->activate = my_application_activate;
+ G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
+ G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
+}
+
+static void my_application_init(MyApplication* self) {}
+
+MyApplication* my_application_new() {
+ return MY_APPLICATION(g_object_new(my_application_get_type(),
+ "application-id", APPLICATION_ID,
+ "flags", G_APPLICATION_NON_UNIQUE,
+ nullptr));
+}
diff --git a/frontend_mobile_app/tripn/linux/my_application.h b/frontend_mobile_app/tripn/linux/my_application.h
new file mode 100644
index 00000000..72271d5e
--- /dev/null
+++ b/frontend_mobile_app/tripn/linux/my_application.h
@@ -0,0 +1,18 @@
+#ifndef FLUTTER_MY_APPLICATION_H_
+#define FLUTTER_MY_APPLICATION_H_
+
+#include
+
+G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
+ GtkApplication)
+
+/**
+ * my_application_new:
+ *
+ * Creates a new Flutter-based application.
+ *
+ * Returns: a new #MyApplication.
+ */
+MyApplication* my_application_new();
+
+#endif // FLUTTER_MY_APPLICATION_H_
diff --git a/frontend_mobile_app/tripn/macos/.gitignore b/frontend_mobile_app/tripn/macos/.gitignore
new file mode 100644
index 00000000..746adbb6
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/frontend_mobile_app/tripn/macos/Flutter/Flutter-Debug.xcconfig b/frontend_mobile_app/tripn/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 00000000..c2efd0b6
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/frontend_mobile_app/tripn/macos/Flutter/Flutter-Release.xcconfig b/frontend_mobile_app/tripn/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 00000000..c2efd0b6
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/frontend_mobile_app/tripn/macos/Flutter/GeneratedPluginRegistrant.swift b/frontend_mobile_app/tripn/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 00000000..dd5a39f1
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,16 @@
+//
+// Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+import location
+import path_provider_foundation
+import video_player_avfoundation
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+ LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
+ PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
+ FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
+}
diff --git a/frontend_mobile_app/tripn/macos/Runner.xcodeproj/project.pbxproj b/frontend_mobile_app/tripn/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..5727bd58
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,695 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+ buildPhases = (
+ 33CC111E2044C6BF0003C045 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "Flutter Assemble";
+ productName = FLX;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC10EC2044A3C60003C045;
+ remoteInfo = Runner;
+ };
+ 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+ remoteInfo = FLX;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 33CC110E2044A8840003C045 /* Bundle Framework */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Bundle Framework";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; };
+ 33CC10ED2044A3C60003C045 /* tripn.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "tripn.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; };
+ 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
+ 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; };
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; };
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; };
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; };
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; };
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
+ 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 331C80D2294CF70F00263BE5 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EA2044A3C60003C045 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 331C80D6294CF71000263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C80D7294CF71000263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 33BA886A226E78AF003329D5 /* Configs */ = {
+ isa = PBXGroup;
+ children = (
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+ );
+ path = Configs;
+ sourceTree = "";
+ };
+ 33CC10E42044A3C60003C045 = {
+ isa = PBXGroup;
+ children = (
+ 33FAB671232836740065AC1E /* Runner */,
+ 33CEB47122A05771004F2AC0 /* Flutter */,
+ 331C80D6294CF71000263BE5 /* RunnerTests */,
+ 33CC10EE2044A3C60003C045 /* Products */,
+ D73912EC22F37F3D000D13A0 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 33CC10EE2044A3C60003C045 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10ED2044A3C60003C045 /* tripn.app */,
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 33CC11242044D66E0003C045 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */,
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */,
+ 33CC10F72044A3C60003C045 /* Info.plist */,
+ );
+ name = Resources;
+ path = ..;
+ sourceTree = "";
+ };
+ 33CEB47122A05771004F2AC0 /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+ );
+ path = Flutter;
+ sourceTree = "";
+ };
+ 33FAB671232836740065AC1E /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+ 33E51914231749380026EE4D /* Release.entitlements */,
+ 33CC11242044D66E0003C045 /* Resources */,
+ 33BA886A226E78AF003329D5 /* Configs */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C80D4294CF70F00263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 331C80D1294CF70F00263BE5 /* Sources */,
+ 331C80D2294CF70F00263BE5 /* Frameworks */,
+ 331C80D3294CF70F00263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 33CC10EC2044A3C60003C045 /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 33CC10E92044A3C60003C045 /* Sources */,
+ 33CC10EA2044A3C60003C045 /* Frameworks */,
+ 33CC10EB2044A3C60003C045 /* Resources */,
+ 33CC110E2044A8840003C045 /* Bundle Framework */,
+ 3399D490228B24CF009A79C7 /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */,
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 33CC10ED2044A3C60003C045 /* tripn.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 33CC10E52044A3C60003C045 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 0920;
+ LastUpgradeCheck = 1430;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C80D4294CF70F00263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 33CC10EC2044A3C60003C045;
+ };
+ 33CC10EC2044A3C60003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ LastSwiftMigration = 1100;
+ ProvisioningStyle = Automatic;
+ SystemCapabilities = {
+ com.apple.Sandbox = {
+ enabled = 1;
+ };
+ };
+ };
+ 33CC111A2044C6BA0003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ ProvisioningStyle = Manual;
+ };
+ };
+ };
+ buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 33CC10E42044A3C60003C045;
+ productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 33CC10EC2044A3C60003C045 /* Runner */,
+ 331C80D4294CF70F00263BE5 /* RunnerTests */,
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C80D3294CF70F00263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EB2044A3C60003C045 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3399D490228B24CF009A79C7 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+ };
+ 33CC111E2044C6BF0003C045 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ Flutter/ephemeral/FlutterInputs.xcfilelist,
+ );
+ inputPaths = (
+ Flutter/ephemeral/tripwire,
+ );
+ outputFileListPaths = (
+ Flutter/ephemeral/FlutterOutputs.xcfilelist,
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C80D1294CF70F00263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10E92044A3C60003C045 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC10EC2044A3C60003C045 /* Runner */;
+ targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;
+ };
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+ targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 33CC10F52044A3C60003C045 /* Base */,
+ );
+ name = MainMenu.xib;
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 331C80DB294CF71000263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/tripn.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/tripn";
+ };
+ name = Debug;
+ };
+ 331C80DC294CF71000263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/tripn.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/tripn";
+ };
+ name = Release;
+ };
+ 331C80DD294CF71000263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/tripn.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/tripn";
+ };
+ name = Profile;
+ };
+ 338D0CE9231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Profile;
+ };
+ 338D0CEA231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Profile;
+ };
+ 338D0CEB231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Profile;
+ };
+ 33CC10F92044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 33CC10FA2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Release;
+ };
+ 33CC10FC2044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 33CC10FD2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 33CC111C2044C6BA0003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 33CC111D2044C6BA0003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C80DB294CF71000263BE5 /* Debug */,
+ 331C80DC294CF71000263BE5 /* Release */,
+ 331C80DD294CF71000263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10F92044A3C60003C045 /* Debug */,
+ 33CC10FA2044A3C60003C045 /* Release */,
+ 338D0CE9231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10FC2044A3C60003C045 /* Debug */,
+ 33CC10FD2044A3C60003C045 /* Release */,
+ 338D0CEA231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC111C2044C6BA0003C045 /* Debug */,
+ 33CC111D2044C6BA0003C045 /* Release */,
+ 338D0CEB231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/frontend_mobile_app/tripn/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend_mobile_app/tripn/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/frontend_mobile_app/tripn/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend_mobile_app/tripn/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..e72cb4d6
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/macos/Runner.xcworkspace/contents.xcworkspacedata b/frontend_mobile_app/tripn/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..1d526a16
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend_mobile_app/tripn/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/frontend_mobile_app/tripn/macos/Runner/AppDelegate.swift b/frontend_mobile_app/tripn/macos/Runner/AppDelegate.swift
new file mode 100644
index 00000000..d53ef643
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/AppDelegate.swift
@@ -0,0 +1,9 @@
+import Cocoa
+import FlutterMacOS
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+ override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+ return true
+ }
+}
diff --git a/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..a2ec33f1
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images" : [
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_16.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_64.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_128.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_1024.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 00000000..82b6f9d9
Binary files /dev/null and b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 00000000..13b35eba
Binary files /dev/null and b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 00000000..0a3f5fa4
Binary files /dev/null and b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 00000000..bdb57226
Binary files /dev/null and b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 00000000..f083318e
Binary files /dev/null and b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 00000000..326c0e72
Binary files /dev/null and b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 00000000..2f1632cf
Binary files /dev/null and b/frontend_mobile_app/tripn/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/frontend_mobile_app/tripn/macos/Runner/Base.lproj/MainMenu.xib b/frontend_mobile_app/tripn/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 00000000..80e867a4
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/macos/Runner/Configs/AppInfo.xcconfig b/frontend_mobile_app/tripn/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 00000000..67de5731
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = tripn
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = com.example.tripn
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2023 com.example. All rights reserved.
diff --git a/frontend_mobile_app/tripn/macos/Runner/Configs/Debug.xcconfig b/frontend_mobile_app/tripn/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 00000000..36b0fd94
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/frontend_mobile_app/tripn/macos/Runner/Configs/Release.xcconfig b/frontend_mobile_app/tripn/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 00000000..dff4f495
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/frontend_mobile_app/tripn/macos/Runner/Configs/Warnings.xcconfig b/frontend_mobile_app/tripn/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 00000000..42bcbf47
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/frontend_mobile_app/tripn/macos/Runner/DebugProfile.entitlements b/frontend_mobile_app/tripn/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 00000000..dddb8a30
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/DebugProfile.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.cs.allow-jit
+
+ com.apple.security.network.server
+
+
+
diff --git a/frontend_mobile_app/tripn/macos/Runner/Info.plist b/frontend_mobile_app/tripn/macos/Runner/Info.plist
new file mode 100644
index 00000000..4789daa6
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ $(PRODUCT_COPYRIGHT)
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/frontend_mobile_app/tripn/macos/Runner/MainFlutterWindow.swift b/frontend_mobile_app/tripn/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 00000000..3cc05eb2
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,15 @@
+import Cocoa
+import FlutterMacOS
+
+class MainFlutterWindow: NSWindow {
+ override func awakeFromNib() {
+ let flutterViewController = FlutterViewController()
+ let windowFrame = self.frame
+ self.contentViewController = flutterViewController
+ self.setFrame(windowFrame, display: true)
+
+ RegisterGeneratedPlugins(registry: flutterViewController)
+
+ super.awakeFromNib()
+ }
+}
diff --git a/frontend_mobile_app/tripn/macos/Runner/Release.entitlements b/frontend_mobile_app/tripn/macos/Runner/Release.entitlements
new file mode 100644
index 00000000..852fa1a4
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/Runner/Release.entitlements
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+
+
diff --git a/frontend_mobile_app/tripn/macos/RunnerTests/RunnerTests.swift b/frontend_mobile_app/tripn/macos/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000..5418c9f5
--- /dev/null
+++ b/frontend_mobile_app/tripn/macos/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import FlutterMacOS
+import Cocoa
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/frontend_mobile_app/tripn/pubspec.lock b/frontend_mobile_app/tripn/pubspec.lock
new file mode 100644
index 00000000..5d4d5fa0
--- /dev/null
+++ b/frontend_mobile_app/tripn/pubspec.lock
@@ -0,0 +1,554 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ animated_notch_bottom_bar:
+ dependency: "direct main"
+ description:
+ name: animated_notch_bottom_bar
+ sha256: "0fb99df2834bb1c235b59d6888f31fd958565e0a79c5e55d9d430a923d9ea915"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
+ archive:
+ dependency: transitive
+ description:
+ name: archive
+ sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.4.6"
+ async:
+ dependency: transitive
+ description:
+ name: async
+ sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.11.0"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.0"
+ clock:
+ dependency: transitive
+ description:
+ name: clock
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.17.2"
+ convert:
+ dependency: transitive
+ description:
+ name: convert
+ sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.1"
+ crypto:
+ dependency: transitive
+ description:
+ name: crypto
+ sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.3"
+ csslib:
+ dependency: transitive
+ description:
+ name: csslib
+ sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.1"
+ ffi:
+ dependency: transitive
+ description:
+ name: ffi
+ sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_lints:
+ dependency: "direct dev"
+ description:
+ name: flutter_lints
+ sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.3"
+ flutter_plugin_android_lifecycle:
+ dependency: transitive
+ description:
+ name: flutter_plugin_android_lifecycle
+ sha256: f185ac890306b5779ecbd611f52502d8d4d63d27703ef73161ca0407e815f02c
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.16"
+ flutter_polyline_points:
+ dependency: "direct main"
+ description:
+ name: flutter_polyline_points
+ sha256: "0e07862139cb65a88789cd6efbe284c0b6f1fcb5ed5ec87781759c48190d84b9"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.0"
+ flutter_rating_stars:
+ dependency: "direct main"
+ description:
+ name: flutter_rating_stars
+ sha256: e03a85bd5c360fd27ef29faa931c98dc58e16387e328071c07bcf3a4c10000af
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.3+4"
+ flutter_test:
+ dependency: "direct dev"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_web_plugins:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ google_fonts:
+ dependency: "direct main"
+ description:
+ name: google_fonts
+ sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.0"
+ google_maps:
+ dependency: transitive
+ description:
+ name: google_maps
+ sha256: "555d5d736339b0478e821167ac521c810d7b51c3b2734e6802a9f046b64ea37a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.3.0"
+ google_maps_flutter:
+ dependency: "direct main"
+ description:
+ name: google_maps_flutter
+ sha256: d4914cb38b3dcb62c39c085d968d434de0f8050f00f4d9f5ba4a7c7e004934cb
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.5.0"
+ google_maps_flutter_android:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_android
+ sha256: e6cb018169e49332f88d23b1d2119b09e8ab4e7d3a1b889a1b7b3fd113e034ba
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.5.1"
+ google_maps_flutter_ios:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_ios
+ sha256: "2aa28eb9b9d5dfdce6932a7b7f096430bf83a1a09b4e21e81939351f407c787f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.2"
+ google_maps_flutter_platform_interface:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_platform_interface
+ sha256: a3e9e6896501e566d902c6c69f010834d410ef4b7b5c18b90c77e871c86b7907
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.1"
+ google_maps_flutter_web:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_web
+ sha256: f893d1542c6562bc8299ef768fbbe92ade83c220ab3209b9477ec9f81ad585e4
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.5.4+2"
+ html:
+ dependency: transitive
+ description:
+ name: html
+ sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.15.4"
+ http:
+ dependency: "direct main"
+ description:
+ name: http
+ sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ http_parser:
+ dependency: transitive
+ description:
+ name: http_parser
+ sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.2"
+ js:
+ dependency: transitive
+ description:
+ name: js
+ sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.7"
+ js_wrapping:
+ dependency: transitive
+ description:
+ name: js_wrapping
+ sha256: e385980f7c76a8c1c9a560dfb623b890975841542471eade630b2871d243851c
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.4"
+ lints:
+ dependency: transitive
+ description:
+ name: lints
+ sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ location:
+ dependency: "direct main"
+ description:
+ name: location
+ sha256: "06be54f682c9073cbfec3899eb9bc8ed90faa0e17735c9d9fa7fe426f5be1dd1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.0.3"
+ location_platform_interface:
+ dependency: transitive
+ description:
+ name: location_platform_interface
+ sha256: "8aa1d34eeecc979d7c9fe372931d84f6d2ebbd52226a54fe1620de6fdc0753b1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
+ location_web:
+ dependency: transitive
+ description:
+ name: location_web
+ sha256: ec484c66e8a4ff1ee5d044c203f4b6b71e3a0556a97b739a5bc9616de672412b
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.2.0"
+ lottie:
+ dependency: "direct main"
+ description:
+ name: lottie
+ sha256: a93542cc2d60a7057255405f62252533f8e8956e7e06754955669fd32fb4b216
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.7.0"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.12.16"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.5.0"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.1"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.8.3"
+ path_provider:
+ dependency: transitive
+ description:
+ name: path_provider
+ sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ path_provider_android:
+ dependency: transitive
+ description:
+ name: path_provider_android
+ sha256: "6b8b19bd80da4f11ce91b2d1fb931f3006911477cec227cce23d3253d80df3f1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.0"
+ path_provider_foundation:
+ dependency: transitive
+ description:
+ name: path_provider_foundation
+ sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.1"
+ path_provider_linux:
+ dependency: transitive
+ description:
+ name: path_provider_linux
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.1"
+ path_provider_platform_interface:
+ dependency: transitive
+ description:
+ name: path_provider_platform_interface
+ sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ path_provider_windows:
+ dependency: transitive
+ description:
+ name: path_provider_windows
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.1"
+ platform:
+ dependency: transitive
+ description:
+ name: platform
+ sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.3"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.6"
+ pointycastle:
+ dependency: transitive
+ description:
+ name: pointycastle
+ sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.7.3"
+ sanitize_html:
+ dependency: transitive
+ description:
+ name: sanitize_html
+ sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
+ sizer:
+ dependency: "direct main"
+ description:
+ name: sizer
+ sha256: d2b3cb6cbc4a637f508dacd786bae55df31e5fc088044248a43e4fd1e050c117
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.15"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.99"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.10.0"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.11.0"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ stream_transform:
+ dependency: transitive
+ description:
+ name: stream_transform
+ sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.0"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.0"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.2"
+ universal_io:
+ dependency: transitive
+ description:
+ name: universal_io
+ sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.2"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ video_player:
+ dependency: "direct main"
+ description:
+ name: video_player
+ sha256: e16f0a83601a78d165dabc17e4dac50997604eb9e4cc76e10fa219046b70cef3
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.8.1"
+ video_player_android:
+ dependency: transitive
+ description:
+ name: video_player_android
+ sha256: "3fe89ab07fdbce786e7eb25b58532d6eaf189ceddc091cb66cba712f8d9e8e55"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.10"
+ video_player_avfoundation:
+ dependency: transitive
+ description:
+ name: video_player_avfoundation
+ sha256: bc923884640d6dc403050586eb40713cdb8d1d84e6886d8aca50ab04c59124c2
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.5.2"
+ video_player_platform_interface:
+ dependency: transitive
+ description:
+ name: video_player_platform_interface
+ sha256: be72301bf2c0150ab35a8c34d66e5a99de525f6de1e8d27c0672b836fe48f73a
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.2.1"
+ video_player_web:
+ dependency: transitive
+ description:
+ name: video_player_web
+ sha256: ab7a462b07d9ca80bed579e30fb3bce372468f1b78642e0911b10600f2c5cb5b
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ web:
+ dependency: transitive
+ description:
+ name: web
+ sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.1.4-beta"
+ win32:
+ dependency: transitive
+ description:
+ name: win32
+ sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.0.9"
+ xdg_directories:
+ dependency: transitive
+ description:
+ name: xdg_directories
+ sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.3"
+sdks:
+ dart: ">=3.1.2 <4.0.0"
+ flutter: ">=3.13.0"
diff --git a/frontend_mobile_app/tripn/pubspec.yaml b/frontend_mobile_app/tripn/pubspec.yaml
new file mode 100644
index 00000000..54ba0fc8
--- /dev/null
+++ b/frontend_mobile_app/tripn/pubspec.yaml
@@ -0,0 +1,34 @@
+name: tripn
+description: A new Flutter project.
+publish_to: 'none'
+version: 0.1.0
+
+environment:
+ sdk: '>=3.1.2 <4.0.0'
+
+dependencies:
+ animated_notch_bottom_bar: ^1.0.0
+ flutter:
+ sdk: flutter
+ flutter_polyline_points: ^2.0.0
+ flutter_rating_stars: ^1.0.3+4
+ google_fonts: ^6.1.0
+ google_maps_flutter: ^2.5.0
+ http: ^1.1.0
+ location: ^5.0.3
+ lottie: ^2.7.0
+ sizer: ^2.0.15
+ video_player: ^2.8.1
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ flutter_lints: ^2.0.0
+
+flutter:
+ uses-material-design: true
+ assets:
+ - assets/images/
+ - assets/videos/
+
+
diff --git a/frontend_mobile_app/tripn/web/favicon.png b/frontend_mobile_app/tripn/web/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/frontend_mobile_app/tripn/web/favicon.png differ
diff --git a/frontend_mobile_app/tripn/web/icons/Icon-192.png b/frontend_mobile_app/tripn/web/icons/Icon-192.png
new file mode 100644
index 00000000..b749bfef
Binary files /dev/null and b/frontend_mobile_app/tripn/web/icons/Icon-192.png differ
diff --git a/frontend_mobile_app/tripn/web/icons/Icon-512.png b/frontend_mobile_app/tripn/web/icons/Icon-512.png
new file mode 100644
index 00000000..88cfd48d
Binary files /dev/null and b/frontend_mobile_app/tripn/web/icons/Icon-512.png differ
diff --git a/frontend_mobile_app/tripn/web/icons/Icon-maskable-192.png b/frontend_mobile_app/tripn/web/icons/Icon-maskable-192.png
new file mode 100644
index 00000000..eb9b4d76
Binary files /dev/null and b/frontend_mobile_app/tripn/web/icons/Icon-maskable-192.png differ
diff --git a/frontend_mobile_app/tripn/web/icons/Icon-maskable-512.png b/frontend_mobile_app/tripn/web/icons/Icon-maskable-512.png
new file mode 100644
index 00000000..d69c5669
Binary files /dev/null and b/frontend_mobile_app/tripn/web/icons/Icon-maskable-512.png differ
diff --git a/frontend_mobile_app/tripn/web/index.html b/frontend_mobile_app/tripn/web/index.html
new file mode 100644
index 00000000..b6158742
--- /dev/null
+++ b/frontend_mobile_app/tripn/web/index.html
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tripn
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/web/manifest.json b/frontend_mobile_app/tripn/web/manifest.json
new file mode 100644
index 00000000..56b6be18
--- /dev/null
+++ b/frontend_mobile_app/tripn/web/manifest.json
@@ -0,0 +1,35 @@
+{
+ "name": "tripn",
+ "short_name": "tripn",
+ "start_url": ".",
+ "display": "standalone",
+ "background_color": "#0175C2",
+ "theme_color": "#0175C2",
+ "description": "A new Flutter project.",
+ "orientation": "portrait-primary",
+ "prefer_related_applications": false,
+ "icons": [
+ {
+ "src": "icons/Icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-maskable-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "icons/Icon-maskable-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ]
+}
diff --git a/frontend_mobile_app/tripn/windows/.gitignore b/frontend_mobile_app/tripn/windows/.gitignore
new file mode 100644
index 00000000..d492d0d9
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/.gitignore
@@ -0,0 +1,17 @@
+flutter/ephemeral/
+
+# Visual Studio user-specific files.
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# Visual Studio build-related files.
+x64/
+x86/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
diff --git a/frontend_mobile_app/tripn/windows/CMakeLists.txt b/frontend_mobile_app/tripn/windows/CMakeLists.txt
new file mode 100644
index 00000000..1725040d
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/CMakeLists.txt
@@ -0,0 +1,102 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.14)
+project(tripn LANGUAGES CXX)
+
+# The name of the executable created for the application. Change this to change
+# the on-disk name of your application.
+set(BINARY_NAME "tripn")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(VERSION 3.14...3.25)
+
+# Define build configuration option.
+get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if(IS_MULTICONFIG)
+ set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
+ CACHE STRING "" FORCE)
+else()
+ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+ endif()
+endif()
+# Define settings for the Profile build mode.
+set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
+set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
+set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
+set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
+
+# Use Unicode for all projects.
+add_definitions(-DUNICODE -D_UNICODE)
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_17)
+ target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
+ target_compile_options(${TARGET} PRIVATE /EHsc)
+ target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
+ target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# Application build; see runner/CMakeLists.txt.
+add_subdirectory("runner")
+
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# Support files are copied into place next to the executable, so that it can
+# run in place. This is done instead of making a separate bundle (as on Linux)
+# so that building and running from within Visual Studio will work.
+set(BUILD_BUNDLE_DIR "$")
+# Make the "install" step default, as it's required to run.
+set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+if(PLUGIN_BUNDLED_LIBRARIES)
+ install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ CONFIGURATIONS Profile;Release
+ COMPONENT Runtime)
diff --git a/frontend_mobile_app/tripn/windows/flutter/CMakeLists.txt b/frontend_mobile_app/tripn/windows/flutter/CMakeLists.txt
new file mode 100644
index 00000000..930d2071
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/flutter/CMakeLists.txt
@@ -0,0 +1,104 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.14)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
+
+# === Flutter Library ===
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "flutter_export.h"
+ "flutter_windows.h"
+ "flutter_messenger.h"
+ "flutter_plugin_registrar.h"
+ "flutter_texture_registrar.h"
+)
+list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
+add_dependencies(flutter flutter_assemble)
+
+# === Wrapper ===
+list(APPEND CPP_WRAPPER_SOURCES_CORE
+ "core_implementations.cc"
+ "standard_codec.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
+ "plugin_registrar.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_APP
+ "flutter_engine.cc"
+ "flutter_view_controller.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
+
+# Wrapper sources needed for a plugin.
+add_library(flutter_wrapper_plugin STATIC
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_PLUGIN}
+)
+apply_standard_settings(flutter_wrapper_plugin)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+ POSITION_INDEPENDENT_CODE ON)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+ CXX_VISIBILITY_PRESET hidden)
+target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
+target_include_directories(flutter_wrapper_plugin PUBLIC
+ "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_plugin flutter_assemble)
+
+# Wrapper sources needed for the runner.
+add_library(flutter_wrapper_app STATIC
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_APP}
+)
+apply_standard_settings(flutter_wrapper_app)
+target_link_libraries(flutter_wrapper_app PUBLIC flutter)
+target_include_directories(flutter_wrapper_app PUBLIC
+ "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_app flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
+set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
+ ${CPP_WRAPPER_SOURCES_APP}
+ ${PHONY_OUTPUT}
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
+ windows-x64 $
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_PLUGIN}
+ ${CPP_WRAPPER_SOURCES_APP}
+)
diff --git a/frontend_mobile_app/tripn/windows/flutter/generated_plugin_registrant.cc b/frontend_mobile_app/tripn/windows/flutter/generated_plugin_registrant.cc
new file mode 100644
index 00000000..8b6d4680
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,11 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+
+void RegisterPlugins(flutter::PluginRegistry* registry) {
+}
diff --git a/frontend_mobile_app/tripn/windows/flutter/generated_plugin_registrant.h b/frontend_mobile_app/tripn/windows/flutter/generated_plugin_registrant.h
new file mode 100644
index 00000000..dc139d85
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/flutter/generated_plugin_registrant.h
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GENERATED_PLUGIN_REGISTRANT_
+#define GENERATED_PLUGIN_REGISTRANT_
+
+#include
+
+// Registers Flutter plugins.
+void RegisterPlugins(flutter::PluginRegistry* registry);
+
+#endif // GENERATED_PLUGIN_REGISTRANT_
diff --git a/frontend_mobile_app/tripn/windows/flutter/generated_plugins.cmake b/frontend_mobile_app/tripn/windows/flutter/generated_plugins.cmake
new file mode 100644
index 00000000..b93c4c30
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/flutter/generated_plugins.cmake
@@ -0,0 +1,23 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+)
+
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})
+ target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/frontend_mobile_app/tripn/windows/runner/CMakeLists.txt b/frontend_mobile_app/tripn/windows/runner/CMakeLists.txt
new file mode 100644
index 00000000..394917c0
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/CMakeLists.txt
@@ -0,0 +1,40 @@
+cmake_minimum_required(VERSION 3.14)
+project(runner LANGUAGES CXX)
+
+# Define the application target. To change its name, change BINARY_NAME in the
+# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
+# work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME} WIN32
+ "flutter_window.cpp"
+ "main.cpp"
+ "utils.cpp"
+ "win32_window.cpp"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+ "Runner.rc"
+ "runner.exe.manifest"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add preprocessor definitions for the build version.
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}")
+
+# Disable Windows macros that collide with C++ standard library functions.
+target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
+
+# Add dependency libraries and include directories. Add any application-specific
+# dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
+target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib")
+target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
diff --git a/frontend_mobile_app/tripn/windows/runner/Runner.rc b/frontend_mobile_app/tripn/windows/runner/Runner.rc
new file mode 100644
index 00000000..a75d0cfe
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/Runner.rc
@@ -0,0 +1,121 @@
+// Microsoft Visual C++ generated resource script.
+//
+#pragma code_page(65001)
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_APP_ICON ICON "resources\\app_icon.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)
+#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD
+#else
+#define VERSION_AS_NUMBER 1,0,0,0
+#endif
+
+#if defined(FLUTTER_VERSION)
+#define VERSION_AS_STRING FLUTTER_VERSION
+#else
+#define VERSION_AS_STRING "1.0.0"
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION VERSION_AS_NUMBER
+ PRODUCTVERSION VERSION_AS_NUMBER
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904e4"
+ BEGIN
+ VALUE "CompanyName", "com.example" "\0"
+ VALUE "FileDescription", "tripn" "\0"
+ VALUE "FileVersion", VERSION_AS_STRING "\0"
+ VALUE "InternalName", "tripn" "\0"
+ VALUE "LegalCopyright", "Copyright (C) 2023 com.example. All rights reserved." "\0"
+ VALUE "OriginalFilename", "tripn.exe" "\0"
+ VALUE "ProductName", "tripn" "\0"
+ VALUE "ProductVersion", VERSION_AS_STRING "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#endif // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/frontend_mobile_app/tripn/windows/runner/flutter_window.cpp b/frontend_mobile_app/tripn/windows/runner/flutter_window.cpp
new file mode 100644
index 00000000..955ee303
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/flutter_window.cpp
@@ -0,0 +1,71 @@
+#include "flutter_window.h"
+
+#include
+
+#include "flutter/generated_plugin_registrant.h"
+
+FlutterWindow::FlutterWindow(const flutter::DartProject& project)
+ : project_(project) {}
+
+FlutterWindow::~FlutterWindow() {}
+
+bool FlutterWindow::OnCreate() {
+ if (!Win32Window::OnCreate()) {
+ return false;
+ }
+
+ RECT frame = GetClientArea();
+
+ // The size here must match the window dimensions to avoid unnecessary surface
+ // creation / destruction in the startup path.
+ flutter_controller_ = std::make_unique(
+ frame.right - frame.left, frame.bottom - frame.top, project_);
+ // Ensure that basic setup of the controller was successful.
+ if (!flutter_controller_->engine() || !flutter_controller_->view()) {
+ return false;
+ }
+ RegisterPlugins(flutter_controller_->engine());
+ SetChildContent(flutter_controller_->view()->GetNativeWindow());
+
+ flutter_controller_->engine()->SetNextFrameCallback([&]() {
+ this->Show();
+ });
+
+ // Flutter can complete the first frame before the "show window" callback is
+ // registered. The following call ensures a frame is pending to ensure the
+ // window is shown. It is a no-op if the first frame hasn't completed yet.
+ flutter_controller_->ForceRedraw();
+
+ return true;
+}
+
+void FlutterWindow::OnDestroy() {
+ if (flutter_controller_) {
+ flutter_controller_ = nullptr;
+ }
+
+ Win32Window::OnDestroy();
+}
+
+LRESULT
+FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ // Give Flutter, including plugins, an opportunity to handle window messages.
+ if (flutter_controller_) {
+ std::optional result =
+ flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
+ lparam);
+ if (result) {
+ return *result;
+ }
+ }
+
+ switch (message) {
+ case WM_FONTCHANGE:
+ flutter_controller_->engine()->ReloadSystemFonts();
+ break;
+ }
+
+ return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
+}
diff --git a/frontend_mobile_app/tripn/windows/runner/flutter_window.h b/frontend_mobile_app/tripn/windows/runner/flutter_window.h
new file mode 100644
index 00000000..6da0652f
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/flutter_window.h
@@ -0,0 +1,33 @@
+#ifndef RUNNER_FLUTTER_WINDOW_H_
+#define RUNNER_FLUTTER_WINDOW_H_
+
+#include
+#include
+
+#include
+
+#include "win32_window.h"
+
+// A window that does nothing but host a Flutter view.
+class FlutterWindow : public Win32Window {
+ public:
+ // Creates a new FlutterWindow hosting a Flutter view running |project|.
+ explicit FlutterWindow(const flutter::DartProject& project);
+ virtual ~FlutterWindow();
+
+ protected:
+ // Win32Window:
+ bool OnCreate() override;
+ void OnDestroy() override;
+ LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
+ LPARAM const lparam) noexcept override;
+
+ private:
+ // The project to run.
+ flutter::DartProject project_;
+
+ // The Flutter instance hosted by this window.
+ std::unique_ptr flutter_controller_;
+};
+
+#endif // RUNNER_FLUTTER_WINDOW_H_
diff --git a/frontend_mobile_app/tripn/windows/runner/main.cpp b/frontend_mobile_app/tripn/windows/runner/main.cpp
new file mode 100644
index 00000000..0c1888bc
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/main.cpp
@@ -0,0 +1,43 @@
+#include
+#include
+#include
+
+#include "flutter_window.h"
+#include "utils.h"
+
+int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
+ _In_ wchar_t *command_line, _In_ int show_command) {
+ // Attach to console when present (e.g., 'flutter run') or create a
+ // new console when running with a debugger.
+ if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
+ CreateAndAttachConsole();
+ }
+
+ // Initialize COM, so that it is available for use in the library and/or
+ // plugins.
+ ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
+
+ flutter::DartProject project(L"data");
+
+ std::vector command_line_arguments =
+ GetCommandLineArguments();
+
+ project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
+
+ FlutterWindow window(project);
+ Win32Window::Point origin(10, 10);
+ Win32Window::Size size(1280, 720);
+ if (!window.Create(L"tripn", origin, size)) {
+ return EXIT_FAILURE;
+ }
+ window.SetQuitOnClose(true);
+
+ ::MSG msg;
+ while (::GetMessage(&msg, nullptr, 0, 0)) {
+ ::TranslateMessage(&msg);
+ ::DispatchMessage(&msg);
+ }
+
+ ::CoUninitialize();
+ return EXIT_SUCCESS;
+}
diff --git a/frontend_mobile_app/tripn/windows/runner/resource.h b/frontend_mobile_app/tripn/windows/runner/resource.h
new file mode 100644
index 00000000..66a65d1e
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/resource.h
@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by Runner.rc
+//
+#define IDI_APP_ICON 101
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/frontend_mobile_app/tripn/windows/runner/resources/app_icon.ico b/frontend_mobile_app/tripn/windows/runner/resources/app_icon.ico
new file mode 100644
index 00000000..c04e20ca
Binary files /dev/null and b/frontend_mobile_app/tripn/windows/runner/resources/app_icon.ico differ
diff --git a/frontend_mobile_app/tripn/windows/runner/runner.exe.manifest b/frontend_mobile_app/tripn/windows/runner/runner.exe.manifest
new file mode 100644
index 00000000..a42ea768
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/runner.exe.manifest
@@ -0,0 +1,20 @@
+
+
+
+
+ PerMonitorV2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend_mobile_app/tripn/windows/runner/utils.cpp b/frontend_mobile_app/tripn/windows/runner/utils.cpp
new file mode 100644
index 00000000..b2b08734
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/utils.cpp
@@ -0,0 +1,65 @@
+#include "utils.h"
+
+#include
+#include
+#include
+#include
+
+#include
+
+void CreateAndAttachConsole() {
+ if (::AllocConsole()) {
+ FILE *unused;
+ if (freopen_s(&unused, "CONOUT$", "w", stdout)) {
+ _dup2(_fileno(stdout), 1);
+ }
+ if (freopen_s(&unused, "CONOUT$", "w", stderr)) {
+ _dup2(_fileno(stdout), 2);
+ }
+ std::ios::sync_with_stdio();
+ FlutterDesktopResyncOutputStreams();
+ }
+}
+
+std::vector GetCommandLineArguments() {
+ // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
+ int argc;
+ wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
+ if (argv == nullptr) {
+ return std::vector();
+ }
+
+ std::vector command_line_arguments;
+
+ // Skip the first argument as it's the binary name.
+ for (int i = 1; i < argc; i++) {
+ command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
+ }
+
+ ::LocalFree(argv);
+
+ return command_line_arguments;
+}
+
+std::string Utf8FromUtf16(const wchar_t* utf16_string) {
+ if (utf16_string == nullptr) {
+ return std::string();
+ }
+ int target_length = ::WideCharToMultiByte(
+ CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
+ -1, nullptr, 0, nullptr, nullptr)
+ -1; // remove the trailing null character
+ int input_length = (int)wcslen(utf16_string);
+ std::string utf8_string;
+ if (target_length <= 0 || target_length > utf8_string.max_size()) {
+ return utf8_string;
+ }
+ utf8_string.resize(target_length);
+ int converted_length = ::WideCharToMultiByte(
+ CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
+ input_length, utf8_string.data(), target_length, nullptr, nullptr);
+ if (converted_length == 0) {
+ return std::string();
+ }
+ return utf8_string;
+}
diff --git a/frontend_mobile_app/tripn/windows/runner/utils.h b/frontend_mobile_app/tripn/windows/runner/utils.h
new file mode 100644
index 00000000..3879d547
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/utils.h
@@ -0,0 +1,19 @@
+#ifndef RUNNER_UTILS_H_
+#define RUNNER_UTILS_H_
+
+#include
+#include
+
+// Creates a console for the process, and redirects stdout and stderr to
+// it for both the runner and the Flutter library.
+void CreateAndAttachConsole();
+
+// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
+// encoded in UTF-8. Returns an empty std::string on failure.
+std::string Utf8FromUtf16(const wchar_t* utf16_string);
+
+// Gets the command line arguments passed in as a std::vector,
+// encoded in UTF-8. Returns an empty std::vector on failure.
+std::vector GetCommandLineArguments();
+
+#endif // RUNNER_UTILS_H_
diff --git a/frontend_mobile_app/tripn/windows/runner/win32_window.cpp b/frontend_mobile_app/tripn/windows/runner/win32_window.cpp
new file mode 100644
index 00000000..60608d0f
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/win32_window.cpp
@@ -0,0 +1,288 @@
+#include "win32_window.h"
+
+#include
+#include
+
+#include "resource.h"
+
+namespace {
+
+/// Window attribute that enables dark mode window decorations.
+///
+/// Redefined in case the developer's machine has a Windows SDK older than
+/// version 10.0.22000.0.
+/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
+#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
+#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
+#endif
+
+constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
+
+/// Registry key for app theme preference.
+///
+/// A value of 0 indicates apps should use dark mode. A non-zero or missing
+/// value indicates apps should use light mode.
+constexpr const wchar_t kGetPreferredBrightnessRegKey[] =
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
+constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme";
+
+// The number of Win32Window objects that currently exist.
+static int g_active_window_count = 0;
+
+using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
+
+// Scale helper to convert logical scaler values to physical using passed in
+// scale factor
+int Scale(int source, double scale_factor) {
+ return static_cast(source * scale_factor);
+}
+
+// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
+// This API is only needed for PerMonitor V1 awareness mode.
+void EnableFullDpiSupportIfAvailable(HWND hwnd) {
+ HMODULE user32_module = LoadLibraryA("User32.dll");
+ if (!user32_module) {
+ return;
+ }
+ auto enable_non_client_dpi_scaling =
+ reinterpret_cast(
+ GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
+ if (enable_non_client_dpi_scaling != nullptr) {
+ enable_non_client_dpi_scaling(hwnd);
+ }
+ FreeLibrary(user32_module);
+}
+
+} // namespace
+
+// Manages the Win32Window's window class registration.
+class WindowClassRegistrar {
+ public:
+ ~WindowClassRegistrar() = default;
+
+ // Returns the singleton registrar instance.
+ static WindowClassRegistrar* GetInstance() {
+ if (!instance_) {
+ instance_ = new WindowClassRegistrar();
+ }
+ return instance_;
+ }
+
+ // Returns the name of the window class, registering the class if it hasn't
+ // previously been registered.
+ const wchar_t* GetWindowClass();
+
+ // Unregisters the window class. Should only be called if there are no
+ // instances of the window.
+ void UnregisterWindowClass();
+
+ private:
+ WindowClassRegistrar() = default;
+
+ static WindowClassRegistrar* instance_;
+
+ bool class_registered_ = false;
+};
+
+WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
+
+const wchar_t* WindowClassRegistrar::GetWindowClass() {
+ if (!class_registered_) {
+ WNDCLASS window_class{};
+ window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
+ window_class.lpszClassName = kWindowClassName;
+ window_class.style = CS_HREDRAW | CS_VREDRAW;
+ window_class.cbClsExtra = 0;
+ window_class.cbWndExtra = 0;
+ window_class.hInstance = GetModuleHandle(nullptr);
+ window_class.hIcon =
+ LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
+ window_class.hbrBackground = 0;
+ window_class.lpszMenuName = nullptr;
+ window_class.lpfnWndProc = Win32Window::WndProc;
+ RegisterClass(&window_class);
+ class_registered_ = true;
+ }
+ return kWindowClassName;
+}
+
+void WindowClassRegistrar::UnregisterWindowClass() {
+ UnregisterClass(kWindowClassName, nullptr);
+ class_registered_ = false;
+}
+
+Win32Window::Win32Window() {
+ ++g_active_window_count;
+}
+
+Win32Window::~Win32Window() {
+ --g_active_window_count;
+ Destroy();
+}
+
+bool Win32Window::Create(const std::wstring& title,
+ const Point& origin,
+ const Size& size) {
+ Destroy();
+
+ const wchar_t* window_class =
+ WindowClassRegistrar::GetInstance()->GetWindowClass();
+
+ const POINT target_point = {static_cast(origin.x),
+ static_cast(origin.y)};
+ HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
+ UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
+ double scale_factor = dpi / 96.0;
+
+ HWND window = CreateWindow(
+ window_class, title.c_str(), WS_OVERLAPPEDWINDOW,
+ Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
+ Scale(size.width, scale_factor), Scale(size.height, scale_factor),
+ nullptr, nullptr, GetModuleHandle(nullptr), this);
+
+ if (!window) {
+ return false;
+ }
+
+ UpdateTheme(window);
+
+ return OnCreate();
+}
+
+bool Win32Window::Show() {
+ return ShowWindow(window_handle_, SW_SHOWNORMAL);
+}
+
+// static
+LRESULT CALLBACK Win32Window::WndProc(HWND const window,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ if (message == WM_NCCREATE) {
+ auto window_struct = reinterpret_cast(lparam);
+ SetWindowLongPtr(window, GWLP_USERDATA,
+ reinterpret_cast(window_struct->lpCreateParams));
+
+ auto that = static_cast(window_struct->lpCreateParams);
+ EnableFullDpiSupportIfAvailable(window);
+ that->window_handle_ = window;
+ } else if (Win32Window* that = GetThisFromHandle(window)) {
+ return that->MessageHandler(window, message, wparam, lparam);
+ }
+
+ return DefWindowProc(window, message, wparam, lparam);
+}
+
+LRESULT
+Win32Window::MessageHandler(HWND hwnd,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ switch (message) {
+ case WM_DESTROY:
+ window_handle_ = nullptr;
+ Destroy();
+ if (quit_on_close_) {
+ PostQuitMessage(0);
+ }
+ return 0;
+
+ case WM_DPICHANGED: {
+ auto newRectSize = reinterpret_cast(lparam);
+ LONG newWidth = newRectSize->right - newRectSize->left;
+ LONG newHeight = newRectSize->bottom - newRectSize->top;
+
+ SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,
+ newHeight, SWP_NOZORDER | SWP_NOACTIVATE);
+
+ return 0;
+ }
+ case WM_SIZE: {
+ RECT rect = GetClientArea();
+ if (child_content_ != nullptr) {
+ // Size and position the child window.
+ MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,
+ rect.bottom - rect.top, TRUE);
+ }
+ return 0;
+ }
+
+ case WM_ACTIVATE:
+ if (child_content_ != nullptr) {
+ SetFocus(child_content_);
+ }
+ return 0;
+
+ case WM_DWMCOLORIZATIONCOLORCHANGED:
+ UpdateTheme(hwnd);
+ return 0;
+ }
+
+ return DefWindowProc(window_handle_, message, wparam, lparam);
+}
+
+void Win32Window::Destroy() {
+ OnDestroy();
+
+ if (window_handle_) {
+ DestroyWindow(window_handle_);
+ window_handle_ = nullptr;
+ }
+ if (g_active_window_count == 0) {
+ WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
+ }
+}
+
+Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
+ return reinterpret_cast(
+ GetWindowLongPtr(window, GWLP_USERDATA));
+}
+
+void Win32Window::SetChildContent(HWND content) {
+ child_content_ = content;
+ SetParent(content, window_handle_);
+ RECT frame = GetClientArea();
+
+ MoveWindow(content, frame.left, frame.top, frame.right - frame.left,
+ frame.bottom - frame.top, true);
+
+ SetFocus(child_content_);
+}
+
+RECT Win32Window::GetClientArea() {
+ RECT frame;
+ GetClientRect(window_handle_, &frame);
+ return frame;
+}
+
+HWND Win32Window::GetHandle() {
+ return window_handle_;
+}
+
+void Win32Window::SetQuitOnClose(bool quit_on_close) {
+ quit_on_close_ = quit_on_close;
+}
+
+bool Win32Window::OnCreate() {
+ // No-op; provided for subclasses.
+ return true;
+}
+
+void Win32Window::OnDestroy() {
+ // No-op; provided for subclasses.
+}
+
+void Win32Window::UpdateTheme(HWND const window) {
+ DWORD light_mode;
+ DWORD light_mode_size = sizeof(light_mode);
+ LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey,
+ kGetPreferredBrightnessRegValue,
+ RRF_RT_REG_DWORD, nullptr, &light_mode,
+ &light_mode_size);
+
+ if (result == ERROR_SUCCESS) {
+ BOOL enable_dark_mode = light_mode == 0;
+ DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE,
+ &enable_dark_mode, sizeof(enable_dark_mode));
+ }
+}
diff --git a/frontend_mobile_app/tripn/windows/runner/win32_window.h b/frontend_mobile_app/tripn/windows/runner/win32_window.h
new file mode 100644
index 00000000..e901dde6
--- /dev/null
+++ b/frontend_mobile_app/tripn/windows/runner/win32_window.h
@@ -0,0 +1,102 @@
+#ifndef RUNNER_WIN32_WINDOW_H_
+#define RUNNER_WIN32_WINDOW_H_
+
+#include
+
+#include
+#include
+#include
+
+// A class abstraction for a high DPI-aware Win32 Window. Intended to be
+// inherited from by classes that wish to specialize with custom
+// rendering and input handling
+class Win32Window {
+ public:
+ struct Point {
+ unsigned int x;
+ unsigned int y;
+ Point(unsigned int x, unsigned int y) : x(x), y(y) {}
+ };
+
+ struct Size {
+ unsigned int width;
+ unsigned int height;
+ Size(unsigned int width, unsigned int height)
+ : width(width), height(height) {}
+ };
+
+ Win32Window();
+ virtual ~Win32Window();
+
+ // Creates a win32 window with |title| that is positioned and sized using
+ // |origin| and |size|. New windows are created on the default monitor. Window
+ // sizes are specified to the OS in physical pixels, hence to ensure a
+ // consistent size this function will scale the inputted width and height as
+ // as appropriate for the default monitor. The window is invisible until
+ // |Show| is called. Returns true if the window was created successfully.
+ bool Create(const std::wstring& title, const Point& origin, const Size& size);
+
+ // Show the current window. Returns true if the window was successfully shown.
+ bool Show();
+
+ // Release OS resources associated with window.
+ void Destroy();
+
+ // Inserts |content| into the window tree.
+ void SetChildContent(HWND content);
+
+ // Returns the backing Window handle to enable clients to set icon and other
+ // window properties. Returns nullptr if the window has been destroyed.
+ HWND GetHandle();
+
+ // If true, closing this window will quit the application.
+ void SetQuitOnClose(bool quit_on_close);
+
+ // Return a RECT representing the bounds of the current client area.
+ RECT GetClientArea();
+
+ protected:
+ // Processes and route salient window messages for mouse handling,
+ // size change and DPI. Delegates handling of these to member overloads that
+ // inheriting classes can handle.
+ virtual LRESULT MessageHandler(HWND window,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept;
+
+ // Called when CreateAndShow is called, allowing subclass window-related
+ // setup. Subclasses should return false if setup fails.
+ virtual bool OnCreate();
+
+ // Called when Destroy is called.
+ virtual void OnDestroy();
+
+ private:
+ friend class WindowClassRegistrar;
+
+ // OS callback called by message pump. Handles the WM_NCCREATE message which
+ // is passed when the non-client area is being created and enables automatic
+ // non-client DPI scaling so that the non-client area automatically
+ // responds to changes in DPI. All other messages are handled by
+ // MessageHandler.
+ static LRESULT CALLBACK WndProc(HWND const window,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept;
+
+ // Retrieves a class instance pointer for |window|
+ static Win32Window* GetThisFromHandle(HWND const window) noexcept;
+
+ // Update the window frame's theme to match the system theme.
+ static void UpdateTheme(HWND const window);
+
+ bool quit_on_close_ = false;
+
+ // window handle for top level window.
+ HWND window_handle_ = nullptr;
+
+ // window handle for hosted content.
+ HWND child_content_ = nullptr;
+};
+
+#endif // RUNNER_WIN32_WINDOW_H_
diff --git a/logo.png b/logo.png
new file mode 100644
index 00000000..0e36c791
Binary files /dev/null and b/logo.png differ