Skip to content

Commit

Permalink
Merge pull request #12 from depromeet/feat/#7-view-review
Browse files Browse the repository at this point in the history
[BSVR-82/FEAT] 직관 등록 1차 UI 구현
  • Loading branch information
minju1459 authored Jul 10, 2024
2 parents 0cabf3e + 5641869 commit 65ef099
Show file tree
Hide file tree
Showing 50 changed files with 895 additions and 3 deletions.
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>

<application
android:name="com.depromeet.spot.MyApp"
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
4
3
0
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.depromeet.presentation.seatReview

import android.os.Bundle
import android.view.View
import com.depromeet.core.base.BindingBottomSheetDialog
import com.depromeet.presentation.R
import com.depromeet.presentation.databinding.FragmentDatePickerBottomSheetBinding
import dagger.hilt.android.AndroidEntryPoint
import java.util.Calendar

@AndroidEntryPoint
class DatePickerDialog : BindingBottomSheetDialog<FragmentDatePickerBottomSheetBinding>(
R.layout.fragment_date_picker_bottom_sheet,
FragmentDatePickerBottomSheetBinding::inflate,
) {
var onDateSelected: ((year: Int, month: Int, day: Int) -> Unit)? = null

companion object {
private val calendarInstance: Calendar by lazy {
Calendar.getInstance()
}
}

private var selectedYear: Int = calendarInstance.get(Calendar.YEAR)
private var selectedMonth: Int = calendarInstance.get(Calendar.MONTH)
private var selectedDay: Int = calendarInstance.get(Calendar.DAY_OF_MONTH)

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

binding.dpDatePicker.init(selectedYear, selectedMonth, selectedDay) { _, year, month, day ->
selectedYear = year
selectedMonth = month
selectedDay = day
}
}

override fun onDestroyView() {
super.onDestroyView()
onDateSelected?.invoke(selectedYear, selectedMonth, selectedDay)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.depromeet.presentation.seatReview

import android.app.Activity.RESULT_OK
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.view.View
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.os.bundleOf
import androidx.fragment.app.setFragmentResult
import com.depromeet.core.base.BindingBottomSheetDialog
import com.depromeet.presentation.R
import com.depromeet.presentation.databinding.FragmentUploadBottomSheetBinding
import com.depromeet.presentation.extension.setOnSingleClickListener
import dagger.hilt.android.AndroidEntryPoint
import java.io.ByteArrayOutputStream

@AndroidEntryPoint
class ImageUploadDialog : BindingBottomSheetDialog<FragmentUploadBottomSheetBinding>(
R.layout.fragment_upload_bottom_sheet,
FragmentUploadBottomSheetBinding::inflate,
) {

companion object {
private const val REQUEST_KEY = "requestKey"
private const val SELECTED_IMAGES = "selected_images"
private const val IMAGE_TITLE = "image"
}

private lateinit var pickMultipleMediaLauncher: ActivityResultLauncher<PickVisualMediaRequest>
private lateinit var takePhotoLauncher: ActivityResultLauncher<Intent>

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.TransparentBottomSheetDialogFragment)
setupPickMultipleMediaLauncher()
setupTakePhotoLauncher()
}

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

private fun setupPickMultipleMediaLauncher() {
pickMultipleMediaLauncher =
registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(3)) { uris ->
val uriList = uris.map { it.toString() }
val bundle = bundleOf(SELECTED_IMAGES to uriList)
setFragmentResult(REQUEST_KEY, bundle)
dismiss()
}
}

private fun setupTakePhotoLauncher() {
takePhotoLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
val data: Intent? = result.data
val bitmap = data?.extras?.get("data") as Bitmap?
bitmap?.let {
val uri = getImageUri(requireContext(), it)
val bundle = Bundle().apply {
putStringArrayList(SELECTED_IMAGES, arrayListOf(uri.toString()))
}
setFragmentResult(REQUEST_KEY, bundle)
dismiss()
}
}
}
}

