캡스톤 디자인 결과보고서

캡스톤 디자인 번호	7
캡스톤 디자인 분야	앱 개발
캡스톤 디자인 지도교수	노기섭 교수님
캡스톤 디자인 작품명	(국문) 도라지
	(영문) doragi
프로젝트 책임자	팀 명		영앤리치
	학 과		인공지능소프트웨어
	성 명		권순오			학 번
	휴대폰					E-mail
프로젝트 세부현황	번 호	세부역할			성 명		전 공		학 번
	1	소스코드 작성			권순오		인공지능소프트웨어
	2	소스코드 작성			박성호		인공지능소프트웨어
	3	소스코드 작성			김재현		인공지능소프트웨어
프로젝트 수행기간	2020년 3월 16일부터 2020년 06월 23일 까지(15주)
2020도 캡스톤 디자인 프로젝트를 성실히 수행하여 이에 결과보고서를 제출합니다. 2020 . 06. 15. 과제책임자 권순오 서명 컴퓨터정보공학과 담당교수 귀하

1. 요약서

캡스톤디자인 번호	7
캡스톤디자인 명	도라지(도라다니지마)
캡스톤디자인 책임자	권순오

○ 캡스톤디자인 목표

수업 간 점심식사 시간이 촉박한 대학생들과 식당정보가 필요한 학생들에게 대학가 식당 및 메뉴 등의 정보와 커뮤니티를 제공해 시간단축과 정보서비스를 제공하는 앱 제작을 목표로 한다.

○ 캡스톤디자인 내용

학생들에게 편리함을 주기 위해 위치 기반 시스템을 통한 가게 위치, 메뉴, 평점, 게시판, 결제 시스템 등 학생들의 시간을 절약하고 보다 나은 식당 및 메뉴선정 방식에 도움을 주기 위해 기획된 앱이다. 학생증만을 확인하는 회원가입 시스템으로 개인정보 보호 및 학교 내부인원만의 커뮤니티로 활용한다.

○ 캡스톤디자인 개발에 따른 기대성과

간단한 회원가입을 이용한 앱으로 원하는 식당의 위치를 알고 편리한 메뉴선정이 가능하다. 이러한 앱 개발로 학생들의 소중한 식사시간을 조금이나마 여유롭게 하고 충전 형 방식으로 보다 간편하고 실용적인 결제시스템을 제공한다.

캡스톤디자인 계획서

캡스톤디자인 명 : 도라지(도라다니지마)

캡스톤디자인 책임자 : 인공지능소프트웨어 / 권순오

1. 캡스톤 디자인의 필요성

21세기는 모든 것이 스마트폰에 의해 해결 되는 시대이다.  굳이 시간낭비를 하지 않고 상황을 고려했을 때  가게 위치 , 메뉴, 평점, 결제시스템 등의 서비스를 제공하는 앱을 제작하면 학생들이 편리하게 이용하게 될 것이다.

2. 캡스톤 디자인의 목표 및 내용

가. 캡스톤 디자인 목표

요즘 배달의 민족과 같은 어플은 기능은 다양한 기능이 있다. 우리가 기획한 어플의 기능은 배달의 민족과 같은 것을 포함하여 배달의 민족에 없는 기능을 추가하는 것이다. 빠르게 주문하고 그 식당에서 식사를 할 수 있게 만드는 것이다. 또한 대학가 위치를 기반으로 할인 기능을 추가 된다면 대학생이 많이 선호 할 수 있는 어플이 될 것 같다.

나. 캡스톤 디자인 내용

학생증을 이용하여 회원가입

2. 로그인

3. 현재 위치 설정

4. 가게 게시판

5. 결제 시스템 및 충전

6. 메뉴 선택 및 평점

3. 캡스톤 디자인의 추진전략 및 체계

1. 이용자가 원하는 기능을 확인하고 기획한다.

2. 안드로이드 스튜디오를 사용하여 우리가 원하는 기능을 코딩하고 동작할 수 있게 작업을 실행한다.

3. 완성된 앱 시연 및 소스코드를 발표하고 피드백을 받는다.

4. 피드백을 수용하여 앱을 보완한다.

5. 앱이 완성되면 학생들에게 부족한 점을 듣고 난 후 그것을 고치고 업그레이드 한 뒤 학생들에게 배포한다.

4. 캡스톤 디자인 개발의 기대효과 및 활용방안

제작되는 앱을 이용하는 이용자들이 대학가 식당들에 대한 메뉴, 의견공유 및 별점등의 기능을 통해 이용자들간 소통하며 좀 더 나은 결정을 돕는다.

이용자들은 위치정보 표시 및 결제시스템을 통해 효율적인 시간 단축과 금전적인 효과를 볼 수 있다.

대학가 상인들과의 제휴를 통해 충전식 결제 서비스와 위치정보 표시등의 기능으로 상인은 더 많은 손님 확보와 홍보효과를 얻을 수 있다.

5. 작업분할 구조도(WBS, Work Breakdown Structure)

가. 캡스톤디자인 작업분할 구조도

6. 참여인력

가. 인력 편성표

						캡스톤디자인 책임자
						( 권순오 )
	소스코드 작성 및 UI디자인						소스코드 작성 및 UI디자인						소스코드 작성 및 UI디자인
권순오					박	박성호						김재현
소스코드 작성 및 UI디자인						소스코드 작성 및 UI디자인						소스코드 작성 및 UI디자인

나. 참여 인력 현황

번호	분 야	학 번	성 명	참여율(%)
1	앱 개발 및 코드 작성	16422308	권순오	40%
2	앱 개발 및 코드 작성	15422019	박성호	30%
3	앱 개발 및 코드 작성	16422013	김재현	30%

다. 캡스톤디자인 책임자 및 참여인원의 상세 정보

1) 인적사항
	성 명		권순오
	학 번					생년월일
	주 소
	연 락 처		핸드폰				e-mail
	공학 인증		참여				미참여
2) 학적 사항
연도	학적변동 사항
2016~2017	청주대학교 컴퓨터정보공학과									재학
2018~현재	청주대학교 인공지능소프트웨어공학과									복학
3) 현장실습, 인턴쉽, 어학연수, 교육연수 현황
연도(부터～까지)		연수 명			연수기관
4) 자격증 현황
자격증 명		발행기관			취득년도

1) 인적사항
	성 명		박성호
	학 번					생년월일
	주 소
	연 락 처		핸드폰				e-mail
	공학 인증		참여				미참여
2) 학적 사항
연도	학적변동 사항									비고
2015~2016	청주대학교 컴퓨터정보공학과									재학
2019~현재	청주대학교 인공지능소프트웨어공학과									복학
3) 현장실습, 인턴쉽, 어학연수, 교육연수 현황
연도(부터～까지)		연수 명			연수기관						비 고
4) 자격증 현황
자격증 명		발행기관			취득년도						비고

1) 인적사항
	성 명		김재현
	학 번					생년월일
	주 소
	연 락 처		핸드폰				e-mail
	공학 인증		참여				미참여
2) 학적 사항
연도	학적변동 사항									비고
2016~2017	청주대학교 컴퓨터정보공학과									재학
2018~현재	청주대학교 인공지능소프트웨어공학과									복학
3) 현장실습, 인턴쉽, 어학연수, 교육연수 현황
연도(부터～까지)		연수 명			연수기관						비 고
4) 자격증 현황
자격증 명		발행기관			취득년도						비고

