1. 진단테스트 결과 출력

- 테스트 점수에 따라 피해, 가해 정도를 [아주 약함 / 약함 / 보통 / 심함 / 아주 심함]으로 분류하여 상세 진단 내용 출력

- 프로그레스바로 최대 점수 중 몇 점을 차지했는지 나타냄

 

피해/가해 정도 결과 상세 내용

 

2. 채팅 내역 전체 삭제 기능 구현

- 상단바에 있는 삭제 버튼을 클릭하면 삭제 안내 팝업이 뜸

- 확인을 클릭하면 지금까지 진행한 모든 채팅 내역이 삭제됨

 

채팅 전체 내역 삭제 팝업

 

3. 채팅 내역이 없을 때 챗봇 웰컴 메세지 출력

- 채팅 화면에 처음 접속했을 때, 또는 채팅 내역 전체 삭제를 진행했을 때 웰컴 메세지를 받음

- 사용자에게 예시 질문을 보여줌으로써 원활한 1:1 상담 채팅을 이용할 수 있도록 함

 

채팅을 처음 시작할 때 웰컴 메세지 출력 (챗봇 가이드 느낌)

 

4. 메인 화면 랜덤 문구 리스트 추가

- strings.xml에 string-array의 item들로 랜덤 문구 리스트를 저장하고 랜덤으로 출력하게 함

 

앱에 접속할 때마다 메인 화면 상단에 사용자를 응원하는 랜덤 문구가 출력된다

 


현재 진단테스트 점수에 따라 결과 상세 내용을 출력하고,

1:1 채팅에서 dialogflow에 작성된 인텐트에 따라 상담을 진행할 수 있는 상태이다.

 

테스트 결과와 챗봇 내용을 구성하고 dialogflow에 옮기기까지 많은 시간이 걸렸을 것 같은데

이것을 무사히 끝낸 팀원들에게 박수를 보낸다👏👏👏... 덕분에 앱의 완성도가 한층 높아진 것 같다!

 

상담 내용 디테일👍

 

7월 한달간 앱의 많은 기능들을 구현했다.

이제 8월에는 교화 프로그램을 통한 마음 온도 조정, 기능 제한, 앱 디자인 보완 등을 중점적으로 다루면 될 것 같다.

1. 자유게시판 댓글 개수 표시

- 공감 개수 표시는 지난번에 구현 완료했었고 이번에 댓글 개수 표시까지 완료함


2. 익명게시판 목록에서 댓글 개수 표시X, 글 내용 페이지에서 댓글 영역 제거

 

3. 익명게시판 글 작성자 닉네임 대신 익명으로 뜨도록 함


4. 앱 내부 폰트 변경 (어비미미체)

 

 

이젠 댓글 개수도 표시되는 자유게시판
익명게시판에서는 댓글 기능을 지원하지 않으므로 영역 제거

 

이로써 게시판 기능은 구현 끝!

이제 테스트, 채팅 기능과 앱 전반적인 디자인에 신경써야할 때인것 같다.

일주일 전에 정보처리기사 실기 시험 보고나서 한동안 아무 의욕 없이 지내다가

오늘에서야 다시 의욕이 되돌아온듯 하다.

그동안 많이 쉰만큼 오늘은 12시간동안 빡세게 개발했지!⭐🤸‍♀️

 

 

1. 게시글 공감 기능

- 각 게시글마다 공감 버튼을 누른 사용자의 uid를 Firebase DB에 저장

- 몇 명이 공감을 눌렀는지 실시간으로 반영하여 화면에 표시함

- 금방 구현할줄 알았는데 PostAdapter의 구조 변경이 많이 이루어져서 생각보다 시간이 오래 걸렸던 작업

 

공감 버튼을 클릭하면 하트가 채워지고 공감 수가 오른다. 같은 버튼으로 공감 취소도 가능하다.

 

게시판의 글 목록에서도 공감 수를 확인할 수 있다. 댓글 수는 나중에 추가할 예정이다.

 

2. 메인 화면 사이드바 구현

- 메인 화면 좌측 상단 버튼을 클릭하면 사이드바가 나옴

