Skip to content

Commit

Permalink
release: 0.0.3(3) 버전 배포
Browse files Browse the repository at this point in the history
release: 0.0.3(3) 버전 배포
  • Loading branch information
ZZANZU authored May 1, 2023
2 parents 5ce1139 + 4dd1f20 commit d0e2c85
Show file tree
Hide file tree
Showing 12 changed files with 240 additions and 88 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ android {
applicationId "com.woozoo.menumonya"
minSdk 24
targetSdk 33
versionCode 2
versionName "0.0.2"
versionCode 3
versionName "0.0.3"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/java/com/woozoo/menumonya/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.woozoo.menumonya

import android.app.Application
import android.content.Context
import com.woozoo.menumonya.repository.FireStoreRepository
import com.woozoo.menumonya.repository.RemoteConfigRepository

class Application: Application() {

Expand All @@ -16,4 +18,12 @@ class Application: Application() {
return instance!!.applicationContext
}
}

override fun onCreate() {
super.onCreate()

// 종속 관계 때문에 초기화 순서 중요함
RemoteConfigRepository.initialize()
FireStoreRepository.initialize()
}
}
2 changes: 1 addition & 1 deletion app/src/main/java/com/woozoo/menumonya/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ class Constants {
val GLIDE_IMAGE_SIZE_WIDTH = 100
val GLIDE_IMAGE_SIZE_HEIGHT = 100

val FEEDBACK_URL = "https://forms.gle/Emcodxf3ngNqLCHs7"
val REMOTE_CONFIG_FETCH_INTERVAL: Long = 60 * 1 // 1분마다 업데이트 함
}
}
31 changes: 17 additions & 14 deletions app/src/main/java/com/woozoo/menumonya/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.Manifest
import android.content.Intent
import android.content.Intent.ACTION_VIEW
import android.content.pm.PackageManager
import android.net.Ur
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.View
Expand All @@ -15,7 +15,6 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
import com.woozoo.menumonya.Constants.Companion.FEEDBACK_URL
import com.woozoo.menumonya.MainViewModel.Event
import com.woozoo.menumonya.databinding.ActivityMainBinding
import com.woozoo.menumonya.util.PermissionUtils.Companion.ACCESS_FINE_LOCATION_REQUEST_CODE
Expand Down Expand Up @@ -86,17 +85,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {

binding.naverMap.onCreate(savedInstanceState)

viewModel.initializeMapView(binding.naverMap, this)
}

private fun updatePagerHeightForChild(view: View, pager: ViewPager2) {
view.post {
val wMeasureSpec = View.MeasureSpec.makeMeasureSpec(view.width, View.MeasureSpec.EXACTLY)
val hMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
view.measure(wMeasureSpec, hMeasureSpec)
pager.layoutParams = (pager.layoutParams).also { lp -> lp.height = view.measuredHeight }
pager.invalidate()
}
viewModel.initializeMapView(binding.naverMap)
}

private fun handleEvent(event: Event) = when (event) {
Expand Down Expand Up @@ -137,6 +126,11 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
}
}.create().show()
}
is Event.MoveToCurrentLocation -> {
binding.currentLocationBtn.background = resources.getDrawable(R.drawable.current_location_button_selected)
binding.currentLocationTv.setTextColor(resources.getColor(R.color.colorSecondary))
binding.currentLocationIv.setColorFilter(resources.getColor(R.color.colorSecondary))
}
}

