Skip to content

Commit f8962e5

Browse files
wjswnsdkkevin990222wjshim2003
authored
카카오톡 공유하기 (#121)
* fix_long_restaurant_name_error * plus_share_button * 공유 아이콘 주석처리 * 공유 아이콘 복구 * 카카오톡 공유 1 * 카카오톡 공유하기 * 중복된 코드 삭제 * lint * "식단을 공유합니다" 문구 추가 * 디자인 수정 --------- Co-authored-by: kevin990222 <113081855+kevin990222@users.noreply.github.com> Co-authored-by: Shim Woojin <wjshim@snu.ac.kr>
1 parent 37362b9 commit f8962e5

File tree

10 files changed

+112
-5
lines changed

10 files changed

+112
-5
lines changed

.idea/kotlinc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import java.util.Properties
33
import java.io.FileInputStream
44

55
plugins {
6-
id("com.android.application") version "8.1.1"
6+
id("com.android.application") version "8.1.4"
77
id("org.jetbrains.kotlin.android") version "1.8.10"
88
id("org.jetbrains.kotlin.plugin.parcelize") version "1.8.10"
99
id("org.jetbrains.kotlin.kapt") version "1.8.10"
@@ -159,6 +159,7 @@ dependencies {
159159
// misc
160160
implementation("com.github.woxthebox:draglistview:1.7.2")
161161
implementation("com.kakao.sdk:v2-user:2.4.1")
162+
implementation("com.kakao.sdk:v2-share:2.11.2")
162163
implementation("com.google.android.gms:play-services-auth:20.5.0")
163164
implementation("com.airbnb.android:lottie:5.2.0")
164165

app/src/main/AndroidManifest.xml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@
6060

6161
<category android:name="android.intent.category.LAUNCHER" />
6262
</intent-filter>
63+
64+
<intent-filter>
65+
<action android:name="android.intent.action.VIEW" />
66+
<category android:name="android.intent.category.DEFAULT" />
67+
<category android:name="android.intent.category.BROWSABLE" />
68+
69+
<data android:scheme="@string/kakao_scheme"
70+
android:host="@string/kakaolink_host" />
71+
</intent-filter>
72+
6373
</activity>
6474
<activity
6575
android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
@@ -75,6 +85,18 @@
7585
android:host="oauth"
7686
android:scheme="@string/kakao_key_with_prefix" />
7787
</intent-filter>
88+
89+
90+
<intent-filter>
91+
<action android:name="android.intent.action.VIEW" />
92+
<category android:name="android.intent.category.DEFAULT" />
93+
<category android:name="android.intent.category.BROWSABLE" />
94+
95+
<data android:scheme="@string/kakao_scheme"
96+
android:host="@string/kakaolink_host" />
97+
98+
</intent-filter>
99+
78100
</activity>
79101
<activity
80102
android:name=".ui.common.ImageViewerActivity"

app/src/main/java/com/wafflestudio/siksha2/SikshaApplication.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ class SikshaApplication : Application() {
1414
Timber.plant(Timber.DebugTree())
1515
}
1616

17-
KakaoSdk.init(this, getString(R.string.kakao_key))
17+
KakaoSdk.init(this, resources.getString(R.string.kakao_app_key))
1818
}
1919
}

app/src/main/java/com/wafflestudio/siksha2/ui/main/restaurant/DailyRestaurantFragment.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.wafflestudio.siksha2.databinding.FragmentDailyRestaurantBinding
1616
import com.wafflestudio.siksha2.models.MealsOfDay
1717
import com.wafflestudio.siksha2.ui.main.MainFragmentDirections
1818
import com.wafflestudio.siksha2.ui.restaurantInfo.RestaurantInfoBottomSheet
19+
import com.wafflestudio.siksha2.utils.KakaoLinkHelper
1920
import com.wafflestudio.siksha2.utils.toPrettyString
2021
import com.wafflestudio.siksha2.utils.setVisibleOrGone
2122
import com.wafflestudio.siksha2.utils.showToast
@@ -161,6 +162,26 @@ class DailyRestaurantFragment : Fragment() {
161162
vm.dateFilter.value == LocalDate.now()
162163
)
163164
findNavController().navigate(action)
165+
},
166+
onMenuGroupShareClickListener = { menuGroupId ->
167+
viewLifecycleOwner.lifecycleScope.launch {
168+
val menuGroup = vm.getMenuGroupById(menuGroupId)
169+
val shareDate = vm.dateFilter.value ?: LocalDate.now()
170+
171+
if (menuGroup != null) {
172+
val menuData = menuGroup.menus.take(5).map {
173+
(it.nameKr ?: "메뉴 이름 없음") to (it.price?.toString() ?: "가격 없음")
174+
}
175+
KakaoLinkHelper.shareMenuWithTemplate(
176+
requireContext(),
177+
menuData,
178+
menuGroup.nameKr ?: "식당 이름 없음",
179+
shareDate
180+
)
181+
} else {
182+
showToast("해당 메뉴 그룹을 찾을 수 없습니다.", Toast.LENGTH_SHORT)
183+
}
184+
}
164185
}
165186
)
166187

