diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddArticleActivity.kt b/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddArticleActivity.kt index 4db37f6..d26786c 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddArticleActivity.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddArticleActivity.kt @@ -358,6 +358,7 @@ class AddArticleActivity : AppCompatActivity() { tags[value.main_tag_name] = newTag } article[DB_MAIN_TAGS] = tags + pushDBTag() } // currentArticleRef.updateChildren(article) @@ -367,6 +368,27 @@ class AddArticleActivity : AppCompatActivity() { finish() } + // 전체 Tag DB 에 Tag 변경사항 반영 (사용 횟수 증가) + private fun pushDBTag(){ + var tagRef = Firebase.database.reference.child(DBKeys.DB_MAIN_TAGS) + + for ((key, value) in tagRecyclerAdapter.data) { + tagRef.child(key) + .addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + // DB 에 같은 값이 있음: 사용 회수 증가 + if (snapshot.childrenCount > 0) { + // 사용 회수 의미적으로 증가(=감소) + tagRef.child(key).child(DBKeys.USED).setValue( + snapshot.child(DBKeys.USED).value.toString().toInt() - 1 + ) + } + } + override fun onCancelled(error: DatabaseError) {} + }) + } + } + private fun updateImage(uri: String) { if (isFirstImageUpdate) { articleRef.child(articleId).child(ARTICLE_THUMBNAIL_IMAGE_URL).setValue(uri) diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddNewTagActivity.kt b/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddNewTagActivity.kt index 8ba8a47..ae44ba7 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddNewTagActivity.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Activity/AddNewTagActivity.kt @@ -37,8 +37,6 @@ class AddNewTagActivity:AppCompatActivity() { lateinit var adapter: AddTagAdapter lateinit var rootRef:DatabaseReference lateinit var tagRef:DatabaseReference - // 처음 5명이 사용하기 전까지는 추천에 뜨지 않게 하기 - val TAG_INIT_NUM = 5 //Firebase Auth를 initialize 해주는 코드 private val auth: FirebaseAuth by lazy { @@ -102,35 +100,6 @@ class AddNewTagActivity:AppCompatActivity() { setDataRecyclerView(null) } -/* - private fun commitMainTag(mainTag: String): Boolean{ - tagRef.orderByChild(DBKeys.TAG_ID) - .equalTo(mainTag).addListenerForSingleValueEvent(object:ValueEventListener{ - override fun onDataChange(snapshot: DataSnapshot) { - if(snapshot.childrenCount>0){ - // 있으면 tagNum만 늘어난다. - tagRef.child(mainTag).child(DBKeys.USED_NUM).setValue( - snapshot.child(mainTag).child(DBKeys.USED_NUM).value.toString().toInt() + 1 - ) - - }else{ - // 없으면 추가하고 false 반환 - val newTag = mutableMapOf() - - newTag[DBKeys.TAG_ID] = mainTag - newTag[DBKeys.USED_NUM] = TAG_INIT_NUM - tagRef.child(mainTag).updateChildren(newTag) - } - } - - override fun onCancelled(error: DatabaseError) { - TODO("Not yet implemented") - } - - }) - return false - } -*/ private fun commitSubTag(mainTag: String): Boolean{ // 이미 DB에 있는 태그인지 확인한다 @@ -149,7 +118,7 @@ class AddNewTagActivity:AppCompatActivity() { private fun initView() { binding.apply { // 새 태그 버튼: 검색 창에 있는 태그가 DB에 있으면 무시, 없으면 목록에 추가한다 - // DB 에는 아직 추가하지 않음. 유저가 최종적으로 프로필에 적용했을 때 추가한다 + // sub Tag 는 DB 에는 아직 추가하지 않음. 유저가 최종적으로 프로필에 적용했을 때 추가한다 addNewTagBtn.setOnClickListener { // 입력 창에 아무 것도 없으면 무시 if(searchEditText.length() == 0){ @@ -164,7 +133,6 @@ class AddNewTagActivity:AppCompatActivity() { Toast.makeText(this@AddNewTagActivity, R.string.msg_exist_tag, Toast.LENGTH_SHORT).show() return - }else{ // 없으면 목록에 추가한다 val newTag = mutableMapOf() @@ -234,4 +202,8 @@ class AddNewTagActivity:AppCompatActivity() { }) } } + companion object{ + // 처음 5명이 사용하기 전까지는 추천에 뜨지 않게 하기 + const val TAG_INIT_NUM = 5 + } } \ No newline at end of file diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Activity/ArticleActivity.kt b/app/src/main/java/kr/ac/konkuk/koogle/Activity/ArticleActivity.kt index f3f703e..30dbffb 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Activity/ArticleActivity.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Activity/ArticleActivity.kt @@ -54,6 +54,7 @@ import kr.ac.konkuk.koogle.DBKeys.Companion.USER_EMAIL import kr.ac.konkuk.koogle.DBKeys.Companion.USER_ID import kr.ac.konkuk.koogle.DBKeys.Companion.USER_NAME import kr.ac.konkuk.koogle.DBKeys.Companion.USER_PROFILE_IMAGE_URL +import kr.ac.konkuk.koogle.Fragment.CommunityFragment import kr.ac.konkuk.koogle.Model.ArticleModel import kr.ac.konkuk.koogle.Model.Entity.SearchResultEntity import kr.ac.konkuk.koogle.Model.TagModel @@ -520,6 +521,11 @@ class ArticleActivity : AppCompatActivity() { data: TagModel, position: Int ) { + // 검색창으로 이동 + val intent = Intent() + intent.putExtra("tag", view.text.toString()) + setResult(CommunityFragment.REQUEST_ARTICLE, intent) + finish() } } binding.tagRecyclerView.adapter = tagRecyclerAdapter diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Activity/EditProfileActivity.kt b/app/src/main/java/kr/ac/konkuk/koogle/Activity/EditProfileActivity.kt index 50cd064..a8fd108 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Activity/EditProfileActivity.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Activity/EditProfileActivity.kt @@ -3,6 +3,7 @@ package kr.ac.konkuk.koogle.Activity import android.content.Intent import android.net.Uri import android.os.Bundle +import android.util.Log import android.view.View import android.widget.TextView import android.widget.Toast @@ -47,12 +48,32 @@ class EditProfileActivity : ProfileCommonActivity() { initButton() } - // 현재 상태를 DB에 저장 + // 전체 Tag DB 에 변경사항 반영 ( 사용 횟수 증가) + private fun pushDBTag(){ + var tagRef = Firebase.database.reference.child(DBKeys.DB_MAIN_TAGS) + + for ((key, value) in tagAdapter.data) { + tagRef.child(key) + .addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + // DB 에 같은 값이 있음: 사용 회수 증가 + if (snapshot.childrenCount > 0) { + // 사용 회수 의미적으로 증가(=감소) + tagRef.child(key).child(DBKeys.USED).setValue( + snapshot.child(DBKeys.USED).value.toString().toInt() - 1 + ) + } + } + override fun onCancelled(error: DatabaseError) {} + }) + } + } + + // 현재 상태를 user DB에 저장 // 기존의 데이터는 사라진다. private fun saveTag(){ userTagRef = Firebase.database.reference .child(DBKeys.DB_USER_TAG).child(firebaseUser.uid) - var j = tagAdapter.itemCount val tags = mutableMapOf() for(value in tagAdapter.data) { @@ -101,6 +122,7 @@ class EditProfileActivity : ProfileCommonActivity() { .start(this@EditProfileActivity); } profileEditButton.setOnClickListener { + pushDBTag() saveTag() finish() } @@ -213,19 +235,7 @@ class EditProfileActivity : ProfileCommonActivity() { binding.tagRecyclerView.addItemDecoration(DividerItemDecoration(this, 1)) tagAdapter = TagAdapter(this, data, true) - // 서브태그들 클릭했을 때 이벤트 구현 - /* - tagAdapter.subTagClickListener = object : TagAdapter.OnItemClickListener { - override fun onItemClick( - holder: TagAdapter.DefaultViewHolder, - view: EditText, - data: TagModel, - position: Int - ) { - Log.d("jan", "Click") - view.isEnabled = true - } - }*/ + binding.tagRecyclerView.adapter = tagAdapter val simpleCallBack = object : ItemTouchHelper.SimpleCallback( ItemTouchHelper.DOWN or ItemTouchHelper.UP, @@ -236,7 +246,6 @@ class EditProfileActivity : ProfileCommonActivity() { viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder ): Boolean { - tagAdapter.moveItem(viewHolder.adapterPosition, target.adapterPosition) return true } diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Adapter/TagAdapter.kt b/app/src/main/java/kr/ac/konkuk/koogle/Adapter/TagAdapter.kt index 06ced6b..c0d4028 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Adapter/TagAdapter.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Adapter/TagAdapter.kt @@ -158,7 +158,7 @@ class TagAdapter(val context: Context, val data: MutableList, // 클릭 이벤트 설정 subTagText.setOnClickListener { - itemClickListener?.onItemClick(this, subTagText, data[adapterPosition], adapterPosition) + subTagClickListener?.onItemClick(this, subTagText, data[adapterPosition], adapterPosition) } return subTagText diff --git a/app/src/main/java/kr/ac/konkuk/koogle/Fragment/CommunityFragment.kt b/app/src/main/java/kr/ac/konkuk/koogle/Fragment/CommunityFragment.kt index 185a1f3..1440a58 100644 --- a/app/src/main/java/kr/ac/konkuk/koogle/Fragment/CommunityFragment.kt +++ b/app/src/main/java/kr/ac/konkuk/koogle/Fragment/CommunityFragment.kt @@ -41,7 +41,6 @@ import kr.ac.konkuk.koogle.databinding.FragmentCommunityBinding class CommunityFragment : Fragment(R.layout.fragment_community) { - private var binding: FragmentCommunityBinding? = null private lateinit var communityAdapter: CommunityAdapter @@ -177,7 +176,7 @@ class CommunityFragment : Fragment(R.layout.fragment_community) { //fragment에서 다른 액티비티로 데이터 전달 Log.d("CommunityFragment", "articleId: ${articleModel.articleId}") - activity?.startActivity(intent) + startActivityForResult(intent, REQUEST_ARTICLE) } else { //로그인을 안한 상태 Toast.makeText(context, "로그인 후 사용해주세요", Toast.LENGTH_LONG).show() @@ -194,130 +193,149 @@ class CommunityFragment : Fragment(R.layout.fragment_community) { binding!!.articleRecyclerView.adapter = communityAdapter } - private fun initButton() { - val spinner = binding!!.searchSpinner - ArrayAdapter.createFromResource( - requireContext(), - R.array.search_spinner, - android.R.layout.simple_spinner_item - ).also { adapter -> - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - spinner.adapter = adapter + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + Log.d("jan", "ok") + // 글에서 수신된 결과 (태그 선택) + if(requestCode == REQUEST_ARTICLE){ + val str:String? = data?.getStringExtra("tag") + Log.d("jan", "go ${str}") + if(!str.isNullOrBlank()){ + Log.d("jan", str) + binding!!.searchEditText.setText(str) + searchArticle() + } } + } - binding!!.btnAddArticle.setOnClickListener { + private fun searchArticle(){ + val searchText = binding!!.searchEditText.text.toString() + val articleRef = Firebase.database.reference.child(DB_ARTICLES) - context?.let { - if (auth.currentUser != null) { - startActivity(Intent(it, AddArticleActivity::class.java)) - } else { - Toast.makeText(context, "로그인 후 사용해주세요", Toast.LENGTH_SHORT).show() - startActivity(Intent(it, LogInActivity::class.java)) + if (searchText.isEmpty()) { + articleRef.addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + articleList.clear() + for (article in snapshot.children) { + articleList.add(0, article.getValue(ArticleModel::class.java)!!) + } + communityAdapter.submitList(articleList) + communityAdapter.notifyDataSetChanged() } - //이것도 가능 - //startActivity(Intent(requireContext(),ArticleAddActivity::class.java)) - } - } + override fun onCancelled(error: DatabaseError) {} - binding!!.searchImageView.setOnClickListener { - val searchText = binding!!.searchEditText.text.toString() - val articleRef = Firebase.database.reference.child(DB_ARTICLES) + }) + } else { + val position = binding!!.searchSpinner.selectedItemPosition - if (searchText.isEmpty()) { + if (position == 0) { + searchedArticleList.clear() articleRef.addListenerForSingleValueEvent(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { - articleList.clear() for (article in snapshot.children) { - articleList.add(0, article.getValue(ArticleModel::class.java)!!) - } - communityAdapter.submitList(articleList) - communityAdapter.notifyDataSetChanged() - } - - override fun onCancelled(error: DatabaseError) {} - - }) - } else { - val position = binding!!.searchSpinner.selectedItemPosition - - if (position == 0) { - searchedArticleList.clear() - articleRef.addListenerForSingleValueEvent(object : ValueEventListener { - override fun onDataChange(snapshot: DataSnapshot) { - for (article in snapshot.children) { - for (tag in article.child(DB_MAIN_TAGS).children) { - var isContain = false - if (searchText in tag.key.toString()) { + for (tag in article.child(DB_MAIN_TAGS).children) { + var isContain = false + if (searchText in tag.key.toString()) { + searchedArticleList.add( + 0, + article.getValue(ArticleModel::class.java)!! + ) + break + } + for (subtag in tag.child(SUB_TAGS).children) { + if (searchText in subtag.key.toString()) { searchedArticleList.add( 0, article.getValue(ArticleModel::class.java)!! ) - break - } - for (subtag in tag.child(SUB_TAGS).children) { - if (searchText in subtag.key.toString()) { - searchedArticleList.add( - 0, - article.getValue(ArticleModel::class.java)!! - ) - isContain = true - break - } - } - if (isContain) { + isContain = true break } } + if (isContain) { + break + } } - communityAdapter.submitList(searchedArticleList) - communityAdapter.notifyDataSetChanged() } + communityAdapter.submitList(searchedArticleList) + communityAdapter.notifyDataSetChanged() + } - override fun onCancelled(error: DatabaseError) {} + override fun onCancelled(error: DatabaseError) {} - }) - } else if (position == 1) { - searchedArticleList.clear() - articleRef.addListenerForSingleValueEvent(object : ValueEventListener { - override fun onDataChange(snapshot: DataSnapshot) { - for (article in snapshot.children) { - if (searchText in article.child(ARTICLE_TITLE).value.toString()) { - searchedArticleList.add( - 0, - article.getValue(ArticleModel::class.java)!! - ) - } + }) + } else if (position == 1) { + searchedArticleList.clear() + articleRef.addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + for (article in snapshot.children) { + if (searchText in article.child(ARTICLE_TITLE).value.toString()) { + searchedArticleList.add( + 0, + article.getValue(ArticleModel::class.java)!! + ) } - communityAdapter.submitList(searchedArticleList) - communityAdapter.notifyDataSetChanged() } + communityAdapter.submitList(searchedArticleList) + communityAdapter.notifyDataSetChanged() + } - override fun onCancelled(error: DatabaseError) {} + override fun onCancelled(error: DatabaseError) {} - }) - } else { - searchedArticleList.clear() - articleRef.addListenerForSingleValueEvent(object : ValueEventListener { - override fun onDataChange(snapshot: DataSnapshot) { - for (article in snapshot.children) { - if (searchText in article.child(ARTICLE_CONTENT).value.toString()) { - searchedArticleList.add( - 0, - article.getValue(ArticleModel::class.java)!! - ) - } + }) + } else { + searchedArticleList.clear() + articleRef.addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + for (article in snapshot.children) { + if (searchText in article.child(ARTICLE_CONTENT).value.toString()) { + searchedArticleList.add( + 0, + article.getValue(ArticleModel::class.java)!! + ) } - communityAdapter.submitList(searchedArticleList) - communityAdapter.notifyDataSetChanged() } + communityAdapter.submitList(searchedArticleList) + communityAdapter.notifyDataSetChanged() + } - override fun onCancelled(error: DatabaseError) {} + override fun onCancelled(error: DatabaseError) {} - }) + }) + } + } + } + + private fun initButton() { + val spinner = binding!!.searchSpinner + ArrayAdapter.createFromResource( + requireContext(), + R.array.search_spinner, + android.R.layout.simple_spinner_item + ).also { adapter -> + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + spinner.adapter = adapter + } + + binding!!.btnAddArticle.setOnClickListener { + + context?.let { + if (auth.currentUser != null) { + startActivity(Intent(it, AddArticleActivity::class.java)) + } else { + Toast.makeText(context, "로그인 후 사용해주세요", Toast.LENGTH_SHORT).show() + startActivity(Intent(it, LogInActivity::class.java)) } + + //이것도 가능 + //startActivity(Intent(requireContext(),ArticleAddActivity::class.java)) } } + + binding!!.searchImageView.setOnClickListener { + searchArticle() + } } // override fun onResume() { @@ -332,4 +350,8 @@ class CommunityFragment : Fragment(R.layout.fragment_community) { articleRef.removeEventListener(listener) } + + companion object{ + const val REQUEST_ARTICLE = 177 + } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_article.xml b/app/src/main/res/layout/item_article.xml index 669e747..05bb63f 100644 --- a/app/src/main/res/layout/item_article.xml +++ b/app/src/main/res/layout/item_article.xml @@ -72,7 +72,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:padding="6dp" - android:scaleType="center" + android:scaleType="centerCrop" android:src="@drawable/profile_image" app:srcCompat="@drawable/ic_launcher_foreground" /> @@ -94,10 +94,11 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" - android:gravity="center" + android:gravity="center|right" android:layout_marginTop="4dp" android:text="1" - android:textSize="40sp" /> + android:textSize="32sp" + tools:ignore="RtlHardcoded" /> + android:textSize="32sp" /> + android:textSize="32sp" + tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/item_card.xml b/app/src/main/res/layout/item_card.xml index d99879e..a496db6 100644 --- a/app/src/main/res/layout/item_card.xml +++ b/app/src/main/res/layout/item_card.xml @@ -18,8 +18,7 @@ + android:layout_weight="3"> + tools:ignore="NestedWeights,RtlSymmetry"> + android:textSize="28sp" /> + android:textSize="28sp" /> + android:textSize="28sp" /> @@ -79,7 +79,6 @@ android:layout_height="0dp" android:layout_weight="2.5" android:orientation="horizontal" - android:paddingStart="12dp" android:paddingBottom="15dp"> + android:src="@drawable/profile_image" + tools:ignore="NestedWeights" /> + android:textSize="20sp" + android:ellipsize="end" + android:maxLines="1" /> @@ -155,7 +157,7 @@ android:id="@+id/contentTextView" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="5" + android:layout_weight="3" android:padding="20dp" android:hint="@string/content" /> @@ -163,8 +165,9 @@ android:id="@+id/tagView" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="1.5" - android:orientation="vertical"> + android:layout_weight="2.5" + android:orientation="vertical" + android:padding="20dp" /> + android:textColor="@color/white" />