Skip to content

Commit 5ce1139

Browse files
authored
release: 0.0.2(2) 버전 배포
release: 0.0.2(2) 버전 배포
2 parents 6019a97 + 8902f66 commit 5ce1139

32 files changed

+1033
-234
lines changed

app/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
/build
1+
/build
2+
/release

app/build.gradle

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ android {
1616
applicationId "com.woozoo.menumonya"
1717
minSdk 24
1818
targetSdk 33
19-
versionCode 1
20-
versionName "0.0.1"
19+
versionCode 2
20+
versionName "0.0.2"
2121

2222
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2323
}
@@ -26,11 +26,13 @@ android {
2626
debug {
2727
applicationIdSuffix ".debug"
2828
resValue "string", "NAVER_CLIENT_ID", localProperties['NAVER_CLIENT_ID']
29+
manifestPlaceholders = [app_name: "@string/app_name_debug"]
2930
}
3031
release {
3132
minifyEnabled false
3233
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
3334
resValue "string", "NAVER_CLIENT_ID", localProperties['NAVER_CLIENT_ID']
35+
manifestPlaceholders = [app_name: "@string/app_name"]
3436
}
3537
}
3638
compileOptions {

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
android:dataExtractionRules="@xml/data_extraction_rules"
1313
android:fullBackupContent="@xml/backup_rules"
1414
android:icon="@mipmap/logo"
15-
android:label="@string/app_name"
15+
android:label="${app_name}"
1616
android:networkSecurityConfig="@xml/network_security_config"
1717
android:supportsRtl="true"
1818
android:theme="@style/Theme.MenuMonya"

app/src/main/java/com/woozoo/menumonya/Constants.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,7 @@ class Constants {
1111

1212
val GLIDE_IMAGE_SIZE_WIDTH = 100
1313
val GLIDE_IMAGE_SIZE_HEIGHT = 100
14+
15+
val FEEDBACK_URL = "https://forms.gle/Emcodxf3ngNqLCHs7"
1416
}
1517
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.woozoo.menumonya
2+
3+
import android.app.Dialog
4+
import android.content.Context
5+
import android.graphics.Color
6+
import android.graphics.Typeface
7+
import android.graphics.drawable.ColorDrawable
8+
import android.os.Bundle
9+
import android.text.Spannable
10+
import android.text.SpannableStringBuilder
11+
import android.text.style.ForegroundColorSpan
12+
import android.text.style.StyleSpan
13+
import android.text.style.UnderlineSpan
14+
import android.view.Gravity.BOTTOM
15+
import android.view.View
16+
import android.view.View.OnClickListener
17+
import com.woozoo.menumonya.databinding.DialogLocationPermissionBinding
18+
19+
class LocationPermissionDialog(context: Context, private val listener: OnClickListener)
20+
: Dialog(context), OnClickListener {
21+
private lateinit var binding: DialogLocationPermissionBinding
22+
23+
override fun onCreate(savedInstanceState: Bundle?) {
24+
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) // xml의 background 적용되도록 함.
25+
window?.setGravity(BOTTOM) // 다이얼로그가 하단에 표시되도록 설정
26+
27+
super.onCreate(savedInstanceState)
28+
binding = DialogLocationPermissionBinding.inflate(layoutInflater)
29+
setContentView(binding.root)
30+
31+
binding.permissionDescriptionTv.text = getSpannableText()
32+
33+
binding.negativeBtn.setOnClickListener(this)
34+
binding.positiveBtn.setOnClickListener(listener)
35+
}
36+
37+
override fun onClick(v: View?) {
38+
when (v?.id) {
39+
R.id.negative_btn -> {
40+
dismiss()
41+
}
42+
}
43+
}
44+
45+
/**
46+
* 위치 권한 다이얼로그의 '위치 서비스 사용' 텍스트에 스타일 적용
47+
* - (주의) 텍스트 내용 수정시 setSpan()의 start, end 값도 수정해줘야 함.
48+
*/
49+
private fun getSpannableText(): SpannableStringBuilder {
50+
val locationPermissionString =
51+
context.resources.getString(R.string.location_permission_dialog_description)
52+
val spannable = SpannableStringBuilder(locationPermissionString)
53+
54+
val spans = listOf(
55+
ForegroundColorSpan(context.resources.getColor(R.color.colorPrimary)),
56+
UnderlineSpan(),
57+
StyleSpan(Typeface.BOLD)
58+
)
59+
60+
for (span in spans) {
61+
spannable.setSpan(
62+
span,
63+
14,
64+
23,
65+
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
66+
)
67+
}
68+
69+
return spannable
70+
}
71+
}