app/src/main/java/com/wafflestudio/siksha2/ui/main/restaurant/DailyRestaurantViewModel.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
1414
import kotlinx.coroutines.flow.Flow
1515
import kotlinx.coroutines.flow.combine
1616
import kotlinx.coroutines.flow.conflate
17+
import kotlinx.coroutines.flow.firstOrNull
1718
import kotlinx.coroutines.flow.flatMapLatest
1819
import kotlinx.coroutines.flow.map
1920
import kotlinx.coroutines.launch
@@ -148,4 +149,10 @@ class DailyRestaurantViewModel @Inject constructor(
148149
suspend fun getRestaurantInfo(id: Long): RestaurantInfo? {
149150
return restaurantRepository.getRestaurantById(id)
150151
}
152+
153+
suspend fun getMenuGroupById(menuGroupId: Long): MenuGroup? {
154+
return getFilteredMenuGroups(false)
155+
.map { menuGroups -> menuGroups.find { it.id == menuGroupId } }
156+
.firstOrNull()
157+
}
151158
}

app/src/main/java/com/wafflestudio/siksha2/ui/main/restaurant/MenuGroupAdapter.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ class MenuGroupAdapter(
1515
private val onMenuGroupInfoClickListener: (Long) -> Unit,
1616
private val onMenuGroupToggleFavoriteClickListener: (Long) -> Unit,
1717
private val onMenuItemToggleLikeClickListener: (menuId: Long, isCurrentlyLiked: Boolean) -> Unit,
18-
private val onMenuItemClickListener: (Long) -> Unit
18+
private val onMenuItemClickListener: (Long) -> Unit,
19+
private val onMenuGroupShareClickListener: (Long) -> Unit
1920
) : ListAdapter<MenuGroup, MenuGroupAdapter.MenuGroupViewHolder>(diffCallback) {
2021
private lateinit var recyclerView: RecyclerView
2122

@@ -48,6 +49,9 @@ class MenuGroupAdapter(
4849
onMenuGroupToggleFavoriteClickListener.invoke(menuGroup.id)
4950
}
5051
favoriteToggle.isSelected = menuGroup.isFavorite
52+
shareButton.setOnClickListener {
53+
onMenuGroupShareClickListener.invoke(menuGroup.id)
54+
}
5155

5256
menuList.setVisibleOrGone(menuGroup.menus.isEmpty().not())
5357
menuEmpty.setVisibleOrGone(menuGroup.menus.isEmpty())
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.wafflestudio.siksha2.utils
2+
3+
import android.content.Context
4+
import android.widget.Toast
5+
import com.kakao.sdk.share.ShareClient
6+
import java.time.LocalDate
7+
8+
object KakaoLinkHelper {
9+
fun shareMenuWithTemplate(
10+
context: Context,
11+
menuData: List<Pair<String, String?>>?,
12+
restaurantName: String,
13+
shareDate: LocalDate
14+
) {
15+
val templateId: Long = 113344
16+
val templateArgs = mutableMapOf<String, String>()
17+
18+
val today = LocalDate.now()
19+
templateArgs["date"] = if (shareDate == today) {
20+
"오늘"
21+
} else {
22+
"${shareDate.year}-${shareDate.monthValue}-${shareDate.dayOfMonth}"
23+
}
24+
templateArgs["restaurant"] = restaurantName
25+
26+
menuData?.forEachIndexed { index, menu ->
27+
templateArgs["menu${index + 1}"] = menu.first
28+
templateArgs["price${index + 1}"] = if (menu.second?.toIntOrNull() != null) {
29+
"${menu.second}"
30+
} else {
31+
"-"
32+
}
33+
}
34+
35+
Toast.makeText(context, "식단을 공유합니다.", Toast.LENGTH_SHORT).show()
36+
37+
if (ShareClient.instance.isKakaoTalkSharingAvailable(context)) {
38+
ShareClient.instance.shareCustom(context, templateId, templateArgs) { sharingResult, error ->
39+
if (error != null) {
40+
Toast.makeText(context, "공유에 실패했습니다: ${error.message}", Toast.LENGTH_SHORT).show()
41+
} else if (sharingResult != null) {
42+
context.startActivity(sharingResult.intent)
43+
}
44+
}
45+
} else {
46+
Toast.makeText(context, "카카오톡이 설치되어 있지 않습니다.", Toast.LENGTH_SHORT).show()
47+
}
48+
}
49+
}

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,7 @@
103103
<string name="version_text">siksha-%s</string>
104104
<string name="image_viewer_current_page">%1$d/%2$d</string>
105105
<string name="nickname_hint">닉네임을 입력하세요</string>
106+
<string name="kakao_app_key">efa8f59f5de6e39bb0977d2e1ee505d7</string>
107+
<string name="kakao_scheme">kakaoefa8f59f5de6e39bb0977d2e1ee505d7</string>
108+
<string name="kakaolink_host">kakaolink</string>
106109
</resources>

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip

0 commit comments

Comments
 (0)