Skip to content

Commit

Permalink
Merge pull request #272 from BCSDLab/release
Browse files Browse the repository at this point in the history
Update v3.4.2
  • Loading branch information
ThirFir authored May 14, 2024
2 parents 9c579a4 + 533acc9 commit 97d55ef
Show file tree
Hide file tree
Showing 18 changed files with 302 additions and 146 deletions.
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ buildscript {
compileSdkVersion = 34
minSdkVersion = 21
targetSdkVersion = 34
versionName = "3.4.1"
minVersionCode = 30401
versionName = "3.4.2"
minVersionCode = 30402
}

dependencies {
Expand Down
2 changes: 2 additions & 0 deletions core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,6 @@ dependencies {

implementation platform(libs.firebase.bom)
implementation libs.firebase.analytics.ktx

implementation libs.photoview
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ object AnalyticsConstant {
const val MAIN_SHOP_CATEGORIES = "main_shop_categories"
const val SHOP_CATEGORIES = "shop_categories"
const val SHOP_CATEGORIES_SEARCH = "shop_categories_search"
const val SHOP_CATEGORIES_EVENT = "shop_categories_event"
const val HAMBURGER = "hamburger"
const val HAMBURGER_SHOP = "${HAMBURGER}_shop"
const val HAMBURGER_DINING = "${HAMBURGER}_dining"
Expand All @@ -43,6 +44,8 @@ object AnalyticsConstant {
const val SHOP_PICTURE = "shop_picture"
const val SHOP_CALL = "shop_call"
const val SHOP_CLICK = "shop_click"
const val SHOP_BACK_BUTTON = "shop_back_button"
const val SHOP_DETAIL_VIEW_EVENT = "shop_detail_view_event"
}

}
112 changes: 112 additions & 0 deletions core/src/main/java/in/koreatech/koin/core/dialog/ZoomableDialog.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package `in`.koreatech.koin.core.dialog

import android.annotation.SuppressLint
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.github.chrisbanes.photoview.PhotoView
import `in`.koreatech.koin.core.R

class ImageZoomableDialog(private val context: Context, private val image: String) : Dialog(context) {

private var isUserImageInteraction = false
private lateinit var photoView : PhotoView
var initialScale = 1f

override fun onStart() {
super.onStart()
window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
}

@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.image_zoomable_dialog)

photoView = findViewById(R.id.photo_view)
photoView.apply {
setOnTouchListener { v, event ->
attacher.onTouch(v, event)
if (event?.action == ACTION_POINTER_DOWN || event?.action == MotionEvent.ACTION_UP)
false
else true
}
minimumScale = initialScale
}
}

override fun onTouchEvent(event: MotionEvent): Boolean {
if(event.action == ACTION_POINTER_DOWN)
isUserImageInteraction = true

// 이미지 영역 밖 터치 시 dismiss
if(event.action == MotionEvent.ACTION_UP) {
if (!isUserImageInteraction) {
val rect = Rect()
window!!.decorView.getWindowVisibleDisplayFrame(rect)
val statusBarHeight = rect.top

if(photoView.displayRect != null)
if (!photoView.displayRect.contains(event.rawX, event.rawY - statusBarHeight)) {
dismiss()
}
}
isUserImageInteraction = false
}
return super.onTouchEvent(event)
}

override fun show() {
super.show()
Glide.with(context)
.load(image)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean = false

override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
photoView.post {
photoView.scale = initialScale

val closeButton = findViewById<ImageView>(R.id.dialog_close_button)
val lp = closeButton.layoutParams as FrameLayout.LayoutParams
val rectF = photoView.displayRect
lp.setMargins(0, rectF.top.toInt() - closeButton.height - 8, rectF.left.toInt(), 0)
closeButton.layoutParams = lp
closeButton.visibility = View.VISIBLE
}
return false
}
})
.into(photoView)
}

companion object {
private const val ACTION_POINTER_DOWN = 261
}
}
5 changes: 5 additions & 0 deletions core/src/main/res/drawable/ic_close_round.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">

<path android:fillColor="@android:color/white" android:pathData="M18.3,5.71c-0.39,-0.39 -1.02,-0.39 -1.41,0L12,10.59 7.11,5.7c-0.39,-0.39 -1.02,-0.39 -1.41,0 -0.39,0.39 -0.39,1.02 0,1.41L10.59,12 5.7,16.89c-0.39,0.39 -0.39,1.02 0,1.41 0.39,0.39 1.02,0.39 1.41,0L12,13.41l4.89,4.89c0.39,0.39 1.02,0.39 1.41,0 0.39,-0.39 0.39,-1.02 0,-1.41L13.41,12l4.89,-4.89c0.38,-0.38 0.38,-1.02 0,-1.4z"/>

</vector>
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
xmlns:app="http://schemas.android.com/apk/res-auto">

<ImageView
android:id="@+id/close_button_dining"
android:id="@+id/dialog_close_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:visibility="invisible"
android:src="@drawable/ic_close_round" />

<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/photo_view_dining"
android:id="@+id/photo_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,18 @@
package `in`.koreatech.koin.ui.dining.adapter

import android.annotation.SuppressLint
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.github.chrisbanes.photoview.PhotoView
import `in`.koreatech.koin.R
import `in`.koreatech.koin.core.analytics.EventLogger
import `in`.koreatech.koin.core.constant.AnalyticsConstant
import `in`.koreatech.koin.core.dialog.ImageZoomableDialog
import `in`.koreatech.koin.databinding.ItemDiningBinding
import `in`.koreatech.koin.domain.model.dining.Dining
import `in`.koreatech.koin.domain.util.DiningUtil
Expand Down Expand Up @@ -60,41 +46,10 @@ class DiningAdapter : ListAdapter<Dining, RecyclerView.ViewHolder>(diffCallback)
.load(dining.imageUrl)
.into(imageViewDining)