7. 소요장비 및 재료

장비 및 재료 명	규격	수량	용 도	비 고
개인용 컴퓨터 (PC)		3	작업
웹 브라우저 (Chrome)		3	정보 및 자료 검색
한컴오피스 한글 2018		3	문서 작성
Microsoft Power Point		3	PPT 제작
스마트폰		3	팀원 간 연락
Android Studio		3	소스코드 개발

8. 캡스톤디자인 추진일정 계획

	세부 추진 내 용		추 진 일 정 (월)
			3	4	5	6
도라지	1	안드로이드 스튜디오 이용한 앱 개발
	2	DB연동 사전 작업
	3	DB 테이블 작성
	4	DB구조 점검 및 수정
	5	서버와의 연동 사전 준비
	6	위치 api
	7	앱 UI 구상
	8	앱 UI 디자인
	9	앱 UI 적용
	10	로그인 / 로그아웃
	11	회원가입
	12	ID / 비밀번호
	13	리뷰 관리
	14	1대1 문의
	15	공지사항
	16	메뉴 관리
	17	QR코드 생성
	18	인앱 결제
	19	수정 및 보안
	20	중간 발표 및 준비
	21	최종 발표

캡스톤 디자인 결과보고서(結果報告書)

목  차

1. UI 디자인 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	14
2. 안드로이드 스튜디오 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	14
3. 구글 파이어베이스 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	21
3.1. 파이어베이스 소개 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	22
3.1.1. 소개 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	23
3.1.2. 파이어베이스 요금제 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	24
3.2. 파이어베이스 로그인 및 프로젝트 생성 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	25
3.3. 앱에 파이어베이스 추가하기 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	26
4. 디자인 레이아웃 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	28
5. java 작동 코드 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	47
6. 마무리	71
6.1. 향후 추진 계획∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	71
6.2 정리 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	71
7. 부록	72
7.1 사용자 메뉴얼 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙	73

1. UI 디자인

2. 안드로이드 스튜디오

사이트에 접속해서 상단 메뉴바에서 [Android 스튜디오]를 클릭

그럼 [Android 스튜디오 설치파일 다운로드] 페이지로 이동하고 다운로드 버튼을 클릭

그 외 운영체제 및 32비트 사용 중이면 다운로드 버튼 왼쪽 아래 클릭

동의 후 최종 설치파일을 다운로드

1. 다음

안드로이드 가상머신을 설치해서 사용하기 때문에 미리 체크해서 설치를 한다.

3. 기본 경로로 해서 진행 합니다.

4. 폴더 지정

5. 기본설정을 해야 하기 때문에 안드로이드 스튜디오를 시작을 체크하고 진행한다.

6. 아래와 같은 창이 뜨는데 기본 설정으로 해서 진행

7. 버그 및 오류 등 각종 정보를 구글로 보내주는 내용이므로 네 or 아니오 클릭

8. 다음

9. 기본 Standard로 진행

10. 기본 설정 사항 및 기본 SDK 등이 설치를 하게 된다. 추가 SDK를 설치하고 싶으면 SDK매니저에 들어가서 진행하면 된다.

11. 설치완료

3. 구글 파이어베이스

3.1 파이어베이스 소개

3.1.1 소개