override fun onStart() {
Expand Down Expand Up @@ -185,6 +179,10 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
binding.locationYsBtn.background = applicationContext.getDrawable(R.drawable.white_button_background)
binding.locationGnBtn.setTextColor(applicationContext.getColor(R.color.white))
binding.locationYsBtn.setTextColor(applicationContext.getColor(R.color.gray600))

binding.currentLocationBtn.background = resources.getDrawable(R.drawable.current_location_button)
binding.currentLocationTv.setTextColor(resources.getColor(R.color.colorPrimary))
binding.currentLocationIv.setColorFilter(resources.getColor(R.color.colorPrimary))
}
R.id.location_ys_btn -> {
viewPager.invalidate()
Expand All @@ -195,9 +193,14 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
binding.locationGnBtn.background = applicationContext.getDrawable(R.drawable.white_button_background)
binding.locationYsBtn.setTextColor(applicationContext.getColor(R.color.white))
binding.locationGnBtn.setTextColor(applicationContext.getColor(R.color.gray600))

binding.currentLocationBtn.background = resources.getDrawable(R.drawable.current_location_button)
binding.currentLocationTv.setTextColor(resources.getColor(R.color.colorPrimary))
binding.currentLocationIv.setColorFilter(resources.getColor(R.color.colorPrimary))
}
R.id.feedback_iv -> {
val intent = Intent(ACTION_VIEW, Uri.parse(FEEDBACK_URL))
val feedbackUrl = viewModel.getFeedbackUrl()
val intent = Intent(ACTION_VIEW, Uri.parse(feedbackUrl))
startActivity(intent)
}
// '내 주변' 버튼 클릭
Expand Down
84 changes: 16 additions & 68 deletions app/src/main/java/com/woozoo/menumonya/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ import android.location.LocationListener
import android.location.LocationManager
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.firestore.ktx.toObject
import com.google.firebase.ktx.Firebase
import com.naver.maps.geometry.LatLng
import com.naver.maps.map.*
import com.naver.maps.map.overlay.Marker
Expand All @@ -21,19 +18,15 @@ import com.woozoo.menumonya.Constants.Companion.LATLNG_GN
import com.woozoo.menumonya.Constants.Companion.LATLNG_YS
import com.woozoo.menumonya.Constants.Companion.MAP_DEFAULT_ZOOM
import com.woozoo.menumonya.Constants.Companion.MAP_MIN_ZOOM
import com.woozoo.menumonya.model.Menu
import com.woozoo.menumonya.model.Restaurant
import com.woozoo.menumonya.util.DateUtils.Companion.getTodayDate
import com.woozoo.menumonya.repository.FireStoreRepository
import com.woozoo.menumonya.repository.RemoteConfigRepository
import com.woozoo.menumonya.util.LocationUtils.Companion.requestLocationUpdateOnce
import com.woozoo.menumonya.util.PermissionUtils.Companion.isGpsPermissionAllowed

import com.woozoo.menumonya.util.PermissionUtils.Companion.isLocationPermissionAllowed
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.async
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.tasks.await
import java.lang.Double.parseDouble