val dialog = createZoomableDialog(context)
val dialog = ImageZoomableDialog(context, dining.imageUrl)
dialog.initialScale = 0.75f
cardViewDining.setOnClickListener {
dialog.show()
val photoView = dialog.findViewById<PhotoView>(R.id.photo_view_dining)
Glide.with(context)
.load(dining.imageUrl)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean = false

override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
photoView.post {
photoView.scale = DIALOG_MIN_SCALE

val closeButton = dialog.findViewById<ImageView>(R.id.close_button_dining)
val lp = closeButton.layoutParams as FrameLayout.LayoutParams
val rectF = photoView.displayRect
lp.setMargins(0, rectF.top.toInt() - closeButton.height - 8, rectF.left.toInt(), 0)
closeButton.layoutParams = lp
closeButton.visibility = View.VISIBLE
}
return false
}
})
.into(photoView)
EventLogger.logClickEvent(
AnalyticsConstant.Domain.CAMPUS,
AnalyticsConstant.Label.MENU_IMAGE,
Expand Down Expand Up @@ -176,60 +131,10 @@ class DiningAdapter : ListAdapter<Dining, RecyclerView.ViewHolder>(diffCallback)
textViewDiningMenuItems.text = dining.menu.joinToString("\n")
}
}
private fun createZoomableDialog(context: Context) : Dialog = object : Dialog(context) {

private var isUserImageInteraction = false
private lateinit var photoView : PhotoView

override fun onStart() {
super.onStart()
window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
}

@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.dialog_dining_image)

photoView = findViewById(R.id.photo_view_dining)
photoView.apply {
setOnTouchListener { v, event ->
attacher.onTouch(v, event)
if (event?.action == ACTION_POINTER_DOWN || event?.action == MotionEvent.ACTION_UP)
false
else true
}
minimumScale = DIALOG_MIN_SCALE
}
}

override fun onTouchEvent(event: MotionEvent): Boolean {
if(event.action == ACTION_POINTER_DOWN)
isUserImageInteraction = true

// 이미지 영역 밖 터치 시 dismiss
if(event.action == MotionEvent.ACTION_UP) {
if (!isUserImageInteraction) {
val rect = Rect()
window!!.decorView.getWindowVisibleDisplayFrame(rect)
val statusBarHeight = rect.top

if(photoView.displayRect != null)
if (!photoView.displayRect.contains(event.rawX, event.rawY - statusBarHeight)) {
dismiss()
}
}
isUserImageInteraction = false
}
return super.onTouchEvent(event)
}
}
}

companion object {
private const val DIALOG_MIN_SCALE = 0.75f
private const val ACTION_POINTER_DOWN = 261
private val diffCallback = object : DiffUtil.ItemCallback<Dining>() {
override fun areItemsTheSame(
oldItem: Dining,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import dagger.hilt.android.AndroidEntryPoint
import `in`.koreatech.koin.R
import `in`.koreatech.koin.core.util.dataBinding
import `in`.koreatech.koin.core.viewpager.HorizontalMarginItemDecoration
import `in`.koreatech.koin.core.analytics.EventLogger
import `in`.koreatech.koin.core.constant.AnalyticsConstant
import `in`.koreatech.koin.core.util.dataBinding
import `in`.koreatech.koin.core.viewpager.HorizontalMarginItemDecoration
import `in`.koreatech.koin.data.util.localized
import `in`.koreatech.koin.data.util.todayOrTomorrow
import `in`.koreatech.koin.databinding.ActivityMainBinding
Expand All @@ -26,7 +26,6 @@ import `in`.koreatech.koin.ui.navigation.KoinNavigationDrawerActivity
import `in`.koreatech.koin.ui.navigation.state.MenuState
import `in`.koreatech.koin.ui.store.contract.StoreActivityContract
import `in`.koreatech.koin.util.ext.observeLiveData
import androidx.activity.result.contract.ActivityResultContracts

@AndroidEntryPoint
class MainActivity : KoinNavigationDrawerActivity() {
Expand Down Expand Up @@ -58,8 +57,13 @@ class MainActivity : KoinNavigationDrawerActivity() {
private val diningContainerAdapter by lazy { DiningContainerViewPager2Adapter(this) }

private val storeCategoriesRecyclerAdapter = StoreCategoriesRecyclerAdapter().apply {
setOnItemClickListener {
gotoStoreActivity(it)
setOnItemClickListener { id, name ->
EventLogger.logClickEvent(
AnalyticsConstant.Domain.BUSINESS,
AnalyticsConstant.Label.MAIN_SHOP_CATEGORIES,
name
)
gotoStoreActivity(id)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ diffCallback

with(holder){
container.setOnClickListener {
onItemClickListener?.onItemClick(event.id)
onItemClickListener?.onItemClick(event.id, event.name)
}

Glide.with(storeCategoryImage)
Expand All @@ -47,13 +47,13 @@ diffCallback
}

interface OnItemClickListener {
fun onItemClick(id: Int)
fun onItemClick(id: Int, name: String)
}

inline fun setOnItemClickListener(crossinline onItemClick: (Id: Int) -> Unit) {
inline fun setOnItemClickListener(crossinline onItemClick: (Id: Int, name: String) -> Unit) {
onItemClickListener = object : StoreCategoriesRecyclerAdapter.OnItemClickListener {
override fun onItemClick(id: Int) {
onItemClick(id)
override fun onItemClick(id: Int, name: String) {
onItemClick(id, name)
}
}
}
Expand Down
Loading

0 comments on commit 97d55ef

Please sign in to comment.