app/src/main/java/com/woozoo/menumonya/MainActivity.kt

Lines changed: 60 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.woozoo.menumonya
22

3+
import android.Manifest
34
import android.content.Intent
5+
import android.content.Intent.ACTION_VIEW
46
import android.content.pm.PackageManager
7+
import android.net.Ur
58
import android.os.Bundle
69
import android.provider.Settings
710
import android.view.View
@@ -12,6 +15,7 @@ import androidx.appcompat.app.AppCompatActivity
1215
import androidx.recyclerview.widget.RecyclerView
1316
import androidx.viewpager2.widget.ViewPager2
1417
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
18+
import com.woozoo.menumonya.Constants.Companion.FEEDBACK_URL
1519
import com.woozoo.menumonya.MainViewModel.Event
1620
import com.woozoo.menumonya.databinding.ActivityMainBinding
1721
import com.woozoo.menumonya.util.PermissionUtils.Companion.ACCESS_FINE_LOCATION_REQUEST_CODE
@@ -24,6 +28,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
2428
private lateinit var binding: ActivityMainBinding
2529

2630
private lateinit var viewPager: ViewPager2
31+
private lateinit var locationPermissionDialog: LocationPermissionDialog
2732

2833
override fun onCreate(savedInstanceState: Bundle?) {
2934
super.onCreate(savedInstanceState)
@@ -36,10 +41,11 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
3641
viewModel.eventFlow.collect { event -> handleEvent(event) }
3742
}
3843

39-
binding.locationGnBtn.background = applicationContext.getDrawable(R.drawable.selector_location_button_selected)
44+
binding.locationGnBtn.background = applicationContext.getDrawable(R.drawable.color_button_background)
4045
binding.locationGnBtn.setTextColor(applicationContext.getColor(R.color.white))
4146
binding.locationGnBtn.setOnClickListener(this)
4247
binding.locationYsBtn.setOnClickListener(this)
48+
binding.feedbackIv.setOnClickListener(this)
4349
binding.currentLocationBtn.setOnClickListener(this)
4450

4551
// 좌우로 item이 보이도록 설정
@@ -54,12 +60,25 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
5460
viewPager.setPageTransformer { page, position ->
5561
val offset = position * -(2 * offsetPx + pageMarginPx)
5662
page.translationX = offset // offset 만큼 왼쪽으로 이동시킴
57-
58-
updatePagerHeightForChild(page, viewPager)
5963
}
6064

6165
registerOnPageChangeCallback(object: OnPageChangeCallback() {
6266
override fun onPageSelected(position: Int) {
67+
// height를 wrap_content가 되도록 설정
68+
val view = (getChildAt(0) as RecyclerView).layoutManager?.findViewByPosition(position)
69+
view?.post {
70+
val wMeasureSpec =
71+
View.MeasureSpec.makeMeasureSpec(view.width, View.MeasureSpec.EXACTLY)
72+
val hMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
73+
view.measure(wMeasureSpec, hMeasureSpec)
74+
if (getChildAt(0).layoutParams.height != view.measuredHeight) {
75+
getChildAt(0).layoutParams = (getChildAt(0).layoutParams).also { lp ->
76+
lp.height = view.measuredHeight
77+
}
78+
}
79+
}
80+
81+
// 마커로 카메라 이동
6382
viewModel.moveCameraToMarker(position)
6483
}
6584
})
@@ -91,28 +110,32 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
91110
}
92111
is Event.ShowRestaurantView -> {
93112
if (viewPager.adapter == null) {
94-
viewPager.adapter = RestaurantAdapter(event.data)
113+
viewPager.adapter = RestaurantAdapter(event.data, this)
95114
if (event.markerIndex != -1) {
96115
viewPager.currentItem = event.markerIndex
97116
} else { }
98117
} else { }
99118
}
100119
is Event.RequestLocationPermission -> {
101-
requestLocationPermission(this)
120+
locationPermissionDialog = LocationPermissionDialog(this) {
121+
requestLocationPermission(this)
122+
locationPermissionDialog.dismiss()
123+
}
124+
locationPermissionDialog.show()
102125
}
103126
is Event.ShowGpsPermissionAlert -> {
104-
val builder = AlertDialog.Builder(this)
105-
builder.setMessage("현재 위치를 찾을 수 없습니다.\n위치 서비스를 켜주세요.")
106-
builder.setCancelable(true)
107-
builder.setNegativeButton("취소") { dialog, which ->
108-
dialog.dismiss()
109-
}
110-
builder.setPositiveButton("확인") { dialog, which ->
111-
val gpsPermissionIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
112-
startActivityForResult(gpsPermissionIntent, GPS_ENABLE_REQUEST_CODE)
113-
dialog.dismiss()
114-
}
115-
builder.create().show()
127+
AlertDialog.Builder(this).apply {
128+
setMessage("현재 위치를 찾을 수 없습니다.\n위치 서비스를 켜주세요.")
129+
setCancelable(true)
130+
setNegativeButton("취소") { dialog, which ->
131+
dialog.dismiss()
132+
}
133+
setPositiveButton("확인") { dialog, which ->
134+
val gpsPermissionIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
135+
startActivityForResult(gpsPermissionIntent, GPS_ENABLE_REQUEST_CODE)
136+
dialog.dismiss()
137+
}
138+
}.create().show()
116139
}
117140
}
118141