파이어베이스(https://firebase.google.com)는 웹 모바일 개발에 필요한 통합 앱 플랫폼을 제공하는 BaaS(Backend as a Service) 이다.

초기에는 백엔드 데이터베이스를 구축할 필요 없이 API 형태로 데이터를 저장하고 자겨올 수 있는 기능에 국한되어 있었으나, 현재는 인증 및 실시간 데이터베이스, 클라우드 저장소, 호스팅, 애널리틱스 등 다양한 기능들이 통합되었다.

주요 특징으로 실시간으로 데이터를 저장하고 동기화할 수 있는 클라우드 호스팅 NoSQL 실시간 데이터베이스와 이메일/비밀번호 계정, 전화 인증, Google, Twitter, Facebook, Github 로그인 등을 지원하는 종합적인 ID 솔루션을 제공한다.

3.1.2 파이어베이스 요금제

구글 파이어베이스는 무료인 Spark요금제와 종량제 Blaze 요금제가 있다.

A/B 테스트, Analytics, 앱 배포, 앱 색인 생성등 필요한 기본성능은 두가지 모두 동일하게 무제한 무료로 제공된다. 그 외의 전화인증, 클라우드, 함수등은 사용량에 따라 요금을 부과한다. 우리 프로젝트의 경우 적은 양의 데이터저장만을 요구하기 때문에 Spark요금제를 사용했다.

3.2 파이어베이스 로그인 및 프로젝트 생성

3.2.1 로그인

https://firebase.google.com 로 접속하여 구글 계정을 이용한 로그인으로 간편하게 별도 설치없이 파이어베이스에 접속한다.

3.2.2 파이어베이스 프로젝트 생성

메인화면에서 프로젝트 추가를 선택한다.

프로젝트명 지정후 계속

애널리틱스 선택화면에서 사용하도록 설정하고 계속

최종적으로 [프로젝트 만들기]를 실행한다.

3.3 앱에 파이어베이스 추가하기

안드로이드 아이콘을 앱에 파이어베이스를 추가하기 위해 안드로이드를 선택

안드로이드 패키지 이름과 앱 닉네임 지정 이후 앱등록

구성파일 다운로드

프로젝트 디렉터리의 Gradle 파일(build.gradle)에 들어가서 SDK파일 추가하여 완료

4. 디자인 레이아웃

activity_between_shop.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/app_color" app:elevation="0dp"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="@string/main_between_shop" android:textColor="#ffffff" android:textSize="20sp" /> </androidx.appcompat.widget.Toolbar> </com.google.android.material.appbar.AppBarLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" android:orientation="vertical"> <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MapsActivity" /> </LinearLayout> </RelativeLayout>

activity_login.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/app_color" android:gravity="center" android:orientation="vertical" android:paddingTop="50dp" android:paddingBottom="50dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:gravity="center" android:text="@string/app_name" android:textColor="#ffffff" android:textSize="30sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:gravity="center" android:text="@string/login_description" android:textColor="#ffffff" android:textSize="18sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="16dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical" android:paddingTop="50dp"> <EditText android:id="@+id/ed_login_username" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawableStart="@drawable/ic_user" android:drawablePadding="10dp" android:hint="@string/login_edit_username" android:padding="16dp" /> <EditText android:id="@+id/ed_login_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginTop="10dp" android:layout_marginEnd="20dp" android:background="@drawable/selector_login_edt" android:drawableStart="@drawable/ic_key" android:drawablePadding="10dp" android:hint="@string/login_edit_password" android:inputType="textPassword" android:padding="16dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp" android:gravity="center" android:orientation="vertical"> <Button android:id="@+id/btn_login_signup" android:layout_width="150dp" android:layout_height="50dp" android:layout_marginTop="10dp" android:background="@drawable/selector_login_find_btn" android:text="@string/login_signup" android:textSize="18sp" /> </LinearLayout> <Button android:id="@+id/btn_login" android:layout_width="200dp" android:layout_height="70dp" android:layout_marginTop="50dp" android:background="@drawable/selector_login_btn" android:text="@string/login_btn" android:textColor="#ffffff" android:textSize="20sp" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="40dp" android:layout_weight="1" android:orientation="vertical"> <Button android:id="@+id/btn_login2" android:layout_width="150dp" android:layout_height="50dp" android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" android:background="@drawable/selector_login_find_btn" android:text="@string/login_guest" android:textSize="18sp" /> </RelativeLayout> </LinearLayout> </LinearLayout>

activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/app_color" app:elevation="0dp"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:navigationIcon="@drawable/ic_menu_light" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="@string/app_name" android:textColor="#ffffff" android:textSize="20sp" /> </androidx.appcompat.widget.Toolbar> </com.google.android.material.appbar.AppBarLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" android:orientation="vertical"> <ViewFlipper android:id="@+id/flipper_shop" android:layout_width="match_parent" android:layout_height="200dp"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/img_shop_banner_1" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/img_shop_banner_2" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/img_shop_banner_3" /> </ViewFlipper> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:orientation="horizontal"> <Button android:id="@+id/btn_main_between_shop" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/selector_main_btn" android:text="@string/main_between_shop" android:textColor="#000000" android:textSize="20sp" /> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:background="#555555" /> <Button android:id="@+id/btn_main_category" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/selector_main_btn" android:text="@string/main_category" android:textColor="#000000" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:layout_marginStart="50dp" android:layout_marginEnd="50dp" android:orientation="horizontal" android:layout_marginBottom="50dp"> <EditText android:id="@+id/ed_search" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/selector_login_edt" android:drawableStart="@drawable/ic_search" android:drawablePadding="10dp" android:padding="16dp" /> <ImageButton android:id="@+id/btn_search" android:layout_width="60dp" android:layout_height="match_parent" android:adjustViewBounds="true" android:background="@drawable/selector_login_btn" android:src="@drawable/ic_search_light" android:textColor="#ffffff" android:textSize="20sp" /> </LinearLayout> <Button android:id="@+id/btn_buy" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginStart="50dp" android:layout_marginTop="50dp" android:layout_marginEnd="50dp" android:background="@drawable/selector_login_btn" android:text="@string/main_buy" android:textColor="#ffffff" android:textSize="20sp" /> </LinearLayout> </LinearLayout> </RelativeLayout> <com.google.android.material.navigation.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> </androidx.drawerlayout.widget.DrawerLayout>

activity_notice.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/app_color" app:elevation="0dp"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="@string/nav_menu_notice" android:textColor="#ffffff" android:textSize="20sp" /> </androidx.appcompat.widget.Toolbar> </com.google.android.material.appbar.AppBarLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="?attr/actionBarSize" android:orientation="vertical"> <ListView android:id="@+id/lv_notice" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout>

activity_shop_data.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/img_shop_data" android:layout_width="match_parent" android:layout_height="200dp" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/img_shop_banner_1" /> <LinearLayout android:id="@+id/lay_default_data" android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="16dp" android:layout_weight="1" android:orientation="vertical" android:visibility="visible"> <TextView android:id="@+id/tv_shop_data_menu" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="분식" android:textSize="20sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:background="#e2e2e2" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="match_parent" android:gravity="center_vertical" android:text="별점" /> <ImageView android:id="@+id/img_star1" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/ic_star" /> <ImageView android:id="@+id/img_star2" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/ic_star" /> <ImageView android:id="@+id/img_star3" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/ic_star" /> <ImageView android:id="@+id/img_star4" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/ic_star" /> <ImageView android:id="@+id/img_star5" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/ic_star" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="match_parent" android:gravity="center_vertical" android:text="주소" /> <TextView android:id="@+id/tv_shop_data_address" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center_vertical" android:text="청주시 내덕동" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="match_parent" android:gravity="center_vertical" android:text="메뉴" /> <TextView android:id="@+id/tv_shop_data_category" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center_vertical" android:text="떡볶이, 튀김" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="match_parent" android:gravity="center_vertical" android:text="태그" /> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center_vertical" android:text="-" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:orientation="horizontal"> <Button android:id="@+id/btn_shop_data_result" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/selector_main_btn" android:text="정보" android:textColor="#000000" android:textSize="20sp" /> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:background="#555555" /> <Button android:id="@+id/btn_shop_data_review" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/selector_main_btn" android:text="리뷰" android:textColor="#000000" android:textSize="20sp" /> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:background="#555555" /> <Button android:id="@+id/btn_shop_data_menu" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/selector_main_btn" android:text="메뉴" android:textColor="#000000" android:textSize="20sp" /> </LinearLayout> <!--정보--> <LinearLayout android:id="@+id/lay_info" android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="16dp" android:layout_weight="1" android:orientation="vertical" android:visibility="gone"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="match_parent" android:gravity="center_vertical" android:text="전화번호" /> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/tv_shop_data_call" android:gravity="center_vertical" android:text="043-1234-5678" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="match_parent" android:gravity="center_vertical" android:text="영업시간" /> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/tv_shop_data_time" android:gravity="center_vertical" android:text="09:00 ~ 20:00" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="match_parent" android:gravity="center_vertical" android:text="휴무" /> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/tv_shop_data_notwork" android:gravity="center_vertical" android:text="연중무휴" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="match_parent" android:gravity="center_vertical" android:text="주소" /> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/tv_shop_data_info_address" android:gravity="center_vertical" android:text="충청북도 청주시 내덕동" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="50dp" android:layout_marginBottom="50dp" android:layout_weight="1"> <fragment android:id="@+id/map_info" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MapsActivity" /> </LinearLayout> </LinearLayout> <!--리뷰--> <LinearLayout android:id="@+id/lay_review" android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="16dp" android:layout_weight="1" android:orientation="vertical" android:visibility="gone"> </LinearLayout> <!--메뉴--> <LinearLayout android:id="@+id/lay_menu" android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="16dp" android:layout_weight="1" android:orientation="vertical" android:visibility="gone"></LinearLayout> <Button android:id="@+id/btn_go_credit" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/selector_login_btn" android:text="주문" android:textColor="#ffffff" android:textSize="20sp" /> </LinearLayout>

activity_signup.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/app_color" android:gravity="center" android:orientation="vertical" android:paddingTop="50dp" android:paddingBottom="50dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:gravity="center" android:text="@string/app_name" android:textColor="#ffffff" android:textSize="30sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:gravity="center" android:text="@string/login_description" android:textColor="#ffffff" android:textSize="18sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="16dp" android:layout_weight="1" android:gravity="center" android:orientation="vertical" android:paddingTop="50dp"> <EditText android:id="@+id/ed_signup_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawableStart="@drawable/ic_user" android:drawablePadding="10dp" android:hint="@string/signup_name" android:padding="16dp" /> <EditText android:id="@+id/ed_signup_username" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawableStart="@drawable/ic_user" android:drawablePadding="10dp" android:hint="@string/login_edit_username" android:padding="16dp" /> <EditText android:id="@+id/ed_signup_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginTop="10dp" android:layout_marginEnd="20dp" android:background="@drawable/selector_login_edt" android:drawableStart="@drawable/ic_key" android:drawablePadding="10dp" android:hint="@string/login_edit_password" android:inputType="textPassword" android:padding="16dp" /> <Button android:id="@+id/btn_signup" android:layout_width="150dp" android:layout_height="50dp" android:layout_marginTop="50dp" android:background="@drawable/selector_login_btn" android:text="@string/signup_btn" android:textColor="#ffffff" android:textSize="20sp" /> </LinearLayout> </LinearLayout>

nav_header_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="176dp" android:background="@color/app_color" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="90dp" android:layout_height="90dp" android:layout_marginBottom="5dp" android:adjustViewBounds="true" android:src="@drawable/ic_account" /> <TextView android:id="@+id/tv_nav_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:gravity="center" android:text="@string/login_edit_username" android:textColor="#ffffff" android:textSize="20sp" /> <TextView android:id="@+id/tv_nav_coin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:gravity="center" android:textColor="#ffffff" android:textSize="20sp" /> </LinearLayout>

credit2.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/holo_red_light" android:text="자연을 담은 돈까스" android:textSize="20dp" /> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" 예약 시간" android:textSize="20sp" /> <TimePicker android:layout_width="wrap_content" android:layout_height="139dp" android:layout_gravity="center" android:layout_marginBottom="30dp" android:timePickerMode="spinner" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" 예약자 정보" android:textSize="20sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="84dp" android:layout_height="wrap_content" android:text=" 예약자" android:textSize="20sp" /> <EditText android:layout_width="253dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawablePadding="10dp" android:padding="16dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="84dp" android:layout_height="wrap_content" android:text=" 연락처" android:textSize="20sp" /> <EditText android:layout_width="253dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawablePadding="10dp" android:padding="16dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="84dp" android:layout_height="wrap_content" android:text=" 요청사항" android:textSize="20sp" /> <EditText android:layout_width="253dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawablePadding="10dp" android:padding="16dp" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" 메뉴" android:textSize="20sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:layout_width="313dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawablePadding="10dp" android:hint="돈까스8000원" android:padding="16dp" /> <RadioButton android:id="@+id/radioButton3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:layout_width="313dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawablePadding="10dp" android:hint="김치볶음밥6000원" android:padding="16dp" /> <RadioButton android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:layout_width="313dp" android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="10dp" android:background="@drawable/selector_login_edt" android:drawablePadding="10dp" android:hint="치즈돈까스9000원" android:padding="16dp" /> <RadioButton android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"/> <Button android:id="@+id/button" android:layout_width="211dp" android:layout_height="wrap_content" android:background="#F45A5A" android:text="예 약" android:layout_gravity="center" android:textSize="15dp" /> </LinearLayout>

5.1 java 동작 소스코드

BetweenShopActivity

package com.social.doraji;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class BetweenShopActivity extends AppCompatActivity implements OnMapReadyCallback
{
private GoogleMap mgoogleMap;

private double myLocationLat = 37.715133;
private double myLocationLon = 126.734086;

private SupportMapFragment supportMapFragment;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_between_shop);

final LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

if (Build.VERSION.SDK_INT >= 23 &&
ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(BetweenShopActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
0);
}
else
{
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
myLocationLat = location.getLatitude();
myLocationLon = location.getLongitude();

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000,
1,
gpsLocationListener);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
1000,
1,
gpsLocationListener);
}

supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
supportMapFragment.getMapAsync(BetweenShopActivity.this);
}

@Override
protected void onResume()
{
super.onResume();
supportMapFragment.onResume();
}

final LocationListener gpsLocationListener = new LocationListener() {
public void onLocationChanged(Location location) {
myLocationLat = location.getLatitude();
myLocationLon = location.getLongitude();
}

public void onStatusChanged(String provider, int status, Bundle extras) {
}

public void onProviderEnabled(String provider) {
}

public void onProviderDisabled(String provider) {
}
};

@Override
public void onMapReady(@NonNull @org.jetbrains.annotations.NotNull GoogleMap googleMap)
{
mgoogleMap = googleMap;

final LatLng myLocationResult = new LatLng(myLocationLat, myLocationLon);
MarkerOptions myLocation = new MarkerOptions(); // 내위치
myLocation.position(myLocationResult);
myLocation.title("내 위치");

MarkerOptions shopMarker1 = new MarkerOptions(); // 자연을 담은 돈까스
shopMarker1.position(new LatLng(36.62181, 127.51649));
shopMarker1.title("자연을 담은 돈까스");

MarkerOptions shopMarker2 = new MarkerOptions(); // 금용
shopMarker2.position(new LatLng(36.65740, 127.48401));
shopMarker2.title("금용");

MarkerOptions shopMarker3 = new MarkerOptions(); // 봉용불고기
shopMarker3.position(new LatLng(36.64680, 127.48842));
shopMarker3.title("봉용불고기");

MarkerOptions shopMarker4 = new MarkerOptions(); // 쇼킹
shopMarker3.position(new LatLng(36.64685, 127.48845));
shopMarker3.title("쇼킹");

MarkerOptions shopMarker5 = new MarkerOptions(); // 쇼킹
shopMarker3.position(new LatLng(36.64682, 127.48825));
shopMarker3.title("쇼킹");

googleMap.addMarker(myLocation);
googleMap.addMarker(shopMarker1);
googleMap.addMarker(shopMarker2);
googleMap.addMarker(shopMarker3);
googleMap.addMarker(shopMarker4);
googleMap.addMarker(shopMarker5);
// 마커 등록

googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback()
{
@Override
public void onMapLoaded()
{
mgoogleMap.moveCamera(CameraUpdateFactory.newLatLng(myLocationResult));
mgoogleMap.animateCamera(CameraUpdateFactory.zoomTo(10));
}
}); // 구글맵 로딩이 완료되면 카메라 위치 조정
}
}

Credit7Activity

package com.social.doraji;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class Credit7Activity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.credit6);
}

}

CreditActivity

package com.social.doraji;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;

import com.google.android.material.navigation.NavigationView;

import org.jetbrains.annotations.NotNull;

public class CreditActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.credit_card);
}

}

LoginActivity

package com.social.doraji;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.view.View;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.HashMap;

import androidx.appcompat.app.AppCompatActivity;

public class LoginActivity extends AppCompatActivity
{
private EditText edLoginUserName;
private EditText edLoginPassword;
private Button btnLoginSignUp;
private Button btnLogin;

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);

edLoginUserName = findViewById(R.id.ed_login_username);
edLoginPassword = findViewById(R.id.ed_login_password);
btnLoginSignUp = findViewById(R.id.btn_login_signup);
btnLogin = findViewById(R.id.btn_login);
Button button=findViewById(R.id.btn_login2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
}
});

btnLoginSignUp.setOnClickListener(v -> startActivity(new Intent(LoginActivity.this, SignUpActivity.class)));
btnLogin.setOnClickListener(v ->
{
if (edLoginUserName.getText().length() != 0 && edLoginPassword.getText().length() != 0)
{
firebaseAuth.signInWithEmailAndPassword(edLoginUserName.getText().toString(), edLoginPassword.getText().toString()).addOnCompleteListener(LoginActivity.this, task -> {
if (task.isSuccessful())
{
Intent intent = new Intent(LoginActivity.this, MainActivity.class);

FirebaseUser user = firebaseAuth.getCurrentUser();
assert user != null;
DatabaseReference database = FirebaseDatabase.getInstance().getReference("Users");
database.child(user.getUid()).addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
Toast.makeText(LoginActivity.this, "로그인 성공", Toast.LENGTH_SHORT).show();

intent.putExtra("userName", dataSnapshot.child("name").getValue(String.class));
finish();

startActivity(intent);
}

@Override
public void onCancelled(DatabaseError databaseError)
{

}
});
}
else
Toast.makeText(this, "로그인 오류", Toast.LENGTH_SHORT).show();
});
}
else
Toast.makeText(this, "입력창을 모두 채워주세요!", Toast.LENGTH_SHORT).show();

}
);
}
}

MainActivity