private fun setupUploadMethod() {
binding.layoutGallery.setOnSingleClickListener {
pickMultipleMediaLauncher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
binding.layoutTakePhoto.setOnSingleClickListener {
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
takePhotoLauncher.launch(takePictureIntent)
}
}

private fun getImageUri(context: Context, bitmap: Bitmap): Uri {
val bytes = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
val path = MediaStore.Images.Media.insertImage(
context.contentResolver,
bitmap,
IMAGE_TITLE,
null,
)
return Uri.parse(path)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package com.depromeet.presentation.seatReview

import android.app.DatePickerDialog
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.ImageView
import androidx.core.view.isVisible
import coil.load
import coil.transform.RoundedCornersTransformation
import com.depromeet.core.base.BaseActivity
import com.depromeet.presentation.databinding.ActivityMainReviewBinding
import com.depromeet.presentation.extension.setOnSingleClickListener
import dagger.hilt.android.AndroidEntryPoint
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale

@AndroidEntryPoint
class ReviewMainActivity : BaseActivity<ActivityMainReviewBinding>({
ActivityMainReviewBinding.inflate(it)
}) {

private val imageViews: List<View> by lazy {
listOf(
binding.ivFirstImage,
binding.ivSecondImage,
binding.ivThirdImage,
)
}
private var selectedImageUris: MutableList<String> = mutableListOf()

companion object {
private const val DATE_FORMAT = "yy.MM.dd"
private const val FRAGMENT_RESULT_KEY = "requestKey"
private const val SELECTED_IMAGES = "selected_images"
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initUploadDialog()
initDatePickerDialog()
setupFragmentResultListener()
}

private fun initUploadDialog() {
binding.btnAddImage.setOnClickListener {
val uploadDialogFragment = ImageUploadDialog()
uploadDialogFragment.show(supportFragmentManager, uploadDialogFragment.tag)
}
}

private fun initDatePickerDialog() {
val today = Calendar.getInstance()
val dateFormat = SimpleDateFormat(DATE_FORMAT, Locale.getDefault())
with(binding) {
tvDate.text = dateFormat.format(today.time)
layoutDatePicker.setOnSingleClickListener {
val datePickerDialogFragment = DatePickerDialog().apply {
onDateSelected = { year, month, day ->
val selectedDate = Calendar.getInstance()
selectedDate.set(year, month, day)
tvDate.text = dateFormat.format(selectedDate.time)
}
}
datePickerDialogFragment.show(supportFragmentManager, datePickerDialogFragment.tag)
}
}
}

private fun setupFragmentResultListener() {
supportFragmentManager.setFragmentResultListener(FRAGMENT_RESULT_KEY, this) { _, bundle ->
val newSelectedImages = bundle.getStringArrayList(SELECTED_IMAGES)
newSelectedImages?.let { addSelectedImages(it) }
}
}

private fun addSelectedImages(newImageUris: List<String>) {
selectedImageUris.addAll(newImageUris.filterNot { selectedImageUris.contains(it) })
updateImageViews()
}

private fun updateImageViews() {
with(binding) {
layoutAddDefaultImage.isVisible = selectedImageUris.isEmpty()
selectedImageUris.forEachIndexed { index, uri ->
if (index < imageViews.size) {
val image = imageViews[index] as ImageView
image.isVisible = true
image.setImageURI(Uri.parse(uri))
image.load(Uri.parse(uri)) {
transformations(RoundedCornersTransformation(26f))
}
}
}
for (index in selectedImageUris.size until imageViews.size) {
val image = imageViews[index] as ImageView
image.isVisible = false
}
if (selectedImageUris.size == 3) {
svAddImage.post { svAddImage.fullScroll(View.FOCUS_RIGHT) }
}
btnAddImage.isVisible = selectedImageUris.size < imageViews.size
}
}
}
10 changes: 10 additions & 0 deletions presentation/src/main/res/drawable/ic_camera.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M9.558,1C9.448,1 9.352,1 9.26,1.005C8.103,1.076 7.09,1.806 6.658,2.881C6.624,2.966 6.594,3.057 6.559,3.162L6.551,3.184C6.505,3.323 6.495,3.352 6.486,3.373C6.342,3.731 6.005,3.975 5.619,3.998C5.596,4 5.562,4 5.406,4L5.35,4C5.035,4 4.804,4 4.606,4.019C2.708,4.207 1.207,5.708 1.02,7.606C1,7.803 1,8.026 1,8.325L1,16.241C1,17.046 1,17.711 1.044,18.252C1.09,18.814 1.189,19.331 1.436,19.816C1.819,20.569 2.431,21.181 3.184,21.564C3.669,21.811 4.186,21.91 4.748,21.956C5.289,22 5.954,22 6.759,22H17.241C18.046,22 18.711,22 19.252,21.956C19.814,21.91 20.331,21.811 20.816,21.564C21.569,21.181 22.181,20.569 22.564,19.816C22.811,19.331 22.91,18.814 22.956,18.252C23,17.711 23,17.046 23,16.241L23,8.325C23,8.026 23,7.803 22.98,7.606C22.792,5.708 21.292,4.207 19.394,4.019C19.197,4 18.965,4 18.65,4L18.594,4C18.438,4 18.404,4 18.381,3.998C17.996,3.975 17.658,3.731 17.514,3.373C17.505,3.352 17.495,3.323 17.449,3.184L17.441,3.162C17.406,3.057 17.376,2.966 17.342,2.881C16.91,1.806 15.897,1.076 14.74,1.005C14.648,1 14.552,1 14.442,1H9.558ZM16,12.5C16,14.709 14.209,16.5 12,16.5C9.791,16.5 8,14.709 8,12.5C8,10.291 9.791,8.5 12,8.5C14.209,8.5 16,10.291 16,12.5Z"
android:fillColor="#C8C8C8"
android:fillType="evenOdd"/>
</vector>
10 changes: 10 additions & 0 deletions presentation/src/main/res/drawable/ic_chevron_down.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="22dp"
android:height="22dp"
android:viewportWidth="22"
android:viewportHeight="22">
<path
android:pathData="M7.601,17.149C7.244,16.791 7.244,16.21 7.601,15.852L12.453,11L7.601,6.149C7.244,5.791 7.244,5.21 7.601,4.852C7.959,4.494 8.54,4.494 8.898,4.852L14.398,10.352C14.756,10.71 14.756,11.29 14.398,11.649L8.898,17.149C8.54,17.507 7.959,17.507 7.601,17.149Z"
android:fillColor="#7B7B7B"
android:fillType="evenOdd"/>
</vector>
10 changes: 10 additions & 0 deletions presentation/src/main/res/drawable/ic_chevron_left.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M14.265,19.538C14.441,19.712 14.671,19.801 14.901,19.801C15.131,19.801 15.363,19.712 15.538,19.537C15.889,19.184 15.888,18.615 15.536,18.264L7.173,9.922L15.538,1.536C15.889,1.184 15.888,0.615 15.536,0.264C15.184,-0.088 14.614,-0.087 14.263,0.265L5.263,9.288C5.095,9.458 5,9.688 5,9.925C5.001,10.165 5.096,10.394 5.265,10.561L14.265,19.538Z"
android:fillColor="#333333"
android:fillType="evenOdd"/>
</vector>
13 changes: 13 additions & 0 deletions presentation/src/main/res/drawable/ic_delete.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,12m-11,0a11,11 0,1 1,22 0a11,11 0,1 1,-22 0"
android:fillColor="#000000"
android:fillAlpha="0.25"/>
<path
android:pathData="M16.756,8.423C17.081,8.097 17.081,7.57 16.756,7.244C16.431,6.919 15.903,6.919 15.577,7.244L12,10.821L8.423,7.244C8.097,6.919 7.57,6.919 7.244,7.244C6.919,7.57 6.919,8.097 7.244,8.423L10.821,12L7.244,15.577C6.919,15.903 6.919,16.431 7.244,16.756C7.57,17.081 8.097,17.081 8.423,16.756L12,13.179L15.577,16.756C15.903,17.081 16.431,17.081 16.756,16.756C17.081,16.431 17.081,15.903 16.756,15.577L13.179,12L16.756,8.423Z"
android:fillColor="#ffffff"/>
</vector>
14 changes: 14 additions & 0 deletions presentation/src/main/res/drawable/ic_image.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M8.5,5.5C6.843,5.5 5.5,6.843 5.5,8.5C5.5,10.157 6.843,11.5 8.5,11.5C10.157,11.5 11.5,10.157 11.5,8.5C11.5,6.843 10.157,5.5 8.5,5.5Z"
android:fillColor="#C8C8C8"
android:fillType="evenOdd"/>
<path
android:pathData="M7.759,2H16.241C17.046,2 17.711,2 18.252,2.044C18.814,2.09 19.331,2.189 19.816,2.436C20.569,2.819 21.181,3.431 21.564,4.184C21.811,4.669 21.91,5.186 21.956,5.748C22,6.289 22,6.954 22,7.759V14.989L22,15V16.241C22,17.046 22,17.711 21.956,18.252C21.929,18.58 21.884,18.894 21.802,19.194C21.761,19.343 21.711,19.489 21.65,19.632C21.624,19.694 21.595,19.755 21.564,19.816C21.181,20.569 20.569,21.181 19.816,21.564C19.331,21.811 18.814,21.91 18.252,21.956C17.711,22 17.046,22 16.241,22H7.75C7.631,22 7.516,22 7.403,22H6.894C6.624,22 6.358,22 6.144,21.981L6.122,21.979C5.991,21.973 5.867,21.965 5.748,21.956C5.186,21.91 4.669,21.811 4.184,21.564C3.431,21.181 2.819,20.569 2.436,19.816C2.189,19.331 2.09,18.814 2.044,18.252C2,17.711 2,17.046 2,16.241V7.759C2,6.954 2,6.289 2.044,5.748C2.09,5.186 2.189,4.669 2.436,4.184C2.819,3.431 3.431,2.819 4.184,2.436C4.669,2.189 5.186,2.09 5.748,2.044C6.289,2 6.954,2 7.759,2ZM20,7.8V12.586L17.816,10.401C17.638,10.223 17.464,10.049 17.305,9.914C17.13,9.766 16.908,9.606 16.618,9.512C16.216,9.381 15.784,9.381 15.382,9.512C15.092,9.606 14.87,9.766 14.696,9.914C14.536,10.049 14.363,10.223 14.184,10.401L5.632,18.953C5.441,19.145 5.253,19.332 5.115,19.497C5.073,19.548 5.015,19.618 4.957,19.706C4.642,19.514 4.386,19.238 4.218,18.908C4.138,18.752 4.073,18.527 4.038,18.089C4.001,17.639 4,17.057 4,16.2V7.8C4,6.943 4.001,6.361 4.038,5.911C4.073,5.473 4.138,5.248 4.218,5.092C4.41,4.716 4.716,4.41 5.092,4.218C5.248,4.138 5.473,4.073 5.911,4.038C6.361,4.001 6.943,4 7.8,4H16.2C17.057,4 17.639,4.001 18.089,4.038C18.527,4.073 18.752,4.138 18.908,4.218C19.284,4.41 19.59,4.716 19.782,5.092C19.862,5.248 19.927,5.473 19.962,5.911C19.999,6.361 20,6.943 20,7.8Z"
android:fillColor="#C8C8C8"
android:fillType="evenOdd"/>
</vector>
12 changes: 12 additions & 0 deletions presentation/src/main/res/drawable/ic_pencil.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="12dp"
android:viewportWidth="12"
android:viewportHeight="12">
<path
android:pathData="M9.354,0.646C9.158,0.451 8.842,0.451 8.646,0.646C8.451,0.842 8.451,1.158 8.646,1.354L10.646,3.354C10.842,3.549 11.158,3.549 11.354,3.354C11.549,3.158 11.549,2.842 11.354,2.646L9.354,0.646Z"
android:fillColor="#AFAFAF"/>
<path
android:pathData="M7.268,2.14C7.419,2.091 7.581,2.091 7.732,2.14C7.848,2.178 7.932,2.241 7.988,2.288C8.036,2.329 8.086,2.379 8.128,2.421L9.579,3.872C9.621,3.914 9.671,3.964 9.712,4.012C9.759,4.068 9.822,4.152 9.86,4.268C9.909,4.419 9.909,4.581 9.86,4.732C9.822,4.848 9.759,4.932 9.712,4.988C9.671,5.036 9.621,5.086 9.579,5.128L4.385,10.322C4.292,10.415 4.209,10.498 4.114,10.567C4.03,10.629 3.94,10.681 3.845,10.724C3.737,10.772 3.625,10.802 3.497,10.837L1.132,11.482C0.958,11.53 0.773,11.48 0.646,11.354C0.52,11.227 0.47,11.042 0.518,10.868L1.163,8.503C1.198,8.375 1.228,8.263 1.276,8.155C1.319,8.06 1.371,7.97 1.433,7.886C1.502,7.791 1.585,7.708 1.678,7.615L6.872,2.421C6.914,2.379 6.964,2.329 7.012,2.288C7.068,2.241 7.152,2.178 7.268,2.14Z"
android:fillColor="#AFAFAF"/>
</vector>
9 changes: 9 additions & 0 deletions presentation/src/main/res/drawable/ic_plus.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M17.333,6.666C17.333,5.93 16.736,5.333 16,5.333C15.263,5.333 14.666,5.93 14.666,6.666V14.666H6.666C5.93,14.666 5.333,15.263 5.333,16C5.333,16.736 5.93,17.333 6.666,17.333H14.666V25.333C14.666,26.069 15.263,26.666 16,26.666C16.736,26.666 17.333,26.069 17.333,25.333V17.333H25.333C26.069,17.333 26.666,16.736 26.666,16C26.666,15.263 26.069,14.666 25.333,14.666H17.333V6.666Z"
android:fillColor="#7B7B7B"/>
</vector>
6 changes: 6 additions & 0 deletions presentation/src/main/res/drawable/rect_gray200_fill_16.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="16dp" />
<solid android:color="#F4F4F4" />
</shape>
6 changes: 6 additions & 0 deletions presentation/src/main/res/drawable/rect_gray200_fill_6.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="6dp" />
<solid android:color="#C8C8C8" />
</shape>
6 changes: 6 additions & 0 deletions presentation/src/main/res/drawable/rect_gray50_fill_30.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="30dp" />
<solid android:color="#F4F4F4" />
</shape>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="12dp" />
<solid android:color="#F4F4F4" />
<stroke
android:width="1dp"
android:color="#E5E5E5" />
</shape>
6 changes: 6 additions & 0 deletions presentation/src/main/res/drawable/rect_gray600_fill_12.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="12dp" />
<solid android:color="#7B7B7B" />
</shape>
9 changes: 9 additions & 0 deletions presentation/src/main/res/drawable/rect_white_fill_32.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="32dp"
android:topRightRadius="32dp" />
<solid android:color="@color/white" />

</shape>
Loading

0 comments on commit 65ef099

Please sign in to comment.