@@ -157,20 +180,27 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
157180
viewPager.invalidate()
158181
viewPager.adapter = null
159182
viewModel.showLocationInfo("강남")
160-
binding.locationGnBtn.background = applicationContext.getDrawable(R.drawable.selector_location_button_selected)
161-
binding.locationYsBtn.background = applicationContext.getDrawable(R.drawable.selector_location_button)
183+
184+
binding.locationGnBtn.background = applicationContext.getDrawable(R.drawable.color_button_background)
185+
binding.locationYsBtn.background = applicationContext.getDrawable(R.drawable.white_button_background)
162186
binding.locationGnBtn.setTextColor(applicationContext.getColor(R.color.white))
163187
binding.locationYsBtn.setTextColor(applicationContext.getColor(R.color.gray600))
164188
}
165189
R.id.location_ys_btn -> {
166190
viewPager.invalidate()
167191
viewPager.adapter = null
168192
viewModel.showLocationInfo("역삼")
169-
binding.locationYsBtn.background = applicationContext.getDrawable(R.drawable.selector_location_button_selected)
170-
binding.locationGnBtn.background = applicationContext.getDrawable(R.drawable.selector_location_button)
193+
194+
binding.locationYsBtn.background = applicationContext.getDrawable(R.drawable.color_button_background)
195+
binding.locationGnBtn.background = applicationContext.getDrawable(R.drawable.white_button_background)
171196
binding.locationYsBtn.setTextColor(applicationContext.getColor(R.color.white))
172197
binding.locationGnBtn.setTextColor(applicationContext.getColor(R.color.gray600))
173198
}
199+
R.id.feedback_iv -> {
200+
val intent = Intent(ACTION_VIEW, Uri.parse(FEEDBACK_URL))
201+
startActivity(intent)
202+
}
203+
// '내 주변' 버튼 클릭
174204
R.id.current_location_btn -> {
175205
viewModel.getCurrentLocation(this)
176206
}
@@ -180,10 +210,18 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
180210
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
181211
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
182212
if (requestCode == ACCESS_FINE_LOCATION_REQUEST_CODE) {
213+
// (1) 권한 허용 여부 체크
183214
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
184215
viewModel.getCurrentLocation(this)
185216
} else {
186-
Toast.makeText(this, "위치 권한을 허용해주세요", Toast.LENGTH_SHORT).show()
217+
// (2) '다시는 보지 않음' 클릭 여부 체크
218+
if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {
219+
Toast.makeText(this, R.string.location_permission_denied_toast,
220+
Toast.LENGTH_SHORT).show()
221+
} else {
222+
Toast.makeText(this, R.string.location_permission_denied_forever_toast,
223+
Toast.LENGTH_SHORT).show()
224+
}
187225
}
188226
}
189227
}

0 commit comments

Comments
 (0)