Skip to content
Open

, #70

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
d8a4bcf
Merge pull request #62 from Hyobeen-Park/master
Songjeongyeon Aug 17, 2022
c56e8d2
fix bug
Hyobeen-Park Aug 17, 2022
f0676cf
Merge pull request #65 from Hyobeen-Park/master
Songjeongyeon Aug 17, 2022
2facf38
채팅 디자인 & 로그인 디자인 수정
Songjeongyeon Aug 17, 2022
8d52709
Merge pull request #66 from Hyobeen-Park/design-jy
Songjeongyeon Aug 17, 2022
51b1be0
help!!!!!!!!! by Hyobeen.,,,
Hyobeen-Park Aug 17, 2022
b7d67ce
Merge branch 'Hyobeen-Park'
Hyobeen-Park Aug 17, 2022
a379e5a
소망약국 디자인 추가
Songjeongyeon Aug 17, 2022
73e4675
Merge pull request #67 from Hyobeen-Park/design-jy
Songjeongyeon Aug 17, 2022
a8e915f
test
Hyobeen-Park Aug 17, 2022
4515907
디자인 수정
Hyobeen-Park Aug 17, 2022
9e42904
Merge branch 'Hyobeen-Park'
Hyobeen-Park Aug 17, 2022
3e059ac
column subTitle
Hyobeen-Park Aug 17, 2022
3473fa0
login -> warn
Hyobeen-Park Aug 17, 2022
ae4a86a
chat image
Hyobeen-Park Aug 17, 2022
afedfe3
fix bug
Hyobeen-Park Aug 17, 2022
4fc42db
Add the Service Introduce
YUDINDIN1005 Aug 17, 2022
d50eaf8
Update MapsFragment Error
YUDINDIN1005 Aug 17, 2022
69d9b08
Merge pull request #68 from Hyobeen-Park/master
Songjeongyeon Aug 17, 2022
6ef5573
마지막
Songjeongyeon Aug 17, 2022
87dbb0c
Merge pull request #69 from Hyobeen-Park/design-jy
Songjeongyeon Aug 17, 2022
4ddffa9
Update ColumnDetailActivity.kt
jeong-1 Aug 17, 2022
b98fbb3
Merge branch 'master' of https://github.com/Hyobeen-Park/MapForGirls
jeong-1 Aug 17, 2022
7cec28c
Create README.md
jeong-1 Jul 3, 2023
7e31f27
Update README.md
jeong-1 Jul 3, 2023
89f8f50
Update README.md
jeong-1 Jul 3, 2023
0e958b6
Update README.md
jeong-1 Jul 3, 2023
488e26c
Update README.md
jeong-1 Jul 3, 2023
213a02e
Update README.md
jeong-1 Jul 3, 2023
0d92974
Update README.md
jeong-1 Jul 8, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 44 additions & 26 deletions .idea/misc.xml

Large diffs are not rendered by default.

30 changes: 30 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# MapForGirls(소녀지도)
<b>Comprehensive medical assistant for girls</b><br>
<p align="center"><img width="500" alt="logo-title-light" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/e319c4b0-1d4d-4dbd-961d-b5b36315849f"></p>

## 💭 Problem
현재 서울시에는 10대 여성 청소년을 위해 건강 상담과 의약품 지원, 지원 시설 연계 서비스 등을 제공하는 '소녀 돌봄 약국' 사업을 진행하고 있다. 하지만 홍보 부족으로 청소년들은 소녀 돌봄 약국이 존재하는지도 위치가 어디 있는지도 잘 알지 못한다. 게다가 소녀 돌봄 약국의 위치 리스트가 제공되기는 하나 줄 글과 사진으로만 제공이 되기 때문에 본인 주변의 약국을 일일이 찾아봐야 한다는 어려움이 있다.

## 🗺️ About MapForGirls
<b>10대 여성 청소년을 위한 길잡이</b><br>
'소녀지도'는 내 위치를 기반으로 주변의 소녀 돌봄 약국이 어디 있는지를 표시해 줌과 더불어 약사님과의 일대일 채팅 서비스를 제공한다. 또한, 다양한 성 지식 칼럼을 통해 10대 여성 청소년의 올바른 성 인식을 함양시킨다.

## 📱 How to use
<p>지도(메인화면)</p>
<p><img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/d5369aaf-ea9c-4ac0-b721-a7e2d47e96fb"/></p>
<br>
<p>채팅</p>
<p><img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/4eba97c5-5883-41c7-bd00-d8784d6de750"/>
<img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/609a463b-7f98-4c3f-81a6-30a4efe7916c"/></p>
<br>
<p>성 지식 칼럼</p>
<p><img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/cdb5dec6-71b2-401d-a21e-d951034d8b89"/>
<img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/2c16036b-e228-49e4-ae55-950f0ca197bb"/></p>
<br>
<p>생리대 추천 테스트</p>
<p><img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/cc12d8cb-f792-4eea-9350-a8d192e8f1b7"/>
<img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/f3c57dee-f0e2-4459-906b-2d099a73cfe2"/>
<img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/079b99fd-41b1-44ca-b107-dbccb7daabb0"/></p>
<br>
<p>마이페이지</p>
<img width="200" src="https://github.com/Hyobeen-Park/MapForGirls/assets/68230434/5996e148-2e6a-4fbb-909c-98eb50cd359e"/>
4 changes: 3 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@
<activity android:name=".FindpwActivity" />
<activity android:name=".UserActivity" />
<activity android:name=".CertifyActivity" />
<activity android:name=".TestActivity" />
<activity android:name=".ui.test.TestActivity" />
<activity android:name=".ProfileActivity" />
<activity android:name=".ui.main.columns.ColumnDetailActivity" />
<activity android:name=".ui.main.chatting.ChattingDetailActivity"/>
<activity android:name=".ui.test.TestResultActivity"/>
<activity android:name=".IntroduceActivity"/>

</application>

Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/com/example/mapforgirls/IntroduceActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.mapforgirls

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class IntroduceActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_introduce)
}
}
13 changes: 11 additions & 2 deletions app/src/main/java/com/example/mapforgirls/LoginActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.util.Patterns
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.auth.FirebaseAuth
Expand Down Expand Up @@ -37,10 +38,16 @@ class LoginActivity : AppCompatActivity() {
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
//텍스트 입력 전
login_email_warn.visibility = View.INVISIBLE
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
//텍스트 입력 중
activate_login = isEmail(login_email_et.text.toString()) // 아이디가 이메일 형식일 경우에 로그인 버튼 활성화 준비
if(activate_login!!){
login_email_warn.visibility = View.INVISIBLE
} else {
login_email_warn.visibility = View.VISIBLE
}
isActive(activate_login, activate_pw)
}
})
Expand Down Expand Up @@ -104,9 +111,11 @@ class LoginActivity : AppCompatActivity() {
moveMainPage(task.result.user)
} else { // 아이디와 패스워드가 틀렸을 경우
if (task.exception?.message.equals("The password is invalid or the user does not have a password.")) { // 비밀번호가 틀렸을 경우
Toast.makeText(this, "비밀번호가 일치하지 않습니다.", Toast.LENGTH_LONG).show()
login_pw_warn.visibility = View.VISIBLE
login_pw_warn.text = "비밀번호가 일치하지 않습니다."
} else if (task.exception?.message.equals("There is no user record corresponding to this identifier. The user may have been deleted.")) { // 존재하지 않는 계정일 경우
Toast.makeText(this, "계정이 존재하지 않습니다.", Toast.LENGTH_LONG).show()
login_pw_warn.visibility = View.VISIBLE
login_pw_warn.text = "계정이 존재하지 않습니다."
} else { // 로그인 오류
Toast.makeText(this, task.exception?.message, Toast.LENGTH_LONG).show()
}
Expand Down
8 changes: 4 additions & 4 deletions app/src/main/java/com/example/mapforgirls/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,11 @@ class MainActivity : AppCompatActivity() {
initBottomNavigation()
}

override fun onDestroy() {
super.onDestroy()

initScrapDB()
override fun onStop() {
super.onStop()

// initScrapDB()
database.child("users").child("XaJxoewI9kU2wRGUXOaX9l1q65E3").child("scrap").removeValue()
}

private fun initScrapDB() {
Expand Down
10 changes: 6 additions & 4 deletions app/src/main/java/com/example/mapforgirls/MapsFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ class MapsFragment : Fragment() {
lateinit var mainActivity: MainActivity

companion object {
private val MAPVIEW_BUNDLE_KEY = "MapViewBundleKey"
private val markerIconSize = 100
}

Expand Down Expand Up @@ -99,11 +98,11 @@ class MapsFragment : Fragment() {
val markerOptions = MarkerOptions()
markerOptions.title("현재 위치")
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapUtils.resizeMapIcons(requireContext(), R.drawable.marker, markerIconSize, markerIconSize)))
googleMap.addMarker(markerOptions.position(currentLocation))

var marker = googleMap.addMarker(markerOptions.position(currentLocation))
marker?.tag = "current"
moveCamera(googleMap, currentLocation.latitude, currentLocation.longitude)

googleMap!!.setOnMarkerClickListener(null)

}
}

Expand All @@ -112,6 +111,9 @@ class MapsFragment : Fragment() {
// 마커 클릭 시 카드뷰 띄움
googleMap!!.setOnMarkerClickListener(object : GoogleMap.OnMarkerClickListener {
override fun onMarkerClick(marker: Marker): Boolean {
if(marker.tag == "current") {
return false
}
cardView.visibility = View.VISIBLE

// 약국별 상세정보
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/example/mapforgirls/MypageFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ class MypageFragment : Fragment(){
val intent = Intent(context, ProfileActivity::class.java)
startActivity(intent)
}
binding.mypageIntroTv.setOnClickListener {
val intent = Intent(context, IntroduceActivity::class.java)
startActivity(intent)
}
binding.mypageGirlLogoutTv.setOnClickListener { // 로그아웃
auth.signOut()
moveLoginPage()
Expand Down
20 changes: 0 additions & 20 deletions app/src/main/java/com/example/mapforgirls/TestActivity.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ data class ColumnData(
var columnId : String? = "00",
var cover : Int? = null,
var title : String = "",
var subTitle : String = "",
var author : String = "",
var content : String = "",
@PrimaryKey(autoGenerate = true) var id: Int = 0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.example.mapforgirls.ui.main.chatting

import android.annotation.SuppressLint
import android.util.Log
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.example.mapforgirls.PharmacyData
import com.example.mapforgirls.R
import com.example.mapforgirls.data.entities.ColumnData
import com.example.mapforgirls.data.model.ChatModel
import com.example.mapforgirls.databinding.ActivityChattingDetailBinding
Expand Down Expand Up @@ -58,8 +59,10 @@ class ChatRVAdapter(private val chatList: ArrayList<ChatModel.Comment>, private
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if(chatList[position].uid.equals(userId)){ // 본인 채팅
holder.binding.itemMessageLlayout.gravity = Gravity.RIGHT
holder.binding.itemMessageTv.background = ContextCompat.getDrawable(holder.binding.root.context, R.drawable.img_chat_girls)
}else{ // 상대방 채팅
holder.binding.itemMessageLlayout.gravity = Gravity.LEFT
holder.binding.itemMessageTv.background = ContextCompat.getDrawable(holder.binding.root.context, R.drawable.img_chat_women_red)
}

holder.bind(chatList[position])
Expand All @@ -74,6 +77,4 @@ class ChatRVAdapter(private val chatList: ArrayList<ChatModel.Comment>, private
}
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.mapforgirls.MainActivity
import com.example.mapforgirls.PharmacyData
import com.example.mapforgirls.databinding.FragmentChattingBinding
import com.google.firebase.firestore.FirebaseFirestore
import java.lang.Exception

class ChattingFragment : Fragment() {
lateinit var binding: FragmentChattingBinding
Expand All @@ -24,6 +26,12 @@ class ChattingFragment : Fragment() {
binding = FragmentChattingBinding.inflate(inflater, container, false)

setPharmacistData()
try {
val chattingRoomAdapter = ChattingRoomsRVAdapter(requireContext())
binding.chattingRoomsRv.adapter = chattingRoomAdapter
} catch (e : Exception) {
Log.d("ChattingFragment", e.message.toString())
}

return binding.root
}
Expand Down Expand Up @@ -56,4 +64,10 @@ class ChattingFragment : Fragment() {
}
}

// 채팅방
private fun setChattingRoomsData() {
val chattingRoomAdapter = ChattingRoomsRVAdapter(requireContext())
binding.chattingRoomsRv.adapter = chattingRoomAdapter
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package com.example.mapforgirls.ui.main.chatting

import android.annotation.SuppressLint
import android.content.Context
import android.content.Context.MODE_PRIVATE
import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.mapforgirls.PharmacyData
import com.example.mapforgirls.R
import com.example.mapforgirls.UserInfo
import com.example.mapforgirls.data.model.ChatModel
import com.example.mapforgirls.databinding.ActivityCertifyBinding.bind
import com.example.mapforgirls.databinding.DialogPharmacistBinding.bind
import com.example.mapforgirls.databinding.ItemChattingRoomBinding
import com.example.mapforgirls.databinding.ItemPharmacistBinding
import com.google.firebase.database.*
import com.google.firebase.database.ktx.getValue

class ChattingRoomsRVAdapter(val context: Context): RecyclerView.Adapter<ChattingRoomsRVAdapter.ViewHolder>() {
val chatRoomList = ArrayList<ChatModel>() // 채팅방 데이터들
val chatRoomKeys = ArrayList<String>() // 채팅방 키
val userId = context.getSharedPreferences("userInfo", MODE_PRIVATE).getString("uid", "")
val adapter = this

val database = FirebaseDatabase.getInstance().reference

init {
getChattingRoomsData()
Log.d("data", "inint")

Log.d("data", chatRoomList.size.toString())
}

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
var view = LayoutInflater.from(context).inflate(R.layout.item_chatting_room, viewGroup, false)
Log.d("data", "create")
Log.d("data", chatRoomList.size.toString())
return ViewHolder(ItemChattingRoomBinding.bind(view))
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
var destinationUid: String
if(chatRoomList[position].users!!.keys.first() != userId) {
destinationUid = chatRoomList[position].users!!.keys.first()
} else {
destinationUid = chatRoomList[position].users!!.keys.last()
}
database.child("users").orderByKey().equalTo(destinationUid)
.addListenerForSingleValueEvent(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
holder.destinationUser = snapshot.getValue<UserInfo>()!!
holder.binding.itemChattingPharmacistTv.text = snapshot.child("name").value.toString()
}

override fun onCancelled(error: DatabaseError) {
Log.d("ChattinRoomRVAdapter", error.message)
}
})

// holder.background.setOnClickListener() //채팅방 항목 선택 시
// {
// try {
// var intent = Intent(context, ChatRoomActivity::class.java)
// intent.putExtra("ChatRoom", chatRooms.get(position)) //채팅방 정보
// intent.putExtra("Opponent", holder.opponentUser) //상대방 사용자 정보
// intent.putExtra("ChatRoomKey", chatRoomKeys[position]) //채팅방 키 정보
// context.startActivity(intent) //해당 채팅방으로 이동
// (context as AppCompatActivity).finish()
// }catch (e:Exception)
// {
// e.printStackTrace()
// Toast.makeText(context,"채팅방 이동 중 문제가 발생하였습니다.",Toast.LENGTH_SHORT).show()
// }
// }

if (chatRoomList[position].comments!!.size > 0) { //채팅방 메시지가 존재하는 경우
setLatestMessage(holder, position) // 가장 최근 메시지
countMessage(holder, position)
}

Log.d("data", "bind")
}

override fun getItemCount(): Int = chatRoomList.size

inner class ViewHolder(val binding : ItemChattingRoomBinding) : RecyclerView.ViewHolder(binding.root) {
lateinit var destinationUser: UserInfo
}
@SuppressLint("NotifyDataSetChanged")
private fun getChattingRoomsData() { //전체 채팅방 목록 초기화 및 업데이트
database.child("chattingRooms")
.orderByChild("users/$userId").equalTo(true)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
chatRoomList.clear()
for (data in snapshot.children) {
chatRoomList.add(data.getValue<ChatModel>()!!)
chatRoomKeys.add(data.key!!)
}
Log.d("data", chatRoomList.size.toString())
notifyDataSetChanged()
}
override fun onCancelled(error: DatabaseError) {
Log.d("ChattingRoomsRVAdapter", error.message)
}
})
adapter.notifyDataSetChanged()
}

private fun setLatestMessage(holder: ViewHolder, position: Int) {
var latest = chatRoomList[position].comments!!.values.sortedWith(compareBy({it.time})).last() //가장 최근 메시지
holder.binding.itemChattingContentTv.text = latest.message.toString()
holder.binding.itemChattingDateTv.text = latest.time.toString()
}

private fun countMessage(holder: ViewHolder, position: Int) {
//확인하지 않은 메시지 개수
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class Category1Fragment : Fragment() {
var img = activity?.resources!!.getIdentifier(i.child("image").value.toString(), "drawable", activity?.packageName)
columnList.add(
ColumnData(
i.ref.parent?.parent?.key, i.key, img, i.child("title").value.toString(),
i.ref.parent?.parent?.key, i.key, img, i.child("title").value.toString(), i.child("subTitle").value.toString(),
i.child("author").value.toString(), i.child("content").value.toString())
)
}
Expand Down
Loading