From a0bb60d3877b94dcc54f13c8bebf84b8e87c7b70 Mon Sep 17 00:00:00 2001 From: Seoyeon Park Date: Tue, 15 Aug 2023 00:13:30 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]=20:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EC=82=AC=EC=A7=84=20=EC=B9=B4=EB=A9=94=EB=9D=BC=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 - app/src/main/AndroidManifest.xml | 7 -- .../presentation/ui/login/LoginActivity.kt | 2 +- .../presentation/ui/mypage/ProfileActivity.kt | 113 ++++++++++-------- .../ui/mypage/dialog/CameraDialog.kt | 54 ++++++--- .../ui/mypage/dialog/CameraDialogInterface.kt | 7 +- .../main/res/drawable/bg_camera_dialog.xml | 2 +- 7 files changed, 107 insertions(+), 79 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 491a0659..ce6d09d5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,7 +96,6 @@ dependencies { // Coroutine implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3' - implementation("io.coil-kt:coil:2.0.0-rc03") // RoomDB def room_version = '2.5.2' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e861d28..6c87a994 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -66,17 +66,10 @@ - - - - - diff --git a/app/src/main/java/com/example/cherry_pick_android/presentation/ui/login/LoginActivity.kt b/app/src/main/java/com/example/cherry_pick_android/presentation/ui/login/LoginActivity.kt index d9e4f5bf..d25b7956 100644 --- a/app/src/main/java/com/example/cherry_pick_android/presentation/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/example/cherry_pick_android/presentation/ui/login/LoginActivity.kt @@ -84,7 +84,7 @@ class LoginActivity: AppCompatActivity() { binding.tvExplain2.text = textToBold(binding.tvExplain2.text.toString(), 0, 16) - //onClickLogin() + onClickLogin() Log.d(LoginViewModel.TAG, "UserData: ${viewModel.getUserData()}") diff --git a/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/ProfileActivity.kt b/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/ProfileActivity.kt index c20252dd..27ed4140 100644 --- a/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/ProfileActivity.kt +++ b/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/ProfileActivity.kt @@ -1,9 +1,11 @@ package com.example.cherry_pick_android.presentation.ui.mypage +import android.Manifest import android.content.ContentValues import android.content.Intent import android.content.pm.PackageManager import android.net.Uri +import android.os.Build import android.os.Bundle import android.provider.MediaStore import android.util.Log @@ -14,6 +16,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import coil.load +import com.bumptech.glide.Glide import com.example.cherry_pick_android.R import com.example.cherry_pick_android.databinding.ActivityProfileBinding import com.example.cherry_pick_android.presentation.ui.jobGroup.JobGroupActivity @@ -27,40 +30,42 @@ class ProfileActivity : AppCompatActivity(),CameraDialogInterface { private lateinit var binding: ActivityProfileBinding companion object { - const val REQUEST_CODE_PERMISSIONS = 1001 - const val ALBUM_OK = 2002 - const val CAMERA_OK = 2003 - const val BASIC_OK = 2004 const val TAG = "ProfileActivity" } - - - private fun checkPermission(permissions: Array): Boolean { - return permissions.all { - ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED + // 요청하고자 하는 권한들 + private val permissions = arrayOf( + Manifest.permission.CAMERA, + // Manifest.permission.WRITE_EXTERNAL_STORAGE, + // Manifest.permission.READ_EXTERNAL_STORAGE + ) + // 권한 확인 응답 + private val getPermissionResult = registerForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { + if (it.all { permission -> permission.value == true }) { + } else { + Toast.makeText(this, "권한을 거부하였습니다.", Toast.LENGTH_SHORT).show() } } - // 이미지 로드 - private val readImage = registerForActivityResult( - ActivityResultContracts.GetContent()) { - uri -> binding.ivProfilePic.load(uri) - } - - // 카메라를 실행한 후 찍은 사진을 저장 + // 촬영한 사진 불러오기 var pictureUri: Uri? = null - private val getTakePicture = registerForActivityResult(ActivityResultContracts.TakePicture()) { - if(it) { - pictureUri.let { binding.ivProfilePic.setImageURI(pictureUri) } + private val getTakePicture = registerForActivityResult( + ActivityResultContracts.TakePicture()) { + if(it) { pictureUri.let { + Glide.with(this).load(pictureUri).circleCrop().into(binding.ivProfilePic) + } } } - // 파일 불러오기 - private val getContentImage = registerForActivityResult( - ActivityResultContracts.GetContent()) { - uri -> - uri.let { binding.ivProfilePic.setImageURI(uri) - } + // 앨범으로부터 이미지 불러오기 + private val getResultImage = registerForActivityResult( + ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + var imageUrl = it.data?.data + Glide.with(this).load(imageUrl).circleCrop().into(binding.ivProfilePic) + } } + // 직군선택 결과 받아오기 private val getResultText = registerForActivityResult( ActivityResultContracts.StartActivityForResult()){ @@ -99,30 +104,25 @@ class ProfileActivity : AppCompatActivity(),CameraDialogInterface { dialog.show(this.supportFragmentManager, "CameraDialog") } } - override fun onCameraClick(cameraMenu: String) { - val camera_menu = cameraMenu - - //readImage.launch() - // 권한 확인 - //checkPermission.launch(permissionList) - //if (!checkPermission(permissions)) { - // requestPermissions(permissions, REQUEST_CODE_PERMISSIONS) - //} - - if (camera_menu=="@string/profile_img_fromAlbum"){ - getContentImage.launch("image/*") - } - else if (camera_menu=="@string/profile_img_fromCamera"){ - pictureUri = createImageFile() - getTakePicture.launch(pictureUri) - } - else if (camera_menu=="@string/profile_img_basic"){ - binding.ivProfilePic.setImageResource(R.drawable.ic_my_page_user) - } - else if (camera_menu=="@string/profile_img_cancel"){ - // 변화없음 - } + // 앨범 이미지 불러오기 + override fun onAlbumClick(intent: Intent) { + checkPermission(permissions) + getResultImage.launch(intent) + } + // 카메라 촬영 후 이미지 불러오기 + override fun onCameraClick(intent:Intent) { + checkPermission(permissions) + pictureUri = createImageFile() + getTakePicture.launch(pictureUri) + } + // 기본 이미지로 변경 + override fun onBasicClick(intent: Intent) { + binding.ivProfilePic.setImageDrawable(getDrawable(R.drawable.ic_my_page_user)) } + // 이미지 변경 취소 + override fun onCancelClick(intent: Intent) { } + + // 고유 이름으로 이미지 파일 생성 private fun createImageFile(): Uri? { val now = SimpleDateFormat("yyMMdd_HHmmss").format(System.currentTimeMillis()) val content = ContentValues().apply { @@ -132,11 +132,10 @@ class ProfileActivity : AppCompatActivity(),CameraDialogInterface { return contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, content) } + // 직군정보 변경페이지로 이동 private fun ChangeJobInterest() { binding.ibtnProfileJobChange.setOnClickListener { - //val intent = Intent(this,JobGroupActivity::class.java) - //startActivity(intent) val intent = Intent(this, JobGroupActivity::class.java) getResultText.launch(intent) } @@ -174,4 +173,18 @@ class ProfileActivity : AppCompatActivity(),CameraDialogInterface { } } + private fun checkPermission(permissions: Array){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // 권한 허용 여부 확인 + if (permissions.all { + ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED + }) { + Toast.makeText(this, "카메라 권한이 허용되어 있습니다.", Toast.LENGTH_SHORT).show() + } + // 권한 요청 + else { + getPermissionResult.launch(permissions) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/dialog/CameraDialog.kt b/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/dialog/CameraDialog.kt index f6dfd1d0..802b6fa0 100644 --- a/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/dialog/CameraDialog.kt +++ b/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/dialog/CameraDialog.kt @@ -15,6 +15,7 @@ import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.WindowManager import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity @@ -24,6 +25,8 @@ import androidx.core.app.ActivityCompat.startActivityForResult import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.getColor import androidx.fragment.app.DialogFragment +import androidx.fragment.app.setFragmentResult +import coil.load import com.example.cherry_pick_android.R import com.example.cherry_pick_android.databinding.DialogCameraBinding import com.example.cherry_pick_android.databinding.DialogGenderBinding @@ -37,54 +40,69 @@ class CameraDialog ( ): DialogFragment() { companion object { const val TAG = "CameraDialog" + const val PICK_IMAGE_FROM_ALBUM = 0 } + private var cameraDialogInterface: CameraDialogInterface? = null private val binding: DialogCameraBinding by lazy { DialogCameraBinding.inflate(layoutInflater) } + init { this.cameraDialogInterface = cameraDialogInterface } - // 요청하고자 하는 권한들 - private val permissions = arrayOf( - Manifest.permission.CAMERA, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE) - - //var hasCameraPerm = checkSelfPermission(android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED - //var hasWritePerm = checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED - //var hasReadPerm = checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - dialog?.window?.setDimAmount(0.5F) + dialog?.window?.setDimAmount(0.7F) dialog?.window?.setGravity(Gravity.BOTTOM) + dialog?.setCancelable(false) + binding.tvImgFromAlbum.setOnClickListener { - //binding.tvImgFromAlbum.setTextColor(requireContext().getColor(R.color.main_pink)) - //context?.let { it1 -> binding.tvImgFromAlbum.setTextColor(it1.getColor(R.color.main_pink)) } - this.cameraDialogInterface?.onCameraClick(binding.tvImgFromAlbum.toString()) + Log.d(TAG, "앨범으로부터 이미지변경") + var photoPickerIntent = Intent(Intent.ACTION_PICK) + photoPickerIntent.type = "image/*" + this.cameraDialogInterface?.onAlbumClick(photoPickerIntent) + + dismiss() } binding.tvImgFromCamera.setOnClickListener { Log.d(TAG, "카메라로부터 이미지변경") - this.cameraDialogInterface?.onCameraClick(binding.tvImgFromCamera.toString()) + var photoCameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + this.cameraDialogInterface?.onCameraClick(photoCameraIntent) + + dismiss() } binding.tvImgBasic.setOnClickListener { - this.cameraDialogInterface?.onCameraClick(binding.tvImgBasic.toString()) + Log.d(TAG, "기본 이미지로 변경") + activity?.let { + var photoBasicIntent = Intent(it, ProfileActivity::class.java) + this.cameraDialogInterface?.onBasicClick(photoBasicIntent) + } + + dismiss() } binding.tvImgCancel.setOnClickListener { - Log.d(TAG, "프로필이미지변경 취소") - this.cameraDialogInterface?.onCameraClick(binding.tvImgCancel.toString()) + Log.d(TAG, "프로필이미지 변경 취소") + activity?.let { + var photoCancelIntent = Intent(it, ProfileActivity::class.java) + this.cameraDialogInterface?.onCancelClick(photoCancelIntent) + } dismiss() } return binding.root } + + + + + } diff --git a/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/dialog/CameraDialogInterface.kt b/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/dialog/CameraDialogInterface.kt index 86aedde6..6f647796 100644 --- a/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/dialog/CameraDialogInterface.kt +++ b/app/src/main/java/com/example/cherry_pick_android/presentation/ui/mypage/dialog/CameraDialogInterface.kt @@ -1,5 +1,10 @@ package com.example.cherry_pick_android.presentation.ui.mypage.dialog +import android.content.Intent + interface CameraDialogInterface { - fun onCameraClick(cameraMenu: String) + fun onAlbumClick(intent : Intent) + fun onCameraClick(intent : Intent) + fun onBasicClick(intent: Intent) + fun onCancelClick(intent: Intent) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_camera_dialog.xml b/app/src/main/res/drawable/bg_camera_dialog.xml index 88b7fe84..450740b1 100644 --- a/app/src/main/res/drawable/bg_camera_dialog.xml +++ b/app/src/main/res/drawable/bg_camera_dialog.xml @@ -1,7 +1,7 @@ - +