- DrawerLayout, NavigationView를 이용하여 구현 (https://onelight-stay.tistory.com/86 참고)

- NavigationView는 headerLayout(헤더 부분)과 menu(메뉴 부분)를 포함함

- 각 메뉴를 클릭했을 때 해당 페이지로 이동하도록 구현함

 

좌측 상단 버튼을 클릭했을 때 사이드바가 나오는 모습이다. 진단테스트 ~ 마이페이지 버튼 클릭 시 해당 페이지로 이동한다.

 

3. 1:1 상담 채팅 날짜 표시

- 보통 메신저 앱을 이용할 때 각 날짜를 기준으로 가장 상단 부분에 날짜가 출력됨 → 이것을 구현

- 채팅 시간 표시도 구현할까 했으나, 사람간의 대화도 아닐뿐더러 사용자가 보낸 이후 몇 초만에 챗봇으로부터 답장이 오기 때문에 시간은 그닥 중요하지 않다고 판단하고 구현하지 않았음

날짜 별 채팅의 가장 상단에 날짜가 출력되는 모습이다.

 

4. 다크모드를 적용하지 않도록 수정

- 항상 기본모드로 폰을 사용해서 몰랐는데 다크모드일 때 앱을 접속하면 themes.xml (night)의 테마가 적용되는듯함

- 다크모드를 고려하지 않고 항상 동일한 테마를 제공하기 위해 스플래시.java에 다음 코드를 추가함

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

 

5. 게시글 삭제 시 관련 댓글, 공감도 DB에서 삭제하도록 코드 추가

- 기존 코드는 글을 삭제했을 때 해당 글의 댓글 데이터를 삭제하는 부분이 없었음

- 따라서 댓글과 오늘 구현한 공감 모두 관련 글이 삭제되면 같이 삭제되도록 구현함

 

6. 게시글 내용 페이지 드롭다운 메뉴 추가

- 원래는 수정, 삭제 버튼이 글 내용 하단에 있었는데 이것을 드롭다운 메뉴로 변경

우측 상단 버튼을 클릭하면 수정/삭제 버튼이 있는 드롭다운 메뉴가 나온다.

 

7. 익명게시판 게시글 댓글 영역 삭제

- 자유게시판에는 댓글과 공감, 익명게시판에는 공감 기능만 제공할 것이기 때문에 익명게시판 글은 댓글 영역을 안보이도록 setVisibility(View.GONE); 적용

댓글 영역이 사라진 익명게시판 글 내용 페이지이다.

 

8. 각 페이지의 상단바 통일

- 높이 70dp에 좌측 상단에 뒤로가기 버튼 추가

 


게시판 공감 기능 구현을 완료하였으니, 댓글 수 출력 이외의 게시판 기능 구현은 모두 완료한 듯 하다!!👍

뭔가 앱다운 앱을 만들고 싶어서 메인 화면에 사이드바를 추가했는데, 생각보다 어렵지 않은 방법이 있어 금방 구현했다.

 

나중에는 메인 화면 레이아웃을 한번 갈아 엎을 예정이다.

현재 메인 화면은 프로토타입(내가 작성했었음)과 너~~무 똑같아서 좀 단순하달까?? 다채로운 느낌이 들진 않는다.

실제로 출시된 앱들의 메인 화면을 찾아보면서 참고해야겠다!

 

앱의 기능을 하나씩 구현해나가고, 디자인이 점차 개선되는 것을 보니 뿌듯하다✌

1. 로그아웃 기능 추가

- 마이페이지에 로그아웃 버튼 추가

- 파이어베이스 Authentication에서 로그아웃 필요

FirebaseAuth.getInstance().signOut();

- 로그아웃을 진행하면 기존에 실행되던 액티비티를 모두 종료하고 로그인 화면 액티비티만 새롭게 실행하도록 구현이 필요했음

- https://woochan-dev.tistory.com/41 포스팅의 내용을 참고하여 이것을 구현함

- addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) 처럼 인텐트에 flag를 부여할 수 있다는 사실을 알게 되었음

Intent intent = Intent(this, 실행할 액티비티.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)

 

2. 레이아웃 수정

- 일부 페이지 상단바 디자인 통일

- 게시글 작성/수정 페이지 레이아웃 수정

 