class MainViewModel(application: Application): AndroidViewModel(Application()) {
Expand All @@ -45,6 +38,9 @@ class MainViewModel(application: Application): AndroidViewModel(Application()) {
lateinit var naverMap: NaverMap
private var locationManager: LocationManager

private var firestoreRepository = FireStoreRepository.get()
private var remoteConfigRepository = RemoteConfigRepository.get()

private var mRestaurantInfoArray: ArrayList<Restaurant> = ArrayList()
private var markerList: ArrayList<Marker> = ArrayList()
private var selectedLocation: String = ""
Expand All @@ -60,13 +56,9 @@ class MainViewModel(application: Application): AndroidViewModel(Application()) {
}

@SuppressLint("MissingPermission")
fun initializeMapView(mapView: MapView, activity: Activity) {
fun initializeMapView(mapView: MapView) {
mapView.getMapAsync {
naverMap = it.apply {
// locationSource = FusedLocationSource(
// activity,
// LOCATION_PERMISSION_REQUEST_CODE
// )
locationTrackingMode = LocationTrackingMode.NoFollow
uiSettings.apply {
isLocationButtonEnabled = false
Expand Down Expand Up @@ -122,59 +114,6 @@ class MainViewModel(application: Application): AndroidViewModel(Application()) {
naverMap.moveCamera(CameraUpdate.withParams(cameraUpdateParams))
}

suspend fun getTodayRestaurantInfoAsync(location: String): Deferred<ArrayList<Restaurant>> {
return viewModelScope.async {
val restaurantInfo = ArrayList<Restaurant>()
val db = Firebase.firestore
val restaurantRef = db.collection("restaurants")
val query = restaurantRef.whereArrayContainsAny("locationCategory", listOf(location))

val result = query.get().await()
val documents = result.documents

for (document in documents) {
val restaurant = document.toObject<Restaurant>()

if (restaurant != null) {
// 메뉴 정보 조회
val menu = getMenuAsync(document.id)?.await()

val todayMenu = menu?.date?.get(getTodayDate())
if (todayMenu != null) restaurant.todayMenu = todayMenu

restaurantInfo.add(restaurant)
}
}

// locationCategoryOrder값으로 순서 재정렬(가까운 블록에 위치한 순서대로)
for (restaurant in restaurantInfo) {
restaurant.locationCategoryOrder.removeAll { !it.contains(location) }
}
restaurantInfo.sortBy { it.locationCategoryOrder[0] }

restaurantInfo
}
}

suspend fun getMenuAsync(restaurantId: String): Deferred<Menu>? {
return viewModelScope.async {
var menu = Menu()

val db = Firebase.firestore
val menuRef = db.collection("menus")
val query = menuRef.whereEqualTo("restaurantId", restaurantId)

val result = query.get().await()
val documents = result.documents

if (documents.size > 0) {
menu = documents[0].toObject<Menu>()!!
}

menu
}
}

/**
* 하단의 식당 정보 가로 스크롤 뷰를 표시함.
* - (중요) 지도에 마커를 표시하기 위한 식당 정보를 이미 fetch하였다는 전제 하에 작동함.
Expand All @@ -194,7 +133,7 @@ class MainViewModel(application: Application): AndroidViewModel(Application()) {
"역삼" -> moveCameraCoord(LATLNG_YS.latitude, LATLNG_YS.longitude)
}

mRestaurantInfoArray = getTodayRestaurantInfoAsync(selectedLocation).await() // TODO: 정렬 안돼있음
mRestaurantInfoArray = firestoreRepository.getRestaurantInLocation(location)

setMarkers(mRestaurantInfoArray)
}
Expand Down Expand Up @@ -257,11 +196,16 @@ class MainViewModel(application: Application): AndroidViewModel(Application()) {
locationSource = FusedLocationSource(activity, LOCATION_PERMISSION_REQUEST_CODE)
locationTrackingMode = LocationTrackingMode.Follow
}
moveToCurrentLocation()
})
}
}
}

fun getFeedbackUrl(): String {
return remoteConfigRepository.getFeedbackUrl()
}

private fun showToast(text: String) {
event(Event.ShowToast(text))
}
Expand All @@ -281,6 +225,9 @@ class MainViewModel(application: Application): AndroidViewModel(Application()) {
private fun showGpsPermissionAlert() {
event(Event.ShowGpsPermissionAlert(""))
}
private fun moveToCurrentLocation() {
event(Event.MoveToCurrentLocation(""))
}

sealed class Event {
/**
Expand All @@ -293,5 +240,6 @@ class MainViewModel(application: Application): AndroidViewModel(Application()) {
data class OnMarkerClicked(val markerIndex: Int, val location: String): Event()
data class RequestLocationPermission(val data: String): Event()
data class ShowGpsPermissionAlert(val data: String): Event()
data class MoveToCurrentLocation(val data: String): Event()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package com.woozoo.menumonya.repository

import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.firestore.ktx.toObject
import com.google.firebase.ktx.Firebase
import com.woozoo.menumonya.model.Menu
import com.woozoo.menumonya.model.Restaurant
import com.woozoo.menumonya.util.DateUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.tasks.await
import kotlinx.coroutines.withContext

class FireStoreRepository {
private val db = Firebase.firestore
private var remoteConfigRepository = RemoteConfigRepository.get()

private lateinit var restaurantCollectionName: String
private lateinit var menuCollectionName: String

companion object {
private var instance: FireStoreRepository? = null

fun initialize() {
if (instance == null) {
instance = FireStoreRepository()
}
}

fun get(): FireStoreRepository {
return instance ?: throw java.lang.IllegalStateException("FireStoreRepository must be initialized")
}
}

suspend fun getRestaurantInLocation(location: String) = withContext(Dispatchers.IO) {
restaurantCollectionName = remoteConfigRepository.getRestaurantsCollectionName()

val restaurantInfo = ArrayList<Restaurant>()
val restaurantRef = db.collection(restaurantCollectionName)
val query = restaurantRef.whereArrayContainsAny("locationCategory", listOf(location))

val result = query.get().await()
val documents = result.documents

for (document in documents) {
val restaurant = document.toObject<Restaurant>()

if (restaurant != null) {
// 메뉴 정보 조회
val menu = getMenu(document.id)

val todayMenu = menu.date.get(DateUtils.getTodayDate())
if (todayMenu != null) restaurant.todayMenu = todayMenu

restaurantInfo.add(restaurant)
}
}

// locationCategoryOrder값으로 순서 재정렬(가까운 블록에 위치한 순서대로)
for (restaurant in restaurantInfo) {
restaurant.locationCategoryOrder.removeAll { !it.contains(location) }
}
restaurantInfo.sortBy { it.locationCategoryOrder[0] }

restaurantInfo
}

suspend fun getMenu(restaurantId: String) = withContext(Dispatchers.IO) {
menuCollectionName = remoteConfigRepository.getMenuCollectionName()

var menu = Menu()

val menuRef = db.collection(menuCollectionName)
val query = menuRef.whereEqualTo("restaurantId", restaurantId)

val result = query.get().await()
val documents = result.documents

if (documents.size > 0) {
menu = documents[0].toObject<Menu>()!!
}

menu
}
}
Loading

0 comments on commit d0e2c85

Please sign in to comment.