Skip to content

Commit

Permalink
Merge pull request #110 from INFRAcp/seungmin
Browse files Browse the repository at this point in the history
[feat] #109 Hot Project Server Connection
  • Loading branch information
peter-j0y authored Mar 23, 2022
2 parents 7921908 + fd5f10c commit 52af15d
Show file tree
Hide file tree
Showing 14 changed files with 706 additions and 533 deletions.
6 changes: 6 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,10 @@ dependencies {

// http 로그 확인
implementation("com.squareup.okhttp3:logging-interceptor:4.9.3")

// Room
def roomVersion = "2.4.2"
implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
implementation "androidx.room:room-ktx:$roomVersion"
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class CategoryViewIdeaFragment : BaseFragment<FragmentViewIdeaBinding>(R.layout.
if(response.isSuccessful){
when(response.body()?.code){
1000 -> { binding.viewIdea = response.body()?.result
writerId = response.body()?.result?.user_id }
writerId = response.body()?.result?.user_nickname }
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.example.infraandroid.chat.model

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [ChatRoomEntity::class], version = 1)
abstract class ChatRoomDB: RoomDatabase() {
abstract fun chatRoomDAO(): ChatRoomDao

companion object{
private var INSTANCE: ChatRoomDB? = null

@Synchronized
fun getInstance(context: Context): ChatRoomDB? {
if (INSTANCE == null) {
synchronized(ChatRoomDB::class) {
INSTANCE = Room.databaseBuilder(
context.applicationContext,
ChatRoomDB::class.java,
"chatRoomDB"
).build()
}
}
return INSTANCE
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.infraandroid.chat.model

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface ChatRoomDao {
@Query("SELECT * FROM CHATROOM WHERE opponentNickName = :opponentNickName")
fun checkOpponent(opponentNickName: String): List<ChatRoomEntity>

@Insert()
fun insert(chatRoom : ChatRoomEntity)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.infraandroid.chat.model

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "chatRoom")
data class ChatRoomEntity (
@PrimaryKey(autoGenerate = true) var index: Int?,
@ColumnInfo(name = "opponentNickName") var opponentNickName: String?) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@ import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.navigation.findNavController
import androidx.navigation.fragment.navArgs
import androidx.room.Room
import com.example.infraandroid.util.InfraApplication
import com.example.infraandroid.R
import com.example.infraandroid.chat.model.ChatRoomDB
import com.example.infraandroid.chat.model.ChatRoomEntity
import com.example.infraandroid.chat.model.MessageInfo
import com.example.infraandroid.databinding.FragmentChatBinding
import com.google.firebase.database.ChildEventListener
Expand All @@ -20,6 +23,9 @@ import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ktx.database
import com.google.firebase.database.ktx.getValue
import com.google.firebase.ktx.Firebase
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.HashMap
Expand All @@ -29,9 +35,9 @@ class ChatFragment : Fragment() {
private var mBinding : FragmentChatBinding? = null
private val chatAdapter = ChatMultiViewAdapter()
private val database = Firebase.database
private val args: ChatFragmentArgs by navArgs()
val chatList = mutableListOf<MessageInfo>()
private val opponentId = args.writerId
private var chatRoomDB : ChatRoomDB? = null


override fun onCreateView(
inflater: LayoutInflater,
Expand All @@ -41,20 +47,21 @@ class ChatFragment : Fragment() {

val binding = FragmentChatBinding.inflate(inflater, container, false)
mBinding = binding

return mBinding?.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

val args: ChatFragmentArgs by navArgs()
val opponentNickName = args.writerId
val buttonToSend = mBinding?.messageSendButton as ImageButton

mBinding?.chatOpponentNameTextview?.text = opponentNickName

// 리사이클러뷰
mBinding?.chatRecyclerview?.adapter = chatAdapter

// 채팅 데이터의 변화를 감지
// 채팅 데이터의 변화를 감지 파이어베이스 -> 화면
val childEventListener = object : ChildEventListener {
var date = ""
override fun onChildAdded(dataSnapshot: DataSnapshot, previousChildName: String?) {
Expand Down Expand Up @@ -131,8 +138,23 @@ class ChatFragment : Fragment() {
}
}

val chatRoomIndexString = InfraApplication.chatRoomIndex.toString()
val databaseReference = database.getReference("chatting").child(chatRoomIndexString)
var chatRoomIndex : Int ?= null
chatRoomDB = ChatRoomDB.getInstance(context!!.applicationContext)
CoroutineScope(Dispatchers.IO).launch{
if (opponentNickName != null) {
if (chatRoomDB!!.chatRoomDAO().checkOpponent(opponentNickName).isEmpty()){
var newChatRoomEntity : ChatRoomEntity ?= null
newChatRoomEntity?.opponentNickName = opponentNickName
if (newChatRoomEntity != null) {
chatRoomDB!!.chatRoomDAO().insert(newChatRoomEntity)
}
chatRoomIndex = chatRoomDB!!.chatRoomDAO().checkOpponent(opponentNickName)[0].index
}
}
}


val databaseReference = database.getReference("chatting").child(chatRoomIndex.toString())
databaseReference.addChildEventListener(childEventListener)

// 보내기 버튼을 누르면 firebase realtime db에 저장
Expand All @@ -142,15 +164,15 @@ class ChatFragment : Fragment() {
val date = Date(now)
val dataFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val dateTime = dataFormat.format(date)
val myRef = database.getReference("chatting").child(chatRoomIndexString).child(dateTime)
val myRef = database.getReference("chatting").child(chatRoomIndex.toString()).child(dateTime)

// 대화하는 두 사람의 Id값을 firebase realtime db에 저장
val userRef = database.getReference("chatting").child(chatRoomIndexString).child("users")
val lastMessageRef = database.getReference("chatting").child(chatRoomIndexString).child("lastMessage")
val userRef = database.getReference("chatting").child(chatRoomIndex.toString()).child("users")
val lastMessageRef = database.getReference("chatting").child(chatRoomIndex.toString()).child("lastMessage")
val userHashMap = HashMap<String, String>()
userHashMap["user1"] = InfraApplication.prefs.getString("userNickName", "null")
// 상대방의 아이디 가져와서 user2에 저장
userHashMap["user2"] = opponentId.toString()
userHashMap["user2"] = opponentNickName.toString()
userHashMap["user1ProfileImg"] = "user1의 프로필 이미지 url"
userHashMap["user2ProfileImg"] = "user2의 프로필 이미지 url"
userRef.setValue(userHashMap)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,5 @@ interface CreateProjectService {
@Header("X-ACCESS-TOKEN") jwt: String,
@Header("X-REFRESH-TOKEN") refreshToken: Int,
@Query("user_id") userId : String
)
) : Call<ResponseHotProjectData>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.infraandroid.home.model

data class ResponseHotProjectData(
val isSuccess: Boolean,
val code: Int,
val message: String,
val result: ArrayList<Result>
)
{
data class Result(
val hashtag: ArrayList<String>,
val pj_categoryName: String,
val pj_daysub: Int,
val pj_deadline: String,
val pj_header: String,
val pj_like: Int,
val pj_num: Int,
val pj_photo: ArrayList<String>,
val pj_progress: String,
val pj_recruit: String,
val pj_recruitPerson: Int,
val pj_subCategoryName: String,
val pj_totalPerson: Int,
val pj_views: Int,
val pj_views_1day: Int,
val user_id: String
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,16 @@ import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.infraandroid.util.ImageRound
import com.example.infraandroid.R
import com.example.infraandroid.category.view.fragment.IdeaListFragmentDirections
import com.example.infraandroid.databinding.ItemProjectBinding
import com.example.infraandroid.home.model.HotProject
import com.example.infraandroid.home.model.ResponseHotProjectData
import com.example.infraandroid.home.view.fragment.HomeFragmentDirections

class HotProjectRVAdapter (): RecyclerView.Adapter<RecyclerView.ViewHolder>(){
val hotprojectList = mutableListOf<HotProject>()

var hotprojectList = mutableListOf<ResponseHotProjectData.Result>()

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val binding: ItemProjectBinding = ItemProjectBinding.inflate(LayoutInflater.from(parent.context),parent,false)

Expand All @@ -27,23 +32,13 @@ class HotProjectRVAdapter (): RecyclerView.Adapter<RecyclerView.ViewHolder>(){
inner class ViewHolder(
private val binding: ItemProjectBinding
): RecyclerView.ViewHolder(binding.root){
fun onBind(hotproject: HotProject){
binding.itemProjectGroupTv.text = hotproject.group
binding.itemProjectNameTv.text = hotproject.name
binding.itemProjectMemberNumTv.text = hotproject.member
binding.itemProjectStateTv.text = hotproject.state
binding.itemHashTagOne.text = hotproject.keyword1
binding.itemHashTagTwo.text = hotproject.keyword2

// 이미지 뷰 둥글게
fun onBind(hotproject: ResponseHotProjectData.Result){
ImageRound.roundTop(binding.itemRecommedProjectPhotoIv, 36f)

Glide.with(itemView)
.load(hotproject.photo)
.into(binding.itemRecommedProjectPhotoIv)
binding.projectItem = hotproject

itemView.setOnClickListener {
it.findNavController().navigate(R.id.action_home_fragment_to_categoryViewIdeaFragment)
val action = HomeFragmentDirections.actionHomeFragmentToCategoryViewIdeaFragment(hotproject.pj_num)
it.findNavController().navigate(action)
}
}
}
Expand Down
Loading

0 comments on commit 52af15d

Please sign in to comment.