3. 메인 화면 랜덤 문구 출력

 

4. 1:1 상담 채팅 마음이 아이콘 추가

- adapter_message_one.xml 레이아웃 수정

 


 

 

마이페이지에 임시로 추가한 로그아웃 버튼을 클릭하면 팝업이 뜨게 되고 "네"를 클릭하면

기존에 실행되던 액티비티 (메인 화면, 마이페이지) 가 실행 종료되고 새롭게 로그인 화면 액티비티가 실행된다.

 

새로운 인텐트를 만들 때 context를 넘겨야하고, 액티비티가 스택처럼 쌓이는데

어떻게 기존 액티비티를 모두 종료시키며, 모두 종료시킨 후에 새로운 액티비티를 생성할 수 있을지가 고민이었다.

구글링해보니 Intent.addFlags() 메소드가 있어 새로 만들 인텐트에 대해 flag를 추가할 수 있었다.

새로운 사실을 알게 되었다!

 

 

지금 주요 기능 자체는 거의 구현이 되었고, 앱의 디자인이나 세부 기능들을 건드리고 있는데

최근에 Dialogflow가 제대로 연동되었기 때문에 이제 챗봇의 인텐트에서 질문 - 응답을 구현하기 시작할 것이다!

1. 게시글 작성 페이지 레이아웃 수정

2. Dialogflow - Android Studio 연결 완료

3. 1:1 상담 채팅 내역 Firebase DB 저장

4. 1:1 상담 채팅 내역 Firebase DB에서 읽어오고 화면에 띄우기

 

 

어제는 정말 감격스러운 날이었다!!😂

 

우리는 1:1 상담 기능을 구현하기 위해서 Google Dialogflow 챗봇 API를 이용하기로 했다.

6월부터 Dialogflow와 관련된 문서를 열심히 구글링해보았는데 검색 결과가 많이 나오지 않을 뿐더러,

특히 Android Studio에서 Dialogflow를 연결하는 방법에 대해 작성한 게시물이 전혀 없는 것이다...

더군다나 Dialogflow를 이용하기 위해서는 GCP(Google Cloud Platform)에서 서비스 계정을 만들고

fulfillment를 제대로 작성해야 하는데 그 과정에서 오류가 굉장히 많이 일어나서 팀원분이 정말 고생하셨었다.

 

그리고 어제! 문제를 모두 해결하였고

앱 화면에 Dialogflow 봇과의 채팅을 띄울 수 있도록 미리 작성해둔 코드를 실행하였는데

화면에 내가 보낸 채팅과, 봇의 답장이 모두 정상적으로 출력이 되는 것이다!! ㅠ_ㅠ

연결이 완료되고 난 후에는 Firebase DB에 저장/조회하는 코드를 빠르게 작성해서

1:1 상담 메뉴에 재접속했을 때 이전의 채팅 내역을 불러올 수 있도록 구현했다.

 

드디어 Dialogflow의 intent와 entities를 구성할 준비가 되었다...

빠르게 공부해서 본격적으로 챗봇 구성을 시작하고 싶다!!

 


게시글 작성 레이아웃을 깔끔하게 수정했다.

 

Dialogflow와 연결되어 정상적으로 채팅 기능을 이용하는 모습❤

 

새벽 시간에 완전 집중해서 개발했다!! 덕분에 많은 진전이 있었다.

슬슬 앱의 디자인적인 요소를 신경써야할거 같아서 폰트나 테마를 수정해봤고

주요 기능인 진단테스트 구현을 하루만에 거의 다 완성해서 좋다.

 

 

1. 로그인 사용자 싱글톤 패턴으로 관리

- 앱 기능 구현할 때 현재 로그인한 사용자 정보를 불러오는 경우가 많이 있는데 이것을 매번 firebase DB에서 불러오는 것이 비효율적이라는 생각이 들었음

- 최초 로그인 또는 앱에 재접속할 때 사용자 정보를 DB에서 불러와서 저장해두도록 함

- 사용자 정보가 필요할 때 해당 객체에 저장된 데이터 이용


2. 게시판 사용자 아이디 반영

- 글 작성 시 현재 로그인한 사용자의 uid를 같이 저장함

- uid를 이용해서 자신이 작성한 게시글만 수정/삭제할 수 있도록 함 (버튼 visibility 설정)

- 댓글 작성 시 현재 로그인한 사용자의 uid를 같이 저장함
- 마찬가지로 uid를 이용해서 자신이 작성한 댓글만 삭제할 수 있도록 함


3. 메인 화면 뒤로가기 버튼 클릭 시 팝업

- 메인화면에서 뒤로가기 버튼을 누르면 아무 메세지 없이 앱이 종료되는 상태였음

- 뒤로가기 버튼을 클릭하면 다이얼로그 팝업이 뜨면서 앱을 종료할지 묻고 "네"를 클릭하면 앱이 종료됨


4. 앱 디자인, 레이아웃
- style.xml을 이용해서 커스텀 폰트 적용, 버튼 기본 스타일 지정

- themes.xml에서 상속받는 테마를 Theme.AppCompat.DayNight.NoActionBar로 변경 (상단바 없앰)
- linear layout로 레이아웃 구현한 페이지들 -> constraint layout으로 다수 변경


5. 진단테스트
- 테스트 문항 데이터는 JSON 파일에 입력했고 assets 폴더에 저장함 (https://lktprogrammer.tistory.com/175 참고)
- 테스트 문항 목록을 recyclerview -> listview로 수정

- listview의 메모리 관리로 인해 스크롤하면 체크한 문항의 체크 표시가 사라지는 현상이 발생함 -> 체크 표시가 사라지지 않도록 코드 추가 작성 (https://kawaiineko.tistory.com/19 참고)
- 프로그레스바와 이미지 이동 애니메이션을 통해 테스트 진행 정도를 나타내도록 함 (프로그레스바 - https://www.youtube.com/watch?v=K5bFv_WDjVY , 이동 애니메이션 - https://www.masterqna.com/android/2980/이미지를-이동시키는-애니메이션을-만드는-방법을-질문합니다 참고)
- 모든 문항을 체크한 경우, 테스트 결과를 계산하고 DB에 저장
- 테스트 결과 화면에 점수를 출력함

 


 

앱 구상할 때 끄적였던 이미지도 간단하게 넣었고 기본 버튼 색에서 벗어나 연두색으로 버튼 기본 색상을 지정했다.

 

게시글, 댓글에 작성자의 이름이 출력되도록 반영했고 자신이 작성한 것만 수정/삭제 버튼이 존재한다.

 

메인 화면에서 뒤로가기 버튼을 클릭했을 때 팝업이 나온다.

 

진단테스트 진행 화면. 진행도에 따라 프로그레스바 값이 변한다.

 

테스트 결과 화면에 선택한 답변에 따라 계산된 점수가 표시된다.

 

1. 1:1 상담 채팅(dialogflow) - 앱 내의 레이아웃 구현
- https://www.youtube.com/watch?v=zVxDBBCdpfY 이 영상에 나온 방법대로 구현

- 메세지 전송 시 화면에 해당 메세지가 출력되는 상태

- 현재 dialogflow 서비스 계정에 문제가 생겨 제대로 작동하지 않고 있음. 이 부분을 고치기 위해 방법 찾아보는 중

 

2. 회원가입 관련

- 사용자 계정 관리는 firebase authentication을 이용해서 구현하기로 했음

- 회원가입을 위해 이메일, 비밀번호, 이름을 입력했는데 오류 발생 (task.IsSuccessful()이 false값을 리턴함)

- 구글링 결과, firebase authentication 자체에서 6글자 이상의 비밀번호만 사용 가능하게 되어있다는 것을 알게 되었음

- 회원가입 진행 코드에서 비번 길이를 확인해서 6글자 이하일때 토스트 메세지로 알리도록 함


3. 로그인 관련

- 앱 최초 실행 시 로그인 화면으로 이동, 회원가입으로 계정 생성 후 로그인 -> 메인 화면으로 이동하도록 함

- 이미 로그인을 한 적 있는 사용자는 로그인 과정 없이 (로그인 유지) 바로 메인 화면으로 이동하도록 구현

 

4. 마이페이지 사용자 정보 조회

- 로그인한 사용자의 이름, 이메일을 마이페이지 프로필에 띄우도록 함

 

이메일과 비밀번호를 입력해서 로그인 진행

 

1:1 상담 채팅 레이아웃 구현해서 채팅 입력 시 화면에 채팅 내역 출력

 

로그인한 사용자의 이름, 이메일 출력

  • 새로운 Firebase 프로젝트 DB와 안드로이드 스튜디오 연결하기

 

오늘은 회의가 있는 날이었다.

일기장, 게시판 주요 기능 구현은 거의 다 마친 상태에서 앞으로 구현해야할 기능들에 대해 얘기를 나눴고

1:1상담 구현을 위해 필요한 Dialogflow를 연동하기 위해

기존에 사용하던 Firebase 프로젝트가 아닌 Dialogflow와 연동된

새로운 Firebase 프로젝트를 이용하도록 google-service.json 파일을 변경했다.

 

왜인지 모르겠지만 google-service.json 파일을 변경했음에도 불구하고 계속 기존 DB에 연결이 되었다.

이것의 원인을 찾지 못한 채로 회의를 마쳤고 문제 해결 방법을 찾아보았다.

 

내가 찾은 자료는 여러 개의 Firebase DB를 이용하는 방법이었는데

 

https://stackoverflow.com/questions/53189746/what-will-firebase-getinstance-get-if-there-are-multiple-databases

 

What will firebase.getInstance() get if there are multiple databases

I was using a firebase database in my Android app. Now I need to use another database but I want to know for the old versions of my app what will "firebaseDatabase.getInstance" return? Which database

stackoverflow.com

 

 

FirebaseOptions options = new FirebaseOptions.Builder()
        .setApplicationId("앱ID")
        .setApiKey("API key")
        .setDatabaseUrl("DB Url")
        .build();

FirebaseApp.initializeApp(this, options, "이름");

FirebaseApp secondary = FirebaseApp.getInstance("이름");
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondary);​

 

FirebaseOptions와 FirebaseApp.initializeApp을 이용해서 이름을 지정해서 이용하는 것이었다.

이 방법대로 하면 연결은 되긴 하나, FirebaseApp의 디폴트 DB는 기존 DB와 연결이 돼서

이름 부분을 생략하고 FirebaseApp.initializeApp(this, options); 라고 적었더니

java.lang.IllegalStateException: FirebaseApp name [DEFAULT] already exists! 이런 오류가 발생했다.

 

디폴트 DB를 원하는 DB로 설정하지 않으면

Firebase를 사용하는 모든 java 파일에서 해당 부분을 수정해야했기 때문에

분명 다른 방법이 있을 것이라 생각하고 더 찾아보았다.

 

FirebaseApp.getInstance().delete();

 

이렇게 디폴트 DB를 삭제하면 더이상 오류는 발생하지 않는 것을 확인했지만

google-service.json 파일을 지웠는데도 기존 DB와 연결이 되는 것이 여전히 이해가 되지 않았다.

 

 

그리고 새벽에 팀원분이 우리와 똑같은 문제를 겪고 해결한 사례를 작성한 포스팅 링크를 보내주셨다.

 

https://bamgasi.tistory.com/m/2

 

firebase 프로젝트 변경방법

firebase 프로젝트 변경방법 앱 개발 초기 테스트로 firebase 프로젝트를 생성 후 라이브 시에 새로운 프로젝트로 변경해야 할 일이 생겼다. 이에 대한 변경방법이다. 일반적인 웹프로젝트는 config

bamgasi.tistory.com

 

포스팅을 읽어보면 알겠지만... 그렇다.

안드로이드 스튜디오 Build 메뉴에서 Rebuild Project를 하면 끝나는 것......!!!

 

다행스럽게도(?) 위의 방법을 따라하니 새로운 Firebase DB와의 연결이 제대로 되었다.

json 파일 변경하면 Rebuild 해야한다는건 전혀 몰랐지... 그래서 한참 헤맸는데

그나마 하루 이상 넘기지 않고 문제가 해결돼서 다행이라고 생각하자...

 

내일부터 다시 앱 기능 구현에 집중해야겠다!!

+ Recent posts