diff --git a/app/build.gradle b/app/build.gradle index fcb2271..a4aa5e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -52,7 +52,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'com.google.android.material:material:1.5.0' + implementation 'com.google.android.material:material:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' diff --git a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteCompleteFragment.kt b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteCompleteFragment.kt new file mode 100644 index 0000000..32861fe --- /dev/null +++ b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteCompleteFragment.kt @@ -0,0 +1,60 @@ +package com.pcandriod.kusitms_hackathon_c.presentation.ui.main.write + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.pcandriod.kusitms_hackathon_c.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [WriteCompleteFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class WriteCompleteFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_write_complete, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment WriteCompleteFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + WriteCompleteFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteCustomerFragment.kt b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteCustomerFragment.kt new file mode 100644 index 0000000..fd532cc --- /dev/null +++ b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteCustomerFragment.kt @@ -0,0 +1,118 @@ +package com.pcandriod.kusitms_hackathon_c.presentation.ui.main.write + +import android.content.Intent +import android.graphics.BitmapFactory +import android.graphics.ImageDecoder +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.provider.MediaStore +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import com.pcandriod.kusitms_hackathon_c.R +import com.pcandriod.kusitms_hackathon_c.databinding.FragmentWriteCustomerBinding +import com.pcandriod.kusitms_hackathon_c.databinding.FragmentWriteOwnerBinding +import com.pcandriod.kusitms_hackathon_c.presentation.ui.main.MainActivity + +class WriteCustomerFragment : Fragment() { + + + lateinit var fragmentWriteCustomerBinding: FragmentWriteCustomerBinding + lateinit var mainActivity: MainActivity + lateinit var albumLauncher: ActivityResultLauncher + // 업로드할 이미지의 Uri + var uploadUri: Uri? = null + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + fragmentWriteCustomerBinding = FragmentWriteCustomerBinding.inflate(inflater) + mainActivity = activity as MainActivity + // 앨범 설정 + albumLauncher = albumSetting(fragmentWriteCustomerBinding.ivRegisterImage) + + fragmentWriteCustomerBinding.run { + + ivRegisterImage.visibility = View.GONE + + ibtnClose.setOnClickListener { + + } + + btnComplete.setOnClickListener { + // 게시글 데이터 전송 + + } + + ibtnRegisterImage.setOnClickListener{ + // 앨범에서 사진을 선택할 수 있는 Activity를 실행한다. + val newIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + // 실행할 액티비티의 마임타입 설정(이미지로 설정해준다) + newIntent.setType("image/*") + // 선택할 파일의 타입을 지정(안드로이드 OS가 이미지에 대한 사전 작업을 할 수 있도록) + val mimeType = arrayOf("image/*") + newIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeType) + + // 액티비티를 실행한다. + albumLauncher.launch(newIntent) + + val handler = Handler() + handler.postDelayed({ + ivRegisterImage.visibility = View.VISIBLE + ibtnRegisterImage.visibility = View.GONE + }, 2000) // 2000ms (2초) 후에 RecyclerView 생성 + } + + } + + + return fragmentWriteCustomerBinding.root + } + + // 앨범 설정 + fun albumSetting(previewImageView: ImageView): ActivityResultLauncher { + val albumContract = ActivityResultContracts.StartActivityForResult() + val albumLauncher = registerForActivityResult(albumContract) { + if (it?.resultCode == AppCompatActivity.RESULT_OK) { + // 선택한 이미지에 접근할 수 있는 Uri 객체를 추출한다. + if (it.data?.data != null) { + uploadUri = it.data?.data + + // 안드로이드 10 (Q) 이상이라면... + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + // 이미지를 생성할 수 있는 디코더를 생성한다. + val source = ImageDecoder.createSource(mainActivity.contentResolver, uploadUri!!) + // Bitmap객체를 생성한다. + val bitmap = ImageDecoder.decodeBitmap(source) + + previewImageView.setImageBitmap(bitmap) + } else { + // 컨텐츠 프로바이더를 통해 이미지 데이터 정보를 가져온다. + val cursor = mainActivity.contentResolver.query(uploadUri!!, null, null, null, null) + if (cursor != null) { + cursor.moveToNext() + + // 이미지의 경로를 가져온다. + val idx = cursor.getColumnIndex(MediaStore.Images.Media.DATA) + val source = cursor.getString(idx) + + // 이미지를 생성하여 보여준다. + val bitmap = BitmapFactory.decodeFile(source) + previewImageView.setImageBitmap(bitmap) + } + } + } + } + } + + return albumLauncher + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteOwnerFragment.kt b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteOwnerFragment.kt new file mode 100644 index 0000000..e7004e0 --- /dev/null +++ b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/write/WriteOwnerFragment.kt @@ -0,0 +1,116 @@ +package com.pcandriod.kusitms_hackathon_c.presentation.ui.main.write + +import android.content.Intent +import android.graphics.BitmapFactory +import android.graphics.ImageDecoder +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.provider.MediaStore +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import com.pcandriod.kusitms_hackathon_c.R +import com.pcandriod.kusitms_hackathon_c.databinding.FragmentWriteOwnerBinding +import com.pcandriod.kusitms_hackathon_c.presentation.ui.main.MainActivity + +class WriteOwnerFragment : Fragment() { + + lateinit var fragmentWriteOwnerBinding: FragmentWriteOwnerBinding + lateinit var mainActivity: MainActivity + lateinit var albumLauncher: ActivityResultLauncher + // 업로드할 이미지의 Uri + var uploadUri: Uri? = null + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + fragmentWriteOwnerBinding = FragmentWriteOwnerBinding.inflate(inflater) + mainActivity = activity as MainActivity + // 앨범 설정 + albumLauncher = albumSetting(fragmentWriteOwnerBinding.ivRegisterImage) + + fragmentWriteOwnerBinding.run { + + ivRegisterImage.visibility = View.GONE + + ibtnClose.setOnClickListener { + + } + + btnComplete.setOnClickListener { + // 게시글 데이터 전송 + + } + + ibtnRegisterImage.setOnClickListener{ + // 앨범에서 사진을 선택할 수 있는 Activity를 실행한다. + val newIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + // 실행할 액티비티의 마임타입 설정(이미지로 설정해준다) + newIntent.setType("image/*") + // 선택할 파일의 타입을 지정(안드로이드 OS가 이미지에 대한 사전 작업을 할 수 있도록) + val mimeType = arrayOf("image/*") + newIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeType) + + // 액티비티를 실행한다. + albumLauncher.launch(newIntent) + + val handler = Handler() + handler.postDelayed({ + ivRegisterImage.visibility = View.VISIBLE + ibtnRegisterImage.visibility = View.GONE + }, 2000) // 2000ms (2초) 후에 RecyclerView 생성 + } + + } + + + return fragmentWriteOwnerBinding.root + } + + // 앨범 설정 + fun albumSetting(previewImageView: ImageView): ActivityResultLauncher { + val albumContract = ActivityResultContracts.StartActivityForResult() + val albumLauncher = registerForActivityResult(albumContract) { + if (it?.resultCode == AppCompatActivity.RESULT_OK) { + // 선택한 이미지에 접근할 수 있는 Uri 객체를 추출한다. + if (it.data?.data != null) { + uploadUri = it.data?.data + + // 안드로이드 10 (Q) 이상이라면... + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + // 이미지를 생성할 수 있는 디코더를 생성한다. + val source = ImageDecoder.createSource(mainActivity.contentResolver, uploadUri!!) + // Bitmap객체를 생성한다. + val bitmap = ImageDecoder.decodeBitmap(source) + + previewImageView.setImageBitmap(bitmap) + } else { + // 컨텐츠 프로바이더를 통해 이미지 데이터 정보를 가져온다. + val cursor = mainActivity.contentResolver.query(uploadUri!!, null, null, null, null) + if (cursor != null) { + cursor.moveToNext() + + // 이미지의 경로를 가져온다. + val idx = cursor.getColumnIndex(MediaStore.Images.Media.DATA) + val source = cursor.getString(idx) + + // 이미지를 생성하여 보여준다. + val bitmap = BitmapFactory.decodeFile(source) + previewImageView.setImageBitmap(bitmap) + } + } + } + } + } + + return albumLauncher + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/home_icn_cancel.xml b/app/src/main/res/drawable/home_icn_cancel.xml new file mode 100644 index 0000000..c3d4230 --- /dev/null +++ b/app/src/main/res/drawable/home_icn_cancel.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/home_sos_write_btn_picture.xml b/app/src/main/res/drawable/home_sos_write_btn_picture.xml new file mode 100644 index 0000000..192ca77 --- /dev/null +++ b/app/src/main/res/drawable/home_sos_write_btn_picture.xml @@ -0,0 +1,35 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_marker.xml b/app/src/main/res/drawable/ic_marker.xml new file mode 100644 index 0000000..57715e9 --- /dev/null +++ b/app/src/main/res/drawable/ic_marker.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/img_complete.xml b/app/src/main/res/drawable/img_complete.xml new file mode 100644 index 0000000..5765b03 --- /dev/null +++ b/app/src/main/res/drawable/img_complete.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_write_complete.xml b/app/src/main/res/layout/fragment_write_complete.xml new file mode 100644 index 0000000..ce5de07 --- /dev/null +++ b/app/src/main/res/layout/fragment_write_complete.xml @@ -0,0 +1,51 @@ + + + + + + + + + +