package com.social.doraji;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;

import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewFlipper;

import com.google.android.material.navigation.NavigationView;

import org.jetbrains.annotations.NotNull;

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener
{
private Toolbar toolbar;
private DrawerLayout drawerLayout;
private NavigationView navView;
private ActionBarDrawerToggle drawerToggle;

private ViewFlipper flipperShop;
private Button btnMainCategory;
private Button btnMainBetweenShop;
private Button btnBuy;

private TextView tvNavName;
private TextView tvNavCoin;

private EditText edSearch;
private ImageButton btnSearch;

static String userRealName = "";

private String coinStr = "0원";

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawerLayout = findViewById(R.id.drawer_layout);
navView = findViewById(R.id.nav_view);
navView.setNavigationItemSelectedListener(this);

Intent intent = getIntent();

View nav_header_view = navView.getHeaderView(0);
tvNavName = nav_header_view.findViewById(R.id.tv_nav_name);
tvNavCoin = nav_header_view.findViewById(R.id.tv_nav_coin);

tvNavName.setText(intent.getStringExtra("userName") + "님");
coinStr = "사용 가능 금액: 0원";
tvNavCoin.setText(coinStr);

drawerToggle = new ActionBarDrawerToggle(
this,
drawerLayout,
toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close
);

getSupportActionBar().setDisplayShowTitleEnabled(false);
drawerLayout.addDrawerListener(drawerToggle);
navView.setNavigationItemSelectedListener(this);

flipperShop = findViewById(R.id.flipper_shop);
flipperShop.setFlipInterval(3000);
flipperShop.startFlipping();

btnMainCategory = findViewById(R.id.btn_main_category);
btnMainBetweenShop = findViewById(R.id.btn_main_between_shop);
btnBuy = findViewById(R.id.btn_buy);
edSearch = findViewById(R.id.ed_search);
btnSearch = findViewById(R.id.btn_search);

btnSearch.setOnClickListener(v -> {
Intent intent1 = new Intent(MainActivity.this, ShopListActivity.class);
intent1.putExtra("edData", edSearch.getText().toString());
startActivity(intent1);
});

btnBuy.setOnClickListener(v -> {
final EditText txtEdit = new EditText(MainActivity.this);

AlertDialog.Builder clsBuilder = new AlertDialog.Builder(MainActivity.this);
clsBuilder.setTitle("충전할 금액을 입력해 주세요");
clsBuilder.setView(txtEdit);
clsBuilder.setPositiveButton("확인",
(dialog, which) -> {
coinStr = "사용 가능 금액: " + txtEdit.getText().toString() + "원";
tvNavCoin.setText(coinStr);

Toast.makeText(this, "충전이 완료되었습니다.", Toast.LENGTH_SHORT).show();
});
clsBuilder.setNegativeButton("취소", null);
clsBuilder.show();
});
btnMainCategory.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, ShopListActivity.class)));
btnMainBetweenShop.setOnClickListener(v -> startActivity(new Intent(MainActivity.this, BetweenShopActivity.class)));
}

@Override
protected void onResume()
{
super.onResume();
Log.e("UserName", userRealName);
}

@Override
protected void onDestroy()
{
super.onDestroy();
if (flipperShop.isFlipping())
flipperShop.stopFlipping();
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item)
{
if (drawerToggle.onOptionsItemSelected(item))
return true;
return super.onOptionsItemSelected(item);
}

@SuppressLint("NonConstantResourceId")
@Override
public boolean onNavigationItemSelected(@NonNull @NotNull MenuItem item)
{
switch (item.getItemId())
{
case R.id.nav_menu_notice:
startActivity(new Intent(MainActivity.this, NoticeActivity.class));
break;
case R.id.nav_menu_card:
startActivity(new Intent(MainActivity.this, CreditActivity.class));
break;
case R.id.nav_menu_service:
startActivity(new Intent(MainActivity.this, Credit2Activity.class));
break;

}
return false;
}

}

MenuAcitivty

package com.social.doraji;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MenuActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.credit2);
}

}

NoticeActivity

package com.social.doraji;

import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import androidx.appcompat.app.AppCompatActivity;

public class NoticeActivity extends AppCompatActivity
{
private NoticeAdapter adapter;
private ListView lvNotice;

DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference().child("notice");

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notice);

adapter = new NoticeAdapter();

lvNotice = findViewById(R.id.lv_notice);
lvNotice.setAdapter(adapter);

lvNotice.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
new AlertDialog.Builder(NoticeActivity.this)
.setTitle(adapter.items.get(position).getTitle())
.setMessage(adapter.items.get(position).getMessage() + "\n\n" + adapter.items.get(position).getTime())
.setPositiveButton("OK", null)
.show();
}
});
}

@Override
protected void onResume()
{
super.onResume();
mRootRef.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
adapter.clear();
adapter.notifyDataSetChanged();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren())
{
if (postSnapshot.getValue() != null)
{
String time = postSnapshot.child("time").getValue(String.class);
String title = postSnapshot.child("title").getValue(String.class);
String message = postSnapshot.child("message").getValue(String.class);

adapter.addItem(new NoticeListViewItem(time, title, message));
adapter.notifyDataSetChanged();
}
}
}

@Override
public void onCancelled(DatabaseError databaseError)
{

}
});
}
}

NoticeAdapter

package com.social.doraji;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class NoticeAdapter extends BaseAdapter
{
ArrayList<NoticeListViewItem> items = new ArrayList<>();
Context context;

@Override
public int getCount() {
return items.size();
}

@Override
public Object getItem(int position)
{
return items.get(position);
}

@Override
public long getItemId(int position)
{
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
context = parent.getContext();
NoticeListViewItem noticeListVIewItem = items.get(position);

if (convertView == null)
{
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listviewitem_notice, parent, false);
}

TextView tvNoticeTime = convertView.findViewById(R.id.tv_notice_time);
TextView tvNoticeTitle = convertView.findViewById(R.id.tv_notice_title);
TextView tvNoticeMessage = convertView.findViewById(R.id.tv_notice_message);

tvNoticeTime.setText(noticeListVIewItem.getTime());
tvNoticeTitle.setText(noticeListVIewItem.getTitle());
tvNoticeMessage.setText(noticeListVIewItem.getMessage());
return convertView;
}

public void addItem(NoticeListViewItem noticeListVIewItem)
{
items.add(noticeListVIewItem);
}

public void clear()
{
items.clear();
}
}

NoticeListViewltem

package com.social.doraji;

public class NoticeListViewItem
{
private String time;
private String title;
private String message;

public String getTime()
{
return time;
}

public void setTime(String time)
{
this.time = time;
}

public String getTitle()
{
return title;
}

public void setTitle(String title)
{
this.title = title;
}

public String getMessage()
{
return message;
}

public void setMessage(String message)
{
this.message = message;
}

NoticeListViewItem(String time, String title, String message)
{
this.time = time;
this.title = title;
this.message = message;
}
}

ShopDataActivity

package com.social.doraji;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import org.jetbrains.annotations.NotNull;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

public class ShopDataActivity extends AppCompatActivity implements OnMapReadyCallback
{
private ImageView imgShopData;
private TextView tvShopDataMenu;
private ImageView imgStar1, imgStar2, imgStar3, imgStar4, imgStar5;
private TextView tvShopDataAddress;
private TextView tvShopDataCategory;
private Button btnShopDataResult;
private Button btnShopDataReview;
private Button btnShopDataMenu;
private LinearLayout layDefaultData;
private LinearLayout layInfo;
private LinearLayout layReview;
private LinearLayout layMenu;
private TextView tvShopDataCall;
private TextView tvShopDataTime;
private TextView tvShopDataNotWork;
private TextView tvShopDataInfoAddress;

private Button btnGoCredit;

private GoogleMap mgoogleMapInfo;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop_data);

Intent intent = getIntent();

imgShopData = findViewById(R.id.img_shop_data);
tvShopDataMenu = findViewById(R.id.tv_shop_data_menu);
imgStar1 = findViewById(R.id.img_star1);
imgStar2 = findViewById(R.id.img_star2);
imgStar3 = findViewById(R.id.img_star3);
imgStar4 = findViewById(R.id.img_star4);
imgStar5 = findViewById(R.id.img_star5);
tvShopDataAddress = findViewById(R.id.tv_shop_data_address);
tvShopDataCategory = findViewById(R.id.tv_shop_data_category);

btnShopDataResult = findViewById(R.id.btn_shop_data_result);
btnShopDataReview = findViewById(R.id.btn_shop_data_review);
btnShopDataMenu = findViewById(R.id.btn_shop_data_menu);

btnGoCredit = findViewById(R.id.btn_go_credit);

layDefaultData = findViewById(R.id.lay_default_data);
layInfo = findViewById(R.id.lay_info);
layReview = findViewById(R.id.lay_review);
layMenu = findViewById(R.id.lay_menu);

tvShopDataCall = findViewById(R.id.tv_shop_data_call);
tvShopDataTime = findViewById(R.id.tv_shop_data_time);
tvShopDataNotWork = findViewById(R.id.tv_shop_data_notwork);
tvShopDataInfoAddress = findViewById(R.id.tv_shop_data_info_address);

layDefaultData.setVisibility(View.VISIBLE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.GONE);
layMenu.setVisibility(View.GONE);

SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_info);
assert supportMapFragment != null;
supportMapFragment.getMapAsync(this);

switch (intent.getStringExtra("shopName"))
{
case "자연을 담은 돈까스":
imgShopData.setImageDrawable(getDrawable(R.drawable.img_shop_banner_1));
tvShopDataMenu.setText("일식");
imgStar1.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar2.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar3.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar4.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar5.setImageDrawable(getDrawable(R.drawable.ic_star_half));
tvShopDataAddress.setText("충북 청주시 상당구 용암북로168번길42-6");
tvShopDataCategory.setText("돈까스");
tvShopDataCall.setText("043-222-0076");
tvShopDataTime.setText("09시~ 22시");
tvShopDataNotWork.setText("없음");
tvShopDataInfoAddress.setText("충북 청주시 상당구 용암북로168번길42-6");
break;
case "금용":
imgShopData.setImageDrawable(getDrawable(R.drawable.img_shop_banner_2));
tvShopDataMenu.setText("중식");
imgStar1.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar2.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar3.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar4.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar5.setImageDrawable(getDrawable(R.drawable.ic_star_half));
tvShopDataAddress.setText("충북 청주시 청원구 내덕로33 1층");
tvShopDataCategory.setText("짜장면");
tvShopDataCall.setText("0507-1408-0765");
tvShopDataTime.setText("09시~ 21시");
tvShopDataNotWork.setText("매주 월요일");
tvShopDataInfoAddress.setText("충북 청주시 청원구 내덕로33 1층");
break;
case "봉용불고기":
imgShopData.setImageDrawable(getDrawable(R.drawable.img_shop_banner_3));
tvShopDataMenu.setText("한식");
imgStar1.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar2.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar3.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar4.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar5.setImageDrawable(getDrawable(R.drawable.ic_star_half));
tvShopDataAddress.setText("충북 청주시 청원구 상당로203번길14");
tvShopDataCategory.setText("돼지고기");
tvShopDataCall.setText("043-259-8124");
tvShopDataTime.setText("08시~ 22시");
tvShopDataNotWork.setText("없음");
tvShopDataInfoAddress.setText("충북 청주시 청원구 상당로203번길14");
break;
case "쇼킹":
imgShopData.setImageDrawable(getDrawable(R.drawable.img_shop_banner_4));
tvShopDataMenu.setText("분식");
imgStar1.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar2.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar3.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar4.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar5.setImageDrawable(getDrawable(R.drawable.ic_star_half));
tvShopDataAddress.setText("충북 청주시 청원구 수암로97");
tvShopDataCategory.setText("오징어김밥");
tvShopDataCall.setText("043-223-5573");
tvShopDataTime.setText("10시~ 20시");
tvShopDataNotWork.setText("매주 일요일");
tvShopDataInfoAddress.setText("충북 청주시 청원구 수암로97");
break;
case "성진식당":
imgShopData.setImageDrawable(getDrawable(R.drawable.img_shop_banner_4));
tvShopDataMenu.setText("분식");
imgStar1.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar2.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar3.setImageDrawable(getDrawable(R.drawable.ic_star));
imgStar4.setImageDrawable(getDrawable(R.drawable.ic_star));

tvShopDataAddress.setText("충북 청주시 청원구 수암로82");
tvShopDataCategory.setText("청국장");
tvShopDataCall.setText("043-255-2323");
tvShopDataTime.setText("08시~ 20시");
tvShopDataNotWork.setText("없음");
tvShopDataInfoAddress.setText("충북 청주시 청원구 수암로82");
break;
}

btnShopDataResult.setOnClickListener(v -> {
if (layInfo.getVisibility() == View.GONE)
{
layDefaultData.setVisibility(View.GONE);
layInfo.setVisibility(View.VISIBLE);
}
else
{
layDefaultData.setVisibility(View.VISIBLE);
layInfo.setVisibility(View.GONE);
}
layReview.setVisibility(View.GONE);
layMenu.setVisibility(View.GONE);
});

btnShopDataReview.setOnClickListener(v -> {
if (layReview.getVisibility() == View.GONE)
{
layDefaultData.setVisibility(View.GONE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.VISIBLE);
}
else
{
layDefaultData.setVisibility(View.VISIBLE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.GONE);
}
layMenu.setVisibility(View.GONE);
});

btnShopDataMenu.setOnClickListener(v -> {
if (layMenu.getVisibility() == View.GONE)
{
layDefaultData.setVisibility(View.GONE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.GONE);
layMenu.setVisibility(View.VISIBLE);
}
else
{
layDefaultData.setVisibility(View.VISIBLE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.GONE);
layMenu.setVisibility(View.GONE);
}
});
btnShopDataMenu.setOnClickListener(v -> {
if (layMenu.getVisibility() == View.GONE)
{
layDefaultData.setVisibility(View.GONE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.GONE);
layMenu.setVisibility(View.VISIBLE);
}
else
{
layDefaultData.setVisibility(View.VISIBLE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.GONE);
layMenu.setVisibility(View.GONE);
}
});
btnShopDataMenu.setOnClickListener(v -> {
if (layMenu.getVisibility() == View.GONE)
{
layDefaultData.setVisibility(View.GONE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.GONE);
layMenu.setVisibility(View.VISIBLE);
}
else
{
layDefaultData.setVisibility(View.VISIBLE);
layInfo.setVisibility(View.GONE);
layReview.setVisibility(View.GONE);
layMenu.setVisibility(View.GONE);
}
});

btnGoCredit.setOnClickListener(v -> {

switch (intent.getStringExtra("shopName")){
case "자연을 담은 돈까스":
startActivity(new Intent(ShopDataActivity.this, MenuActivity.class));
break;
case "금용":
startActivity(new Intent(ShopDataActivity.this, CreditActivity.class));
break;
case "봉용불고기":
startActivity(new Intent(ShopDataActivity.this, CreditActivity.class));
break;
case "쇼킹":
startActivity(new Intent(ShopDataActivity.this, CreditActivity.class));
break;
case "성진식당":
startActivity(new Intent(ShopDataActivity.this, CreditActivity.class));
break;
}
});
}

@Override
public void onMapReady(@NonNull @NotNull GoogleMap googleMap)
{
mgoogleMapInfo = googleMap;
final LatLng shopLocation;
MarkerOptions shopMarker = new MarkerOptions();

switch (getIntent().getStringExtra("shopName"))
{
case "자연을 담은 돈까스":
shopLocation = new LatLng(36.62181, 127.51649);
shopMarker.title("자연을 담은 돈까스");
break;
case "금용":
shopLocation = new LatLng(36.65740, 127.48401);
shopMarker.title("금용");
break;
case "봉용불고기":
shopLocation = new LatLng(36.64680, 127.48842);
shopMarker.title("봉용불고기");
break;
case "쇼킹":
shopLocation = new LatLng(36.64660, 127.48843);
shopMarker.title("쇼킹");
break;
case "성진식당":
shopLocation = new LatLng(36.64660, 127.48843);
shopMarker.title("성진식당");
break;
default:
throw new IllegalStateException("Unexpected value: " + getIntent().getStringExtra("shopName"));
}

shopMarker.position(shopLocation);
googleMap.addMarker(shopMarker);

googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback()
{
@Override
public void onMapLoaded()
{
mgoogleMapInfo.moveCamera(CameraUpdateFactory.newLatLng(shopLocation));
//                mgoogleMapInfo.animateCamera(CameraUpdateFactory.zoomTo(10));
}
}); // 구글맵 로딩이 완료되면 카메라 위치 조정
}
}

ShopListActivity

package com.social.doraji;

import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;

import androidx.appcompat.app.AppCompatActivity;

public class ShopListActivity extends AppCompatActivity
{
private Spinner spinnerFood;
private ListView lvShopList;
private ShopListAdapter adapter;

private EditText edShopSearch;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop_list);

edShopSearch = findViewById(R.id.ed_shop_search);

edShopSearch.setText(getIntent().getStringExtra("edData") != null ? getIntent().getStringExtra("edData") : "");

lvShopList = findViewById(R.id.lv_shop_list);
adapter = new ShopListAdapter();

lvShopList.setAdapter(adapter);

lvShopList.setOnItemClickListener((parent, view, position, id) -> {
Intent intent = new Intent(ShopListActivity.this, ShopDataActivity.class);
intent.putExtra("shopName", adapter.items.get(position).getTvShopName());
startActivity(intent);
});

spinnerFood = findViewById(R.id.spinner_food);
spinnerFood.setSelection(0);
spinnerFood.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
adapter.clear();
adapter.notifyDataSetChanged();
switch (position)
{
case 0:
adapter.addItem(getDrawable(R.drawable.img_shop_banner_1), "자연을 담은 돈까스", "별점4.5", "대표메뉴 왕 치즈 돈까스");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_2), "금용", "별점4.4", "대표메뉴 돌짜장");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_3), "봉용불고기", "별점4.8", "대표메뉴 돼지고기200G");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_5), "쇼킹", "별점4.7", "대표메뉴 오징어김밥");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_4), "성진식당", "별점4.3", "대표메뉴 청국장");
adapter.notifyDataSetChanged();
break;
case 1:
adapter.addItem(getDrawable(R.drawable.img_shop_banner_1), "자연을 담은 돈까스", "별점4.5", "대표메뉴 왕 치즈 돈까스");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_2), "금용", "별점4.4", "대표메뉴 돌짜장");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_3), "봉용불고기", "별점4.8", "대표메뉴 돼지고기200G");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_5), "쇼킹", "별점4.7", "대표메뉴 오징어김밥");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_4), "성진식당", "별점4.3", "대표메뉴 청국장");
adapter.notifyDataSetChanged();
break;
case 2:
adapter.addItem(getDrawable(R.drawable.img_shop_banner_1), "자연을 담은 돈까스", "별점4.5", "대표메뉴 왕 치즈 돈까스");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_2), "금용", "별점4.4", "대표메뉴 돌짜장");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_3), "봉용불고기", "별점4.8", "대표메뉴 돼지고기200G");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_5), "쇼킹", "별점4.7", "대표메뉴 오징어김밥");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_4), "성진식당", "별점4.3", "대표메뉴 청국장");
adapter.notifyDataSetChanged();
break;
case 3:
adapter.addItem(getDrawable(R.drawable.img_shop_banner_1), "자연을 담은 돈까스", "별점4.5", "대표메뉴 왕 치즈 돈까스");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_2), "금용", "별점4.4", "대표메뉴 돌짜장");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_3), "봉용불고기", "별점4.8", "대표메뉴 돼지고기200G");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_5), "쇼킹", "별점4.7", "대표메뉴 오징어김밥");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_4), "성진식당", "별점4.3", "대표메뉴 청국장");
adapter.notifyDataSetChanged();
break;
case 4:
adapter.addItem(getDrawable(R.drawable.img_shop_banner_1), "자연을 담은 돈까스", "별점4.5", "대표메뉴 왕 치즈 돈까스");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_2), "금용", "별점4.4", "대표메뉴 돌짜장");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_3), "봉용불고기", "별점4.8", "대표메뉴 돼지고기200G");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_5), "쇼킹", "별점4.7", "대표메뉴 오징어김밥");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_4), "성진식당", "별점4.3", "대표메뉴 청국장");
adapter.notifyDataSetChanged();
break;
case 5:
adapter.addItem(getDrawable(R.drawable.img_shop_banner_1), "자연을 담은 돈까스", "별점4.5", "대표메뉴 왕 치즈 돈까스");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_2), "금용", "별점4.4", "대표메뉴 돌짜장");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_3), "봉용불고기", "별점4.8", "대표메뉴 돼지고기200G");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_5), "쇼킹", "별점4.7", "대표메뉴 오징어김밥");
adapter.addItem(getDrawable(R.drawable.img_shop_banner_4), "성진식당", "별점4.3", "대표메뉴 청국장");
adapter.notifyDataSetChanged();
break;
}
adapter.addCopy();
}

@Override
public void onNothingSelected(AdapterView<?> parent)
{

}
});
String filterText = edShopSearch.getText().toString();
adapter.fillter(filterText);
edShopSearch.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
String filterText = edShopSearch.getText().toString();
adapter.fillter(filterText);
}

@Override
public void afterTextChanged(Editable s)
{
}
});
}
}

ShopListAdapter

package com.social.doraji;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class ShopListAdapter extends BaseAdapter
{
ArrayList<ShopListListViewItem> items = new ArrayList<>();
ArrayList<ShopListListViewItem> defaultItem = new ArrayList<>();
Context context;

@Override
public int getCount()
{
return items.size();
}

@Override
public Object getItem(int position)
{
return items.get(position);
}

@Override
public long getItemId(int position)
{
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
context = parent.getContext();
ShopListListViewItem ShopListListViewItem = items.get(position);

if (convertView == null)
{
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listviewitem_shop, parent, false);
}

ImageView imgItemShop = convertView.findViewById(R.id.img_item_shop);
TextView tvItemShopName = convertView.findViewById(R.id.tv_item_shopname);
TextView tvItemRating = convertView.findViewById(R.id.tv_item_rating);
TextView tvItemMenu = convertView.findViewById(R.id.tv_item_menu);

imgItemShop.setImageDrawable(ShopListListViewItem.getImgShop());
tvItemShopName.setText(ShopListListViewItem.getTvShopName());
tvItemRating.setText(ShopListListViewItem.getTvShopRating());
tvItemMenu.setText(ShopListListViewItem.getTvShopMenu());
return convertView;
}

public void addItem(Drawable imgShop, String tvShopName, String tvShopRating, String tvShopMenu)
{
ShopListListViewItem item = new ShopListListViewItem();

item.setImgShop(imgShop);
item.setTvShopName(tvShopName);
item.setTvShopRating(tvShopRating);
item.setTvShopMenu(tvShopMenu);

items.add(item);
}

public void clear()
{
items.clear();
}

public void addCopy(){
defaultItem.clear();
defaultItem.addAll(items);
}

public void fillter(String searchText)
{
items.clear();
if (searchText.length() == 0)
{
items.addAll(defaultItem);
}
else
{
for (ShopListListViewItem item : defaultItem)
{
if (item.getTvShopName().contains(searchText))
{
items.add(item);
}
}
}
notifyDataSetChanged();
}
}

ShopListListViewltem

package com.social.doraji;

import android.graphics.drawable.Drawable;

public class ShopListListViewItem
{
private Drawable imgShop;
private String tvShopName;
private String tvShopRating;
private String tvShopMenu;

public Drawable getImgShop()
{
return imgShop;
}

public void setImgShop(Drawable imgShop)
{
this.imgShop = imgShop;
}

public String getTvShopName()
{
return tvShopName;
}

public void setTvShopName(String tvShopName)
{
this.tvShopName = tvShopName;
}

public String getTvShopRating()
{
return tvShopRating;
}

public void setTvShopRating(String tvShopRating)
{
this.tvShopRating = tvShopRating;
}

public String getTvShopMenu()
{
return tvShopMenu;
}

public void setTvShopMenu(String tvShopMenu)
{
this.tvShopMenu = tvShopMenu;
}
}

SignUpActivity

package com.social.doraji;

import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.HashMap;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

public class SignUpActivity extends AppCompatActivity
{
private EditText edSignUpName;
private EditText edSignUpUserName;
private EditText edSignUpPassword;
private Button btnSignUp;

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);

edSignUpName = findViewById(R.id.ed_signup_name);
edSignUpUserName = findViewById(R.id.ed_signup_username);
edSignUpPassword = findViewById(R.id.ed_signup_password);
btnSignUp = findViewById(R.id.btn_signup);

btnSignUp.setOnClickListener(v -> {
if (edSignUpName.getText().length() != 0 && edSignUpUserName.getText().length() != 0 && edSignUpPassword.getText().length() != 0)
{
Log.e("hihi", edSignUpUserName.getText().toString() + " " + edSignUpPassword.getText().toString());
firebaseAuth.createUserWithEmailAndPassword(edSignUpUserName.getText().toString(), edSignUpPassword.getText().toString()).addOnCompleteListener(SignUpActivity.this, task -> {
if (task.isSuccessful())
{
FirebaseUser user = firebaseAuth.getCurrentUser();
HashMap<Object, String> hashMap = new HashMap<>();

assert user != null;
hashMap.put("uid", user.getUid());
hashMap.put("email", user.getEmail());
hashMap.put("name", edSignUpName.getText().toString());

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference reference = database.getReference("Users");
reference.child(user.getUid()).setValue(hashMap);

Toast.makeText(SignUpActivity.this, "회원가입 완료", Toast.LENGTH_SHORT).show();
finish();
}
else
Toast.makeText(this, "회원가입 오류", Toast.LENGTH_SHORT).show();
});
}
else
Toast.makeText(this, "입력창을 모두 채워주세요!", Toast.LENGTH_SHORT).show();
});
}
}

6. 마무리

6.1. 향후 추진 계획

향후 추진 계획으로 아직 완성하지못한 기능부분이 너무 많기 때문에 미흡한 부분 보완을 할 것이다. 그 중 결제진행에서 실제 포인트와 돈이 이동하는 부분에 대해 고려해야 할 사항이 많이 남아있고 관리자앱과 연동하여 포인트의 이동을 표현할 예정이다.

현재까지 구현하고 구상한 앱은 유저가 사용하는 앱과 관리자앱뿐이지만 부족한 관리자앱을 보강하고 식당에서도 정보를 주고받고 결제와 예약을 도와주는 앱을 만들어 총 3개의 앱을 운영할 수 있도록 할 것이다.

6.2. 정리

이번 캡스톤 디자인에서는 학교에서 배워보지못한 안드로이드 앱을 직접 만드는것에 도전했다. 자바기반으로 프로젝트를 진행하기 때문에 큰 문제가 없을것이라고 생각했지만 생각보다 어려움이 많았고 아무것도 모르는 백지상태의 초심자 상태에서 도전하는 기분이었다. 웹 서칭을 통해서 거의 모든 정보와 기술을 얻으면서 서칭하는 능력도 함께 기를 수 있었다.

주로 검색을 통해 프로젝트를 진행했기 때문에 인터넷에 공개된 자료의 양질에 따라 처음 계획했던 부분과 기능면이나 프로그램면에서도 변경을 하는 경우가 발생했다. 예로 데이터베이스를 이용할 때 계획했던 오라클과 mySQL은 안드로이드와 연동시 보안상의 문제로 php같은 다른 매개체가 필요하고 복잡해질 수 있다는걸 알게되어서 구글 파이어베이스로 변경했다.

노력에 비해 많이 부족한 진행도와 앱 완성도에 중간 중간 좌절할 수 있었지만 팀원들이 함께 가깝게 목표를 잡고 프로젝트를 진행하였고 조금씩 문제를 해결해 나가고 실력이 오르는 성취감을 얻었다. 1학기가 끝나고 졸업작품전까지 아직 시간이 남아있으니 앱에 대한 공부를 이어나가서 완성을 시키기로 하였다.

7. 부록

7.1. 사용자 메뉴얼

1. 로그인 메인화면
	회원가입과 로그인을 진행할 수 있다. user ID는 이메일형식만 가능하고 패스워드는 8자리 이상의 숫자, 문자 조합만 가능하다. [로그인 없이 이용]버튼을 통해 비회원으로도 이용가능하다.

2. 메인화면
	[주변식당]을 클릭하면 내위치와 주변 가맹식당들이 표시된다. [카테고리]를 클릭하면 가맹식당들의 리스트가 나타난다. [결제]를 클릭하면 포인트를 충전할 수 있다. 앱 상단 툴바의 [≡]를 클릭하면 네비게이션바를 확인할 수 있고 회원가입시 등록한 user name이 표시된다.

3. 예약화면
	음식점 예약화면에서 예약시간, 예약자 정보, 메뉴를 선택하여 예약할 수 있다.

4. 가게 정보 및 위치
	식당의 전화번호, 영업시간, 휴무, 주소등의 정보를 확인할 수 있고 지도를 통해 위치를 확인할 수 있다.