From a5819b691599423d6680054a410c40c6f68e9884 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Wed, 13 Apr 2022 00:46:24 +0900 Subject: [PATCH 01/11] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=20=ED=99=94=EB=A9=B4=20xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 24 ++- .../ui/main/MemberInfoWritingActivity.kt | 12 ++ .../layout/activity_member_info_writing.xml | 154 ++++++++++++++++++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 179 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt create mode 100644 app/src/main/res/layout/activity_member_info_writing.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c2c39ee..233dd97 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,11 +1,9 @@ - - + package="com.gsps.gsp_android"> + - - + + android:theme="@style/Theme.GSP_Android"> + - + android:exported="false"> + android:exported="false" /> - - @@ -48,7 +46,7 @@ android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar" /> + android:exported="true"> @@ -57,7 +55,7 @@ + android:exported="false" /> \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt new file mode 100644 index 0000000..89daa02 --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -0,0 +1,12 @@ +package com.gsps.gsp_android.ui.main + +import com.gsps.gsp_android.R +import com.gsps.gsp_android.databinding.ActivityMemberInfoWritingBinding +import com.gsps.gsp_android.ui.base.BaseActivity + +class MemberInfoWritingActivity : + BaseActivity(R.layout.activity_member_info_writing) { + override fun initView() { + + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_member_info_writing.xml b/app/src/main/res/layout/activity_member_info_writing.xml new file mode 100644 index 0000000..7c354f2 --- /dev/null +++ b/app/src/main/res/layout/activity_member_info_writing.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 997cb5b..db708ff 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -17,6 +17,7 @@ #2bd131 #1aa8ff #ebebeb + #E3E3E3 #cccccc #939393 #3d3d3d diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 598c0b5..75b933c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,4 +44,5 @@ 최근 검색어 협업 신청하러가기 신규가입회사 + 회사소개 \ No newline at end of file From e34f293cd215cb8187ef11f263012f9faef1ef34 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Wed, 13 Apr 2022 22:47:24 +0900 Subject: [PATCH 02/11] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20=EC=84=A0=ED=83=9D=20=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 15 ++-- .../gsp_android/ui/main/CategoryAdapter.kt | 74 +++++++++++++++++++ .../gsps/gsp_android/ui/main/CategoryModel.kt | 19 +++++ .../ui/main/InterestsFullListAdapter.kt | 7 +- .../ui/main/MemberInfoCategoryActivity.kt | 39 ++++++++++ .../com/gsps/gsp_android/ui/main/SetFinish.kt | 5 ++ .../main/res/layout/activity_member_info.xml | 2 +- .../layout/activity_member_info_category.xml | 74 +++++++++++++++++++ .../layout/activity_member_info_writing.xml | 19 +++-- .../layout/fragment_interests_full_list.xml | 4 +- .../res/layout/interests_outer_list_item.xml | 4 +- app/src/main/res/layout/item_category.xml | 29 ++++++++ 12 files changed, 270 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/CategoryAdapter.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoCategoryActivity.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/SetFinish.kt create mode 100644 app/src/main/res/layout/activity_member_info_category.xml create mode 100644 app/src/main/res/layout/item_category.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 233dd97..26dca0d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,12 +13,21 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.GSP_Android"> + + + + + + + + android:exported="false" /> @@ -47,11 +56,7 @@ - - - - , + private val mCallback: SetFinish +) : RecyclerView.Adapter() { + private var isNewRadioButtonChecked: Boolean = false + private var lastCheckedPosition = -1 + private var isSomethingChecked = false + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): CategoryHolder { + val binding = + ItemCategoryBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + return CategoryHolder(binding) + } + + override fun onBindViewHolder(holder: CategoryHolder, position: Int) { + val categoryModel = itemList[position] + + if (isNewRadioButtonChecked) { + holder.binding.rbCategory.isChecked = categoryModel.getChecked() + } else if (holder.adapterPosition == 0) { + lastCheckedPosition = 0; + } + + holder.bind(itemList[position]) + } + + override fun getItemCount(): Int { + return itemList.size + } + + inner class CategoryHolder(var binding: ItemCategoryBinding) : + RecyclerView.ViewHolder(binding.root) { + init { + binding.rbCategory.setOnClickListener { + if (lastCheckedPosition == adapterPosition && itemList[adapterPosition].getChecked()) { + isNewRadioButtonChecked = false + isSomethingChecked = false + itemList[adapterPosition].setChecked(false) + notifyDataSetChanged() + } else { + isNewRadioButtonChecked = true + isSomethingChecked = true + itemList[lastCheckedPosition].setChecked(false) + itemList[adapterPosition].setChecked(true) + lastCheckedPosition = adapterPosition + notifyDataSetChanged() + } + + mCallback.setFinish(isSomethingChecked) + } + } + + fun bind(item: CategoryModel) { + binding.rbCategory.text = item.getCategory() + binding.rbCategory.isChecked = item.getChecked() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt new file mode 100644 index 0000000..d23bdc8 --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt @@ -0,0 +1,19 @@ +package com.gsps.gsp_android.ui.main + +data class CategoryModel( + private var category: String, + private var isChecked: Boolean +) { + fun CategoryModel(category: String, isChecked: Boolean) { + this.category = category + this.isChecked = isChecked + } + + fun getCategory(): String { return category.toString() } + + fun setCategory(category: String) { this.category = category } + + fun getChecked(): Boolean { return isChecked } + + fun setChecked(isChecked: Boolean) { this.isChecked = isChecked } +} diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/InterestsFullListAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/InterestsFullListAdapter.kt index 906e135..ac271cb 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/InterestsFullListAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/InterestsFullListAdapter.kt @@ -13,7 +13,7 @@ class InterestsFullListAdapter( override fun onCreateViewHolder( parent: ViewGroup, viewType: Int - ): InterestsFullListAdapter.InterestsFullListHolder { + ): InterestsFullListHolder { val binding = InterestsFullListItemBinding.inflate( LayoutInflater.from(parent.context), @@ -23,10 +23,7 @@ class InterestsFullListAdapter( return InterestsFullListHolder(binding) } - override fun onBindViewHolder( - holder: InterestsFullListAdapter.InterestsFullListHolder, - position: Int - ) { + override fun onBindViewHolder(holder: InterestsFullListHolder, position: Int) { holder.bind(itemList[position]) } diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoCategoryActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoCategoryActivity.kt new file mode 100644 index 0000000..6b91e91 --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoCategoryActivity.kt @@ -0,0 +1,39 @@ +package com.gsps.gsp_android.ui.main + +import android.util.Log +import android.widget.LinearLayout +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.gsps.gsp_android.R +import com.gsps.gsp_android.databinding.ActivityMemberInfoCategoryBinding +import com.gsps.gsp_android.ui.base.BaseActivity + +class MemberInfoCategoryActivity : + BaseActivity(R.layout.activity_member_info_category), SetFinish { + var category: String = "" + var isSelected: Boolean = false + override fun initView() { + val category: MutableList = mutableListOf( + CategoryModel("디자인", false), + CategoryModel("건설", false), + CategoryModel("인쇄&공예", false), + CategoryModel("사무", false), + CategoryModel("환경&에너지", false), + CategoryModel("경영&회계", false), + CategoryModel("화학&바이오", false), + CategoryModel("영업판매", false), + CategoryModel("섬유&의복", false), + CategoryModel("기획&마케팅", false), + CategoryModel("보건&의료", false), + CategoryModel("전기&전자", false), + CategoryModel("사회복지", false), + CategoryModel("재료", false) + ) + binding.categoryContainer.adapter = CategoryAdapter(this, category, this) + binding.categoryContainer.layoutManager = + StaggeredGridLayoutManager(5, LinearLayout.HORIZONTAL) + } + + override fun setFinish(status: Boolean) { + binding.btnFinish.isEnabled = status + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/SetFinish.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/SetFinish.kt new file mode 100644 index 0000000..d182fac --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/SetFinish.kt @@ -0,0 +1,5 @@ +package com.gsps.gsp_android.ui.main + +interface SetFinish { + fun setFinish(status: Boolean) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_member_info.xml b/app/src/main/res/layout/activity_member_info.xml index a1ed2e1..b1885b4 100644 --- a/app/src/main/res/layout/activity_member_info.xml +++ b/app/src/main/res/layout/activity_member_info.xml @@ -36,7 +36,7 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_member_info_writing.xml b/app/src/main/res/layout/activity_member_info_writing.xml index 7c354f2..211ba59 100644 --- a/app/src/main/res/layout/activity_member_info_writing.xml +++ b/app/src/main/res/layout/activity_member_info_writing.xml @@ -1,7 +1,15 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context=".ui.main.MemberInfoWritingActivity"> + + + + + + android:layout_height="match_parent"> + app:layout_constraintTop_toBottomOf="@id/rbCategory" /> + app:layout_constraintTop_toBottomOf="@id/rbCategory" /> \ No newline at end of file diff --git a/app/src/main/res/layout/interests_outer_list_item.xml b/app/src/main/res/layout/interests_outer_list_item.xml index 514d335..37eef10 100644 --- a/app/src/main/res/layout/interests_outer_list_item.xml +++ b/app/src/main/res/layout/interests_outer_list_item.xml @@ -14,7 +14,7 @@ android:layout_height="wrap_content"> + app:layout_constraintTop_toBottomOf="@id/rbCategory" /> + + + + + + + From 9cbc0f961046748bd5ad7d81e12437dca02e2f2d Mon Sep 17 00:00:00 2001 From: river_is_line Date: Wed, 20 Apr 2022 20:56:27 +0900 Subject: [PATCH 03/11] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20category=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 8 +- .../gsp_android/ui/main/CategoryAdapter.kt | 10 +- .../gsps/gsp_android/ui/main/CategoryModel.kt | 19 +- .../ui/main/MemberInfoCategoryActivity.kt | 31 +++- .../ui/main/MemberInfoWritingActivity.kt | 24 +++ .../com/gsps/gsp_android/ui/main/SetResult.kt | 5 + .../select_picture_box_background.xml | 9 + .../main/res/layout/activity_member_info.xml | 2 +- .../layout/activity_member_info_writing.xml | 168 +++++++++++++----- .../layout/fragment_interests_full_list.xml | 4 +- .../res/layout/interests_outer_list_item.xml | 2 +- app/src/main/res/values/colors.xml | 2 + 12 files changed, 218 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/SetResult.kt create mode 100644 app/src/main/res/drawable/select_picture_box_background.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26dca0d..71ac529 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,15 +16,17 @@ + + + - diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryAdapter.kt index bd4d5d7..24823e9 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryAdapter.kt @@ -7,9 +7,10 @@ import androidx.recyclerview.widget.RecyclerView import com.gsps.gsp_android.databinding.ItemCategoryBinding class CategoryAdapter( - context: Context, + val context: Context, private val itemList: MutableList, - private val mCallback: SetFinish + private val mFinishCallback: SetFinish, + private val mResultCallback: SetResult ) : RecyclerView.Adapter() { private var isNewRadioButtonChecked: Boolean = false private var lastCheckedPosition = -1 @@ -62,7 +63,10 @@ class CategoryAdapter( notifyDataSetChanged() } - mCallback.setFinish(isSomethingChecked) + mFinishCallback.setFinish(isSomethingChecked) + if (isSomethingChecked) { + mResultCallback.setResult(itemList[lastCheckedPosition].getCategory()) + } } } diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt index d23bdc8..16b3e1e 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt @@ -4,16 +4,19 @@ data class CategoryModel( private var category: String, private var isChecked: Boolean ) { - fun CategoryModel(category: String, isChecked: Boolean) { - this.category = category - this.isChecked = isChecked + fun getCategory(): String { + return category.toString() } - fun getCategory(): String { return category.toString() } - - fun setCategory(category: String) { this.category = category } + fun setCategory(category: String) { + this.category = category + } - fun getChecked(): Boolean { return isChecked } + fun getChecked(): Boolean { + return isChecked + } - fun setChecked(isChecked: Boolean) { this.isChecked = isChecked } + fun setChecked(isChecked: Boolean) { + this.isChecked = isChecked + } } diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoCategoryActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoCategoryActivity.kt index 6b91e91..bf85e92 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoCategoryActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoCategoryActivity.kt @@ -1,6 +1,6 @@ package com.gsps.gsp_android.ui.main -import android.util.Log +import android.content.Intent import android.widget.LinearLayout import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.gsps.gsp_android.R @@ -8,11 +8,13 @@ import com.gsps.gsp_android.databinding.ActivityMemberInfoCategoryBinding import com.gsps.gsp_android.ui.base.BaseActivity class MemberInfoCategoryActivity : - BaseActivity(R.layout.activity_member_info_category), SetFinish { + BaseActivity(R.layout.activity_member_info_category), + SetFinish, SetResult { var category: String = "" - var isSelected: Boolean = false override fun initView() { - val category: MutableList = mutableListOf( + initCategory() + + val categoryList: MutableList = mutableListOf( CategoryModel("디자인", false), CategoryModel("건설", false), CategoryModel("인쇄&공예", false), @@ -28,12 +30,31 @@ class MemberInfoCategoryActivity : CategoryModel("사회복지", false), CategoryModel("재료", false) ) - binding.categoryContainer.adapter = CategoryAdapter(this, category, this) + binding.categoryContainer.adapter = CategoryAdapter(this, categoryList, this, this) binding.categoryContainer.layoutManager = StaggeredGridLayoutManager(5, LinearLayout.HORIZONTAL) + + binding.btnFinish.setOnClickListener { + val intent = Intent() + intent.putExtra("category", category) + setResult(RESULT_OK, intent) + finish() + } + + binding.btnGoBack.setOnClickListener { + finish() + } } override fun setFinish(status: Boolean) { binding.btnFinish.isEnabled = status } + + override fun setResult(category: String) { + this.category = category + } + + fun initCategory() { + this.category = "" + } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt index 89daa02..364ca27 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -1,12 +1,36 @@ package com.gsps.gsp_android.ui.main +import android.content.Intent +import android.view.View +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.ActivityMemberInfoWritingBinding import com.gsps.gsp_android.ui.base.BaseActivity class MemberInfoWritingActivity : BaseActivity(R.layout.activity_member_info_writing) { + private val categoryResultListener: ActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + binding.tvCategory.text = it.data?.getStringExtra("category") + } + } + override fun initView() { + binding.tvCategory.setOnClickListener { + val intent = Intent(this, MemberInfoCategoryActivity::class.java) + categoryResultListener.launch(intent) + } + binding.clPictures.setOnClickListener { + binding.llPictureBox.apply { + when (this.visibility) { + View.GONE -> this.visibility = View.VISIBLE + View.VISIBLE -> this.visibility = View.GONE + View.INVISIBLE -> this.visibility = View.VISIBLE + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/SetResult.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/SetResult.kt new file mode 100644 index 0000000..6cfb438 --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/SetResult.kt @@ -0,0 +1,5 @@ +package com.gsps.gsp_android.ui.main + +interface SetResult { + fun setResult(category: String) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/select_picture_box_background.xml b/app/src/main/res/drawable/select_picture_box_background.xml new file mode 100644 index 0000000..bcf13ac --- /dev/null +++ b/app/src/main/res/drawable/select_picture_box_background.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_member_info.xml b/app/src/main/res/layout/activity_member_info.xml index b1885b4..a1ed2e1 100644 --- a/app/src/main/res/layout/activity_member_info.xml +++ b/app/src/main/res/layout/activity_member_info.xml @@ -36,7 +36,7 @@ app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/tvCategory" /> - - - - - - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/dividerTitle"> + + + + + + + + + + + + + + + + + + + + + @@ -151,6 +232,7 @@ android:layout_marginHorizontal="20dp" android:layout_marginBottom="24dp" android:background="@drawable/button_style" + android:enabled="false" android:fontFamily="@font/noto_sans_kr_regular" android:gravity="center" android:includeFontPadding="false" diff --git a/app/src/main/res/layout/fragment_interests_full_list.xml b/app/src/main/res/layout/fragment_interests_full_list.xml index 2b91fb6..9afebca 100644 --- a/app/src/main/res/layout/fragment_interests_full_list.xml +++ b/app/src/main/res/layout/fragment_interests_full_list.xml @@ -56,7 +56,7 @@ app:layout_constraintTop_toTopOf="@id/ivLogo" /> + app:layout_constraintTop_toBottomOf="@id/tvCategory" /> \ No newline at end of file diff --git a/app/src/main/res/layout/interests_outer_list_item.xml b/app/src/main/res/layout/interests_outer_list_item.xml index 37eef10..08fdaad 100644 --- a/app/src/main/res/layout/interests_outer_list_item.xml +++ b/app/src/main/res/layout/interests_outer_list_item.xml @@ -14,7 +14,7 @@ android:layout_height="wrap_content"> #ffcb22 #2bd131 #1aa8ff + #FFFDFDFD #ebebeb + #E7E7E7 #E3E3E3 #cccccc #939393 From 7daa4dc2c5f7a019aff847a490c26f60d743ac05 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Thu, 21 Apr 2022 00:42:07 +0900 Subject: [PATCH 04/11] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EC=82=AC=EC=A7=84?= =?UTF-8?q?=20=EC=82=BD=EC=9E=85=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/MemberInfoWritingActivity.kt | 87 ++++++++++++++++++- .../layout/activity_member_info_writing.xml | 6 ++ 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt index 364ca27..3af6a1e 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -1,26 +1,64 @@ package com.gsps.gsp_android.ui.main import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.ImageDecoder +import android.os.Build +import android.provider.MediaStore import android.view.View import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.ActivityMemberInfoWritingBinding import com.gsps.gsp_android.ui.base.BaseActivity class MemberInfoWritingActivity : BaseActivity(R.layout.activity_member_info_writing) { - private val categoryResultListener: ActivityResultLauncher = + companion object { + private const val REQUEST_CAMERA = 1000 + } + + private val categoryResultLauncher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == RESULT_OK) { + if (it.resultCode == RESULT_OK && it.data != null) { binding.tvCategory.text = it.data?.getStringExtra("category") } } - + + private val cameraResultLauncher: ActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK && it.data != null) { + binding.llPictureBox.visibility = View.GONE + val bitmap = it.data?.extras?.get("data") as Bitmap + binding.ivMain.setImageBitmap(bitmap) + } + } + + private val albumResultLauncher: ActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK && it.data != null) { + binding.llPictureBox.visibility = View.GONE + val currentImageUri = it.data!!.data + currentImageUri?.let { + val bitmap = if (Build.VERSION.SDK_INT < 28) { + MediaStore.Images.Media.getBitmap(this.contentResolver, currentImageUri) + } else { + val source = + ImageDecoder.createSource(this.contentResolver, currentImageUri) + ImageDecoder.decodeBitmap(source) + } + binding.ivMain.setImageBitmap(bitmap) + } + } + } + override fun initView() { binding.tvCategory.setOnClickListener { val intent = Intent(this, MemberInfoCategoryActivity::class.java) - categoryResultListener.launch(intent) + categoryResultLauncher.launch(intent) } binding.clPictures.setOnClickListener { @@ -32,5 +70,46 @@ class MemberInfoWritingActivity : } } } + + binding.btnCamera.setOnClickListener { + if (cameraPermissionCheck()) { + val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + cameraResultLauncher.launch(intent) + } + } + + binding.btnAlbum.setOnClickListener { + if (cameraPermissionCheck()) { + val intent = Intent(Intent.ACTION_PICK) + intent.type = "image/*" + albumResultLauncher.launch(intent) + } + } + } + + private fun cameraPermissionCheck(): Boolean { + val permissionCheck = + ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) + return if (permissionCheck == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions( + this, + arrayOf(android.Manifest.permission.CAMERA), + REQUEST_CAMERA + ) + false + } else true + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_CAMERA) { + if (grantResults[0] == 0) { + cameraResultLauncher.launch(intent) + } + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_member_info_writing.xml b/app/src/main/res/layout/activity_member_info_writing.xml index 247ad01..012c9c7 100644 --- a/app/src/main/res/layout/activity_member_info_writing.xml +++ b/app/src/main/res/layout/activity_member_info_writing.xml @@ -161,6 +161,12 @@ android:textColorHint="@color/dark_gray" android:textSize="14sp" /> + + Date: Thu, 21 Apr 2022 02:54:29 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20=EC=82=AC=EC=A7=84?= =?UTF-8?q?=20=ED=99=94=EC=A7=88=20=ED=96=A5=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/MemberInfoWritingActivity.kt | 84 +++++++++++++++---- .../layout/activity_member_info_writing.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 3 files changed, 68 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt index 3af6a1e..c733253 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -1,12 +1,15 @@ package com.gsps.gsp_android.ui.main +import android.content.ContentValues import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.ImageDecoder +import android.net.Uri import android.os.Build import android.provider.MediaStore import android.view.View +import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.app.ActivityCompat @@ -14,11 +17,18 @@ import androidx.core.content.ContextCompat import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.ActivityMemberInfoWritingBinding import com.gsps.gsp_android.ui.base.BaseActivity +import java.io.FileOutputStream +import java.text.SimpleDateFormat class MemberInfoWritingActivity : BaseActivity(R.layout.activity_member_info_writing) { companion object { private const val REQUEST_CAMERA = 1000 + private val PERMISSION_CAMERA = arrayOf( + android.Manifest.permission.CAMERA, + android.Manifest.permission.READ_EXTERNAL_STORAGE, + android.Manifest.permission.WRITE_EXTERNAL_STORAGE + ) } private val categoryResultLauncher: ActivityResultLauncher = @@ -30,10 +40,11 @@ class MemberInfoWritingActivity : private val cameraResultLauncher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == RESULT_OK && it.data != null) { + if (it.resultCode == RESULT_OK && it.data?.extras?.get("data") != null) { binding.llPictureBox.visibility = View.GONE val bitmap = it.data?.extras?.get("data") as Bitmap - binding.ivMain.setImageBitmap(bitmap) + val uri = saveFile(randomFileName(), "image/*", bitmap) + binding.ivMain.setImageURI(uri) } } @@ -72,14 +83,14 @@ class MemberInfoWritingActivity : } binding.btnCamera.setOnClickListener { - if (cameraPermissionCheck()) { + if (permissionCheck()) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) cameraResultLauncher.launch(intent) } } binding.btnAlbum.setOnClickListener { - if (cameraPermissionCheck()) { + if (permissionCheck()) { val intent = Intent(Intent.ACTION_PICK) intent.type = "image/*" albumResultLauncher.launch(intent) @@ -87,17 +98,16 @@ class MemberInfoWritingActivity : } } - private fun cameraPermissionCheck(): Boolean { - val permissionCheck = - ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) - return if (permissionCheck == PackageManager.PERMISSION_DENIED) { - ActivityCompat.requestPermissions( - this, - arrayOf(android.Manifest.permission.CAMERA), - REQUEST_CAMERA - ) - false - } else true + private fun permissionCheck(): Boolean { + for (permission in PERMISSION_CAMERA) { + val permissionCheck = + ContextCompat.checkSelfPermission(this, permission) + if (permissionCheck != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, PERMISSION_CAMERA, REQUEST_CAMERA) + return false + } + } + return true } override fun onRequestPermissionsResult( @@ -106,10 +116,48 @@ class MemberInfoWritingActivity : grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == REQUEST_CAMERA) { - if (grantResults[0] == 0) { - cameraResultLauncher.launch(intent) + when (requestCode) { + REQUEST_CAMERA -> { + for (grant in grantResults) { + if (grant != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, "권한을 승인해주세요", Toast.LENGTH_LONG).show() + } + } } } } + + private fun saveFile(fileName: String, mimeType: String, bitmap: Bitmap): Uri? { + val contentValues = ContentValues() + contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName) + contentValues.put(MediaStore.Images.Media.MIME_TYPE, mimeType) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + contentValues.put(MediaStore.Images.Media.IS_PENDING, 1) + } + + val uri = + contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) + + if (uri != null) { + val descriptor = contentResolver.openFileDescriptor(uri, "w") + + if (descriptor != null) { + val fileOutputStream = FileOutputStream(descriptor.fileDescriptor) + bitmap.compress(Bitmap.CompressFormat.PNG, 0, fileOutputStream) + fileOutputStream.close() + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + contentValues.clear() + contentValues.put(MediaStore.Images.Media.IS_PENDING, 1) + contentResolver.update(uri, contentValues, null, null) + } + } + } + return uri + } + + private fun randomFileName(): String { + return SimpleDateFormat(getString(R.string.pattern_yyyyMMdd_HHmmss)).format(System.currentTimeMillis()) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_member_info_writing.xml b/app/src/main/res/layout/activity_member_info_writing.xml index 012c9c7..e05f29d 100644 --- a/app/src/main/res/layout/activity_member_info_writing.xml +++ b/app/src/main/res/layout/activity_member_info_writing.xml @@ -164,7 +164,7 @@ 협업 신청하러가기 신규가입회사 회사소개 + yyyyMMdd_HHmmss \ No newline at end of file From d7a87f9b67840c1ef4f0e782e37b6db9e4a7c12a Mon Sep 17 00:00:00 2001 From: river_is_line Date: Thu, 21 Apr 2022 02:54:29 +0900 Subject: [PATCH 06/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20=EC=82=AC=EC=A7=84?= =?UTF-8?q?=20=ED=99=94=EC=A7=88=20=ED=96=A5=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/MemberInfoWritingActivity.kt | 84 +++++++++++++++---- .../layout/activity_member_info_writing.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 3 files changed, 68 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt index 3af6a1e..c733253 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -1,12 +1,15 @@ package com.gsps.gsp_android.ui.main +import android.content.ContentValues import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.ImageDecoder +import android.net.Uri import android.os.Build import android.provider.MediaStore import android.view.View +import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.app.ActivityCompat @@ -14,11 +17,18 @@ import androidx.core.content.ContextCompat import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.ActivityMemberInfoWritingBinding import com.gsps.gsp_android.ui.base.BaseActivity +import java.io.FileOutputStream +import java.text.SimpleDateFormat class MemberInfoWritingActivity : BaseActivity(R.layout.activity_member_info_writing) { companion object { private const val REQUEST_CAMERA = 1000 + private val PERMISSION_CAMERA = arrayOf( + android.Manifest.permission.CAMERA, + android.Manifest.permission.READ_EXTERNAL_STORAGE, + android.Manifest.permission.WRITE_EXTERNAL_STORAGE + ) } private val categoryResultLauncher: ActivityResultLauncher = @@ -30,10 +40,11 @@ class MemberInfoWritingActivity : private val cameraResultLauncher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == RESULT_OK && it.data != null) { + if (it.resultCode == RESULT_OK && it.data?.extras?.get("data") != null) { binding.llPictureBox.visibility = View.GONE val bitmap = it.data?.extras?.get("data") as Bitmap - binding.ivMain.setImageBitmap(bitmap) + val uri = saveFile(randomFileName(), "image/*", bitmap) + binding.ivMain.setImageURI(uri) } } @@ -72,14 +83,14 @@ class MemberInfoWritingActivity : } binding.btnCamera.setOnClickListener { - if (cameraPermissionCheck()) { + if (permissionCheck()) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) cameraResultLauncher.launch(intent) } } binding.btnAlbum.setOnClickListener { - if (cameraPermissionCheck()) { + if (permissionCheck()) { val intent = Intent(Intent.ACTION_PICK) intent.type = "image/*" albumResultLauncher.launch(intent) @@ -87,17 +98,16 @@ class MemberInfoWritingActivity : } } - private fun cameraPermissionCheck(): Boolean { - val permissionCheck = - ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) - return if (permissionCheck == PackageManager.PERMISSION_DENIED) { - ActivityCompat.requestPermissions( - this, - arrayOf(android.Manifest.permission.CAMERA), - REQUEST_CAMERA - ) - false - } else true + private fun permissionCheck(): Boolean { + for (permission in PERMISSION_CAMERA) { + val permissionCheck = + ContextCompat.checkSelfPermission(this, permission) + if (permissionCheck != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, PERMISSION_CAMERA, REQUEST_CAMERA) + return false + } + } + return true } override fun onRequestPermissionsResult( @@ -106,10 +116,48 @@ class MemberInfoWritingActivity : grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == REQUEST_CAMERA) { - if (grantResults[0] == 0) { - cameraResultLauncher.launch(intent) + when (requestCode) { + REQUEST_CAMERA -> { + for (grant in grantResults) { + if (grant != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, "권한을 승인해주세요", Toast.LENGTH_LONG).show() + } + } } } } + + private fun saveFile(fileName: String, mimeType: String, bitmap: Bitmap): Uri? { + val contentValues = ContentValues() + contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName) + contentValues.put(MediaStore.Images.Media.MIME_TYPE, mimeType) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + contentValues.put(MediaStore.Images.Media.IS_PENDING, 1) + } + + val uri = + contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) + + if (uri != null) { + val descriptor = contentResolver.openFileDescriptor(uri, "w") + + if (descriptor != null) { + val fileOutputStream = FileOutputStream(descriptor.fileDescriptor) + bitmap.compress(Bitmap.CompressFormat.PNG, 0, fileOutputStream) + fileOutputStream.close() + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + contentValues.clear() + contentValues.put(MediaStore.Images.Media.IS_PENDING, 1) + contentResolver.update(uri, contentValues, null, null) + } + } + } + return uri + } + + private fun randomFileName(): String { + return SimpleDateFormat(getString(R.string.pattern_yyyyMMdd_HHmmss)).format(System.currentTimeMillis()) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_member_info_writing.xml b/app/src/main/res/layout/activity_member_info_writing.xml index 012c9c7..e05f29d 100644 --- a/app/src/main/res/layout/activity_member_info_writing.xml +++ b/app/src/main/res/layout/activity_member_info_writing.xml @@ -164,7 +164,7 @@ 협업 신청하러가기 신규가입회사 회사소개 + yyyyMMdd_HHmmss \ No newline at end of file From 1dd457fdbe9674c6ef4c04489fbbd5d633fb879a Mon Sep 17 00:00:00 2001 From: river_is_line Date: Thu, 21 Apr 2022 21:41:05 +0900 Subject: [PATCH 07/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20=EC=82=AC=EC=A7=84?= =?UTF-8?q?=20=ED=99=94=EC=A7=88=20=ED=96=A5=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 임시 파일 저장, 갤러리에 안 뜸. --- app/src/main/AndroidManifest.xml | 15 ++- .../ui/main/MemberInfoWritingActivity.kt | 101 +++++++++++------- app/src/main/res/xml/file_path.xml | 6 ++ 3 files changed, 79 insertions(+), 43 deletions(-) create mode 100644 app/src/main/res/xml/file_path.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 71ac529..c833eeb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,13 +13,22 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.GSP_Android"> + + + + - + android:exported="true" /> + android:exported="true"> diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt index c733253..7c59923 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -1,23 +1,25 @@ package com.gsps.gsp_android.ui.main -import android.content.ContentValues import android.content.Intent import android.content.pm.PackageManager -import android.graphics.Bitmap import android.graphics.ImageDecoder import android.net.Uri import android.os.Build +import android.os.Environment import android.provider.MediaStore +import android.util.Log import android.view.View import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.ActivityMemberInfoWritingBinding import com.gsps.gsp_android.ui.base.BaseActivity -import java.io.FileOutputStream +import java.io.File +import java.io.IOException import java.text.SimpleDateFormat class MemberInfoWritingActivity : @@ -31,6 +33,9 @@ class MemberInfoWritingActivity : ) } + private lateinit var photoUri: Uri + private lateinit var imageFilePath: String + private val categoryResultLauncher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == RESULT_OK && it.data != null) { @@ -40,11 +45,15 @@ class MemberInfoWritingActivity : private val cameraResultLauncher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == RESULT_OK && it.data?.extras?.get("data") != null) { - binding.llPictureBox.visibility = View.GONE - val bitmap = it.data?.extras?.get("data") as Bitmap - val uri = saveFile(randomFileName(), "image/*", bitmap) - binding.ivMain.setImageURI(uri) + when (it.resultCode) { + RESULT_OK -> { + binding.llPictureBox.visibility = View.GONE + binding.ivMain.setImageURI(photoUri) + } + RESULT_CANCELED -> { + binding.llPictureBox.visibility = View.GONE + + } } } @@ -85,7 +94,41 @@ class MemberInfoWritingActivity : binding.btnCamera.setOnClickListener { if (permissionCheck()) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) - cameraResultLauncher.launch(intent) + if (intent.resolveActivity(packageManager) != null) { + var photoFile: File? = null + + try { + photoFile = createImageFile() + } catch (ex: IOException) { + Log.d( + "MemberInfoWritingActivity!", + "Error occurred while creating the File" + ) + } + + if (photoFile != null) { + Log.d( + "MemberInfoWritingActivity!", + "btnCamera.setOnClickListener1" + ) + photoUri = + FileProvider.getUriForFile(this, "com.gsps.gsp_android", photoFile) + Log.d( + "MemberInfoWritingActivity!", + "btnCamera.setOnClickListener2" + ) + intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri) + Log.d( + "MemberInfoWritingActivity!", + "btnCamera.setOnClickListener3" + ) + cameraResultLauncher.launch(intent) + Log.d( + "MemberInfoWritingActivity!", + "btnCamera.setOnClickListener4" + ) + } + } } } @@ -127,37 +170,15 @@ class MemberInfoWritingActivity : } } - private fun saveFile(fileName: String, mimeType: String, bitmap: Bitmap): Uri? { - val contentValues = ContentValues() - contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName) - contentValues.put(MediaStore.Images.Media.MIME_TYPE, mimeType) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - contentValues.put(MediaStore.Images.Media.IS_PENDING, 1) - } - - val uri = - contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) - - if (uri != null) { - val descriptor = contentResolver.openFileDescriptor(uri, "w") - - if (descriptor != null) { - val fileOutputStream = FileOutputStream(descriptor.fileDescriptor) - bitmap.compress(Bitmap.CompressFormat.PNG, 0, fileOutputStream) - fileOutputStream.close() - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - contentValues.clear() - contentValues.put(MediaStore.Images.Media.IS_PENDING, 1) - contentResolver.update(uri, contentValues, null, null) - } - } - } - return uri - } + @Throws(IOException::class) + private fun createImageFile(): File { + val timeStamp = + SimpleDateFormat(getString(R.string.pattern_yyyyMMdd_HHmmss)).format(System.currentTimeMillis()) + val imageFileName = "BRIDGE_${timeStamp}" + val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES) + val image = File.createTempFile(imageFileName, ".jpg", storageDir) - private fun randomFileName(): String { - return SimpleDateFormat(getString(R.string.pattern_yyyyMMdd_HHmmss)).format(System.currentTimeMillis()) + imageFilePath = image.absolutePath + return image } } \ No newline at end of file diff --git a/app/src/main/res/xml/file_path.xml b/app/src/main/res/xml/file_path.xml new file mode 100644 index 0000000..b707379 --- /dev/null +++ b/app/src/main/res/xml/file_path.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file From f81287ffdffaec45ec192c828c8d2978f348da18 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 22 Apr 2022 20:45:25 +0900 Subject: [PATCH 08/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20=EC=82=AC=EC=A7=84?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=EC=86=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 내장 메모리, 갤러리에 뜸. --- .../ui/main/MemberInfoWritingActivity.kt | 52 ++++++++++++++++--- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt index 7c59923..8b65a23 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -3,6 +3,7 @@ package com.gsps.gsp_android.ui.main import android.content.Intent import android.content.pm.PackageManager import android.graphics.ImageDecoder +import android.media.MediaScannerConnection import android.net.Uri import android.os.Build import android.os.Environment @@ -45,7 +46,11 @@ class MemberInfoWritingActivity : private val cameraResultLauncher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + binding.llPictureBox.visibility = View.GONE + when (it.resultCode) { + + /* RESULT_OK -> { binding.llPictureBox.visibility = View.GONE binding.ivMain.setImageURI(photoUri) @@ -54,6 +59,34 @@ class MemberInfoWritingActivity : binding.llPictureBox.visibility = View.GONE } + */ + + RESULT_OK -> { + val file = File(imageFilePath) + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { + val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) + mediaScanIntent.data = Uri.fromFile(file) + sendBroadcast(mediaScanIntent) + + } else { + var mediaScannerConnection: MediaScannerConnection? = null + val mMediaScannerClient = + object : MediaScannerConnection.MediaScannerConnectionClient { + override fun onMediaScannerConnected() { + mediaScannerConnection?.scanFile(imageFilePath, null) + } + + override fun onScanCompleted(path: String, uri: Uri) { + mediaScannerConnection?.disconnect() + } + } + + mediaScannerConnection = MediaScannerConnection(this, mMediaScannerClient) + mediaScannerConnection.connect() + } + binding.ivMain.setImageURI(photoUri) + } + RESULT_CANCELED -> {} } } @@ -172,13 +205,16 @@ class MemberInfoWritingActivity : @Throws(IOException::class) private fun createImageFile(): File { - val timeStamp = - SimpleDateFormat(getString(R.string.pattern_yyyyMMdd_HHmmss)).format(System.currentTimeMillis()) - val imageFileName = "BRIDGE_${timeStamp}" - val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES) - val image = File.createTempFile(imageFileName, ".jpg", storageDir) - - imageFilePath = image.absolutePath - return image + val timeStamp: String = + SimpleDateFormat("yyyyMMdd_HHmmss").format(System.currentTimeMillis()) + val imageFileName = "BRIDGE_$timeStamp.jpg" + val storageDir = File("${Environment.getExternalStorageDirectory()}/Pictures") + if (!storageDir.exists()) { + Log.d("MemberInfoWritingActivity!", storageDir.toString()) + storageDir.mkdirs() + } + val imageFile = File(storageDir, imageFileName) + imageFilePath = imageFile.absolutePath + return imageFile } } \ No newline at end of file From fc832587211031cf098e63e2b79ee542b4f7db5f Mon Sep 17 00:00:00 2001 From: river_is_line Date: Sat, 23 Apr 2022 01:59:17 +0900 Subject: [PATCH 09/11] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20SDK=20=EB=B2=84?= =?UTF-8?q?=EC=A0=84=20=EB=B3=84=20=EC=82=AC=EC=A7=84=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 외부 공용 저장소 --- .../ui/main/MemberInfoWritingActivity.kt | 127 ++++++------------ 1 file changed, 41 insertions(+), 86 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt index e15a0b1..35aba2d 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -1,41 +1,32 @@ package com.gsps.gsp_android.ui.main +import android.content.ContentValues import android.content.Intent import android.content.pm.PackageManager import android.graphics.ImageDecoder -import android.media.MediaScannerConnection import android.net.Uri import android.os.Build -import android.os.Environment import android.provider.MediaStore -import android.util.Log import android.view.View import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import androidx.core.content.FileProvider import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.ActivityMemberInfoWritingBinding import com.gsps.gsp_android.ui.base.BaseActivity -import java.io.File -import java.io.IOException import java.text.SimpleDateFormat + class MemberInfoWritingActivity : BaseActivity(R.layout.activity_member_info_writing) { companion object { private const val REQUEST_CAMERA = 1000 - private val PERMISSION_CAMERA = arrayOf( - android.Manifest.permission.CAMERA, - android.Manifest.permission.READ_EXTERNAL_STORAGE, - android.Manifest.permission.WRITE_EXTERNAL_STORAGE - ) + private lateinit var permissions: Array } - private lateinit var photoUri: Uri - private lateinit var imageFilePath: String + private var imageUri: Uri? = null private val categoryResultLauncher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { @@ -50,46 +41,27 @@ class MemberInfoWritingActivity : when (it.resultCode) { RESULT_OK -> { - val file = File(imageFilePath) - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { - val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) - mediaScanIntent.data = Uri.fromFile(file) - sendBroadcast(mediaScanIntent) - - } else { - var mediaScannerConnection: MediaScannerConnection? = null - val mMediaScannerClient = - object : MediaScannerConnection.MediaScannerConnectionClient { - override fun onMediaScannerConnected() { - mediaScannerConnection?.scanFile(imageFilePath, null) - } - - override fun onScanCompleted(path: String, uri: Uri) { - mediaScannerConnection?.disconnect() - } - } - - mediaScannerConnection = MediaScannerConnection(this, mMediaScannerClient) - mediaScannerConnection.connect() - } - binding.ivMain.setImageURI(photoUri) + binding.ivMain.setImageURI(imageUri) + } + else -> { + imageUri?.let { uri -> contentResolver.delete(uri, null, null) } } - RESULT_CANCELED -> {} } } private val albumResultLauncher: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + binding.llPictureBox.visibility = View.GONE + if (it.resultCode == RESULT_OK && it.data != null) { - binding.llPictureBox.visibility = View.GONE val currentImageUri = it.data!!.data currentImageUri?.let { - val bitmap = if (Build.VERSION.SDK_INT < 28) { - MediaStore.Images.Media.getBitmap(this.contentResolver, currentImageUri) - } else { + val bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val source = ImageDecoder.createSource(this.contentResolver, currentImageUri) ImageDecoder.decodeBitmap(source) + } else { + MediaStore.Images.Media.getBitmap(this.contentResolver, currentImageUri) } binding.ivMain.setImageBitmap(bitmap) } @@ -97,6 +69,15 @@ class MemberInfoWritingActivity : } override fun initView() { + permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + arrayOf(android.Manifest.permission.CAMERA) + } else { + arrayOf( + android.Manifest.permission.CAMERA, + android.Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } + binding.tvCategory.setOnClickListener { val intent = Intent(this, MemberInfoCategoryActivity::class.java) categoryResultLauncher.launch(intent) @@ -115,40 +96,11 @@ class MemberInfoWritingActivity : binding.btnCamera.setOnClickListener { if (permissionCheck()) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) - if (intent.resolveActivity(packageManager) != null) { - var photoFile: File? = null - - try { - photoFile = createImageFile() - } catch (ex: IOException) { - Log.d( - "MemberInfoWritingActivity!", - "Error occurred while creating the File" - ) - } - if (photoFile != null) { - Log.d( - "MemberInfoWritingActivity!", - "btnCamera.setOnClickListener1" - ) - photoUri = - FileProvider.getUriForFile(this, "com.gsps.gsp_android", photoFile) - Log.d( - "MemberInfoWritingActivity!", - "btnCamera.setOnClickListener2" - ) - intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri) - Log.d( - "MemberInfoWritingActivity!", - "btnCamera.setOnClickListener3" - ) - cameraResultLauncher.launch(intent) - Log.d( - "MemberInfoWritingActivity!", - "btnCamera.setOnClickListener4" - ) - } + if (intent.resolveActivity(packageManager) != null) { + imageUri = saveImageInExternalPublicStorage() + intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri) + cameraResultLauncher.launch(intent) } } } @@ -163,11 +115,11 @@ class MemberInfoWritingActivity : } private fun permissionCheck(): Boolean { - for (permission in PERMISSION_CAMERA) { + for (permission in permissions) { val permissionCheck = ContextCompat.checkSelfPermission(this, permission) if (permissionCheck != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, PERMISSION_CAMERA, REQUEST_CAMERA) + ActivityCompat.requestPermissions(this, permissions, REQUEST_CAMERA) return false } } @@ -191,21 +143,24 @@ class MemberInfoWritingActivity : } } - @Throws(IOException::class) - private fun createImageFile(): File { + private fun saveImageInExternalPublicStorage(): Uri? { val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(System.currentTimeMillis()) + val resolver = applicationContext.contentResolver + val imageCollection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) + } else { + MediaStore.Images.Media.EXTERNAL_CONTENT_URI + } val imageFileName = "BRIDGE_$timeStamp.jpg" - val storageDir = File("${Environment.getExternalStorageDirectory()}/Pictures") + val imageDetails = + ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, imageFileName) } + val imageContentUri = resolver.insert(imageCollection, imageDetails) - if (!storageDir.exists()) { - Log.d("MemberInfoWritingActivity!", storageDir.toString()) - storageDir.mkdirs() + if (imageContentUri != null) { + resolver.update(imageContentUri, imageDetails, null, null) } - val imageFile = File(storageDir, imageFileName) - - imageFilePath = imageFile.absolutePath - return imageFile + return imageContentUri } } \ No newline at end of file From 4e0811908cde967d6c29e5c3169d950078472cab Mon Sep 17 00:00:00 2001 From: river_is_line Date: Sat, 23 Apr 2022 02:09:45 +0900 Subject: [PATCH 10/11] =?UTF-8?q?=E2=9A=B0=EF=B8=8F::=20directory=20path?= =?UTF-8?q?=20provider=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 25 ++++++------------------- app/src/main/res/xml/file_path.xml | 6 ------ 2 files changed, 6 insertions(+), 25 deletions(-) delete mode 100644 app/src/main/res/xml/file_path.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c833eeb..9f7aa29 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,29 +13,12 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.GSP_Android"> - - - - + android:exported="false" /> - - - - - - - + android:exported="false" /> @@ -67,7 +50,11 @@ + + + + - - - \ No newline at end of file From 82c1989128cac8d097698744d194339dd811d553 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Sat, 23 Apr 2022 02:10:22 +0900 Subject: [PATCH 11/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20=EC=84=B8=EB=B6=80?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gsps/gsp_android/ui/main/CategoryModel.kt | 2 +- .../ui/main/MemberInfoWritingActivity.kt | 4 ++++ .../res/layout/activity_member_info_writing.xml | 13 +++++++------ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt index 16b3e1e..b8fc0fb 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CategoryModel.kt @@ -5,7 +5,7 @@ data class CategoryModel( private var isChecked: Boolean ) { fun getCategory(): String { - return category.toString() + return category } fun setCategory(category: String) { diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt index 35aba2d..270b044 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MemberInfoWritingActivity.kt @@ -78,6 +78,10 @@ class MemberInfoWritingActivity : ) } + binding.btnGoBack.setOnClickListener { + finish() + } + binding.tvCategory.setOnClickListener { val intent = Intent(this, MemberInfoCategoryActivity::class.java) categoryResultLauncher.launch(intent) diff --git a/app/src/main/res/layout/activity_member_info_writing.xml b/app/src/main/res/layout/activity_member_info_writing.xml index e05f29d..2caf7f0 100644 --- a/app/src/main/res/layout/activity_member_info_writing.xml +++ b/app/src/main/res/layout/activity_member_info_writing.xml @@ -11,15 +11,14 @@ type="com.gsps.gsp_android.ui.main.MemberInfoModel" /> - + android:layout_height="match_parent"> + android:layout_alignParentTop="true"> + android:layout_below="@id/tvMain" + android:paddingBottom="80dp" /> - +