diff --git a/README.md b/README.md index 64c3bb5d..d61e4360 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ -# android-map-location \ No newline at end of file +# android-map-location +## step1 기능 목록 +1. 저장된 검색어 목록에 기능 추가하기 + - 저장된 검색어 중 하나를 선택하면 해당 검색어의 검색 결과 목록이 표시된다. +2. 검색 결과 목록에 기능 추가하기 + - 검색 결과 목록 중 하나의 항목을 선택하면 해당 항목의 위치를 지도에 표시한다. +3. 마지막 위치 저장하기 + - 앱 종료 시 마지막 위치를 SharedPreference 저장하여 다시 앱 실행 시 해당 위치로 포커스 한다. +4. 에러 처리하기 + - 카카오지도 onMapError() 호출 시 에러 화면을 보여준다. "지도 인증을 실패했습니다. 다시 시도해주세요. '에러이름(에러코드): 에러메세지' \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/Location.kt b/app/src/main/java/campus/tech/kakao/map/model/Location.kt index 760ddd46..34bbe807 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/Location.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/Location.kt @@ -3,11 +3,13 @@ package campus.tech.kakao.map.model data class Location( val title: String, val address: String, - val category: String + val category: String, + val longitude: String, + val latitude: String ){ companion object { fun LocationDto.toLocation(): Location { - return Location(title, address, category) + return Location(title, address, category, x, y) } } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/SearchFromKeywordResponse.kt b/app/src/main/java/campus/tech/kakao/map/model/SearchFromKeywordResponse.kt index 1ea4b0c5..248ecf2b 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/SearchFromKeywordResponse.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/SearchFromKeywordResponse.kt @@ -13,5 +13,9 @@ data class LocationDto( @SerializedName("category_group_name") val category: String, @SerializedName("address_name") - val address: String + val address: String, + @SerializedName("x") + val x: String, + @SerializedName("y") + val y: String ) diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationLocalDataSource.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationLocalDataSource.kt index e55559a1..81312fa6 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationLocalDataSource.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationLocalDataSource.kt @@ -1,6 +1,7 @@ package campus.tech.kakao.map.model.datasource import android.content.ContentValues +import android.database.Cursor import android.util.Log import campus.tech.kakao.map.model.Contract.LocationEntry import campus.tech.kakao.map.model.Contract.SavedLocationEntry @@ -46,16 +47,21 @@ class LocationLocalDataSource(private val dbHelper : LocationDbHelper) { val results = mutableListOf() with(cursor) { while (moveToNext()) { - val title = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_TITLE)) - val address = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_ADDRESS)) - val category = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_CATEGORY)) - results.add(Location(title, address, category)) + val location = getLocation() + results.add(location) } } cursor.close() return results } + private fun Cursor.getLocation(): Location { + val title = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_TITLE)) + val address = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_ADDRESS)) + val category = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_CATEGORY)) + return Location(title, address, category, "", "") + } + fun addSavedLocation(title: String): Long { val db = dbHelper.writableDatabase val values = ContentValues().apply { @@ -129,10 +135,8 @@ class LocationLocalDataSource(private val dbHelper : LocationDbHelper) { val results = mutableListOf() with(cursor) { while (moveToNext()) { - val title = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_TITLE)) - val address = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_ADDRESS)) - val category = getString(getColumnIndexOrThrow(LocationEntry.COLUMN_NAME_CATEGORY)) - results.add(Location(title, address, category)) + val location = getLocation() + results.add(location) } } cursor.close() diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/Coordinates.kt b/app/src/main/java/campus/tech/kakao/map/view/map/Coordinates.kt new file mode 100644 index 00000000..e8c8dad9 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/view/map/Coordinates.kt @@ -0,0 +1,3 @@ +package campus.tech.kakao.map.view.map + +data class Coordinates(val title: String, val longitude: Double, val latitude: Double, val address: String) \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt index e959b368..0fcfae3b 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt @@ -1,35 +1,61 @@ package campus.tech.kakao.map.view.map +import android.app.Activity import android.content.Intent +import android.content.SharedPreferences +import android.graphics.Color import android.os.Bundle import android.util.Log +import android.view.View import android.widget.EditText +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout import campus.tech.kakao.map.BuildConfig import campus.tech.kakao.map.R import campus.tech.kakao.map.view.search.MainActivity +import com.google.android.material.bottomsheet.BottomSheetBehavior import com.kakao.vectormap.KakaoMap import com.kakao.vectormap.KakaoMapReadyCallback import com.kakao.vectormap.KakaoMapSdk +import com.kakao.vectormap.LatLng import com.kakao.vectormap.MapLifeCycleCallback import com.kakao.vectormap.MapView +import com.kakao.vectormap.label.LabelOptions +import com.kakao.vectormap.label.LabelStyle +import com.kakao.vectormap.label.LabelStyles class MapActivity : AppCompatActivity() { - private lateinit var searchEditText: EditText - private lateinit var mapView: MapView + private val searchEditText by lazy { findViewById(R.id.SearchEditTextInMap) } + private val mapView by lazy { findViewById(R.id.map_view) } + private val bottomSheetLayout by lazy { findViewById(R.id.bottom_sheet_layout) } + private val bottom_sheet_title by lazy { findViewById(R.id.bottom_sheet_title) } + private val bottom_sheet_address by lazy { findViewById(R.id.bottom_sheet_address) } + private val errorMessageTextView by lazy { findViewById(R.id.errorMessageTextView) } + private val bottomSheetBehavior: BottomSheetBehavior by lazy { BottomSheetBehavior.from(bottomSheetLayout) } + + companion object{ + private val DEFAULT_LONGITUDE = 127.115587 + private val DEFAULT_LATITUDE = 37.406960 + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_map) - initViews() setupEditText() setupMapView() } - private fun initViews() { - searchEditText = findViewById(R.id.SearchEditTextInMap) - mapView = findViewById(R.id.map_view) + override fun onResume() { + super.onResume() + mapView.resume() // MapView 의 resume 호출 + } + + override fun onPause() { + super.onPause() + mapView.pause() // MapView 의 pause 호출 } private fun setupEditText() { @@ -43,19 +69,122 @@ class MapActivity : AppCompatActivity() { KakaoMapSdk.init(this, BuildConfig.KAKAO_API_KEY); mapView.start(object : MapLifeCycleCallback() { override fun onMapDestroy() { - // 지도 API 가 정상적으로 종료될 때 호출됨 Log.d("jieun", "onMapDestroy") } - override fun onMapError(error: Exception) { - // 인증 실패 및 지도 사용 중 에러가 발생할 때 호출됨 + override fun onMapError(error: Exception) { // 인증 실패 및 지도 사용 중 에러가 발생할 때 호출됨 Log.d("jieun", "onMapError" + error) + showErrorMessage(error) } }, object : KakaoMapReadyCallback() { - override fun onMapReady(kakaoMap: KakaoMap) { - // 인증 후 API 가 정상적으로 실행될 때 호출됨 - Log.d("jieun", "onMapReady") + val coordinates = getCoordinates() + override fun onMapReady(kakaoMap: KakaoMap) { // 인증 후 API 가 정상적으로 실행될 때 호출됨 + Log.d("jieun", "onMapReady coordinates: " + coordinates.toString()) + if (coordinates != null) { + showLabel(coordinates, kakaoMap) + showBottomSheet(coordinates) + setSharedData("pref", coordinates) +// Log.d("jieun", "onMapReady setSharedData: " + getSharedData("pref")) + } else{ + hideBottomSheet() + } + } + + override fun getPosition(): LatLng { +// Log.d("jieun", "getPosition coordinates: " + coordinates.toString()) + if (coordinates != null) { + return LatLng.from(coordinates.latitude, coordinates.longitude) + } else{ + return LatLng.from(DEFAULT_LATITUDE, DEFAULT_LONGITUDE) + } + } + }) } + + private fun showErrorMessage(error: Exception) { + runOnUiThread { + setContentView(R.layout.error_map) + errorMessageTextView.text = "지도 인증을 실패했습니다.\n다시 시도해주세요.\n\n" + error.message + } + } + + private fun showLabel( + coordinates: Coordinates, + kakaoMap: KakaoMap + ) { + val labelStyles: LabelStyles = LabelStyles.from( + LabelStyle.from(R.drawable.location_red_icon_resized).setZoomLevel(8), + LabelStyle.from(R.drawable.location_red_icon_resized) + .setTextStyles(32, Color.BLACK, 1, Color.GRAY).setZoomLevel(15) + ) + val position = LatLng.from(coordinates.latitude, coordinates.longitude) + kakaoMap.labelManager?.getLayer()?.addLabel( + LabelOptions.from(position) + .setStyles(labelStyles) + .setTexts(coordinates.title) + ) + } + + private fun hideBottomSheet() { + runOnUiThread { bottomSheetLayout.visibility = View.GONE } + } + + private fun showBottomSheet(coordinates: Coordinates) { + runOnUiThread { + bottomSheetLayout.visibility = View.VISIBLE + bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED + bottom_sheet_title.text = coordinates.title + bottom_sheet_address.text = coordinates.address + } + } + + private fun getCoordinates(): Coordinates? { + var coordinates = getCoordinatesByIntent() + if(coordinates == null) { + coordinates = getCoordinatedBySharedPreference("pref") + } + return coordinates + + } + + private fun getCoordinatesByIntent(): Coordinates? { + if (intent.hasExtra("title") && intent.hasExtra("longitude") + && intent.hasExtra("latitude") && intent.hasExtra("address")) { + val title = intent.getStringExtra("title").toString() + val longitudeString = intent.getStringExtra("longitude") + val latitudeString = intent.getStringExtra("latitude") + val address = intent.getStringExtra("address").toString() + if (longitudeString != null && latitudeString != null) { + val longitude = longitudeString.toDouble() + val latitude = latitudeString.toDouble() + return Coordinates(title, longitude, latitude, address) + } else return null + } else return null + } + + fun setSharedData(name: String, coordinates: Coordinates?) { + if (coordinates != null) { + var pref: SharedPreferences = getSharedPreferences(name, Activity.MODE_PRIVATE) + var editor: SharedPreferences.Editor = pref.edit() + editor.putString("longitude", coordinates.longitude.toString()) + editor.putString("latitude", coordinates.latitude.toString()) + editor.putString("title", coordinates.title.toString()) + editor.putString("address", coordinates.address.toString()) + editor.apply() + } + } + + fun getCoordinatedBySharedPreference(name: String): Coordinates? { + var pref: SharedPreferences = getSharedPreferences(name, Activity.MODE_PRIVATE) + if(pref.getString("title", "") == ""){ + return null + } + val title = pref.getString("title", "").toString() + val longitude = pref.getString("longitude", "").toString().toDouble() + val latitude = pref.getString("latitude", "").toString().toDouble() + val address = pref.getString("address", "").toString() + return Coordinates(title, longitude, latitude, address) + } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt index 8472b3be..0c494b82 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt @@ -32,7 +32,8 @@ class LocationAdapter( init { itemView.setOnClickListener { - itemSelectedListener.addSavedLocation(getItem(bindingAdapterPosition).title) + val location = getItem(bindingAdapterPosition) + itemSelectedListener.onLocationViewClicked(location.title, location.longitude, location.latitude, location.address) } } } diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index 56ab33f7..1cf41966 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -1,5 +1,6 @@ package campus.tech.kakao.map.view.search +import android.content.Intent import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -12,7 +13,6 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import campus.tech.kakao.map.BuildConfig import campus.tech.kakao.map.model.datasource.LocationLocalDataSource import campus.tech.kakao.map.model.datasource.LocationRemoteDataSource import campus.tech.kakao.map.R @@ -20,74 +20,58 @@ import campus.tech.kakao.map.model.SavedLocation import campus.tech.kakao.map.model.LocationDbHelper import campus.tech.kakao.map.model.repository.LocationRepository import campus.tech.kakao.map.model.repository.SavedLocationRepository +import campus.tech.kakao.map.view.map.MapActivity import campus.tech.kakao.map.viewmodel.ViewModelFactory.LocationViewModelFactory import campus.tech.kakao.map.viewmodel.ViewModelFactory.SavedLocationViewModelFactory import campus.tech.kakao.map.viewmodel.LocationViewModel import campus.tech.kakao.map.viewmodel.SavedLocationViewModel class MainActivity : AppCompatActivity(), OnItemSelectedListener { + private val locationViewModel: LocationViewModel by lazy { + ViewModelProvider(this, LocationViewModelFactory(locationRepository)) + .get(LocationViewModel::class.java) + } + private val locationAdapter: LocationAdapter by lazy { LocationAdapter(this) } + private val locationRecyclerView: RecyclerView by lazy { findViewById(R.id.locationRecyclerView) } - private lateinit var locationViewModel: LocationViewModel - private lateinit var locationAdapter: LocationAdapter - private lateinit var locationRecyclerView: RecyclerView + private val savedLocationViewModel: SavedLocationViewModel by lazy { + ViewModelProvider(this, SavedLocationViewModelFactory(savedLocationRepository)) + .get(SavedLocationViewModel::class.java) + } - private lateinit var savedLocationViewModel: SavedLocationViewModel - private lateinit var savedLocationAdapter: SavedLocationAdapter - private lateinit var savedLocationRecyclerView: RecyclerView + private val savedLocationAdapter: SavedLocationAdapter by lazy { SavedLocationAdapter(this) } + private val savedLocationRecyclerView: RecyclerView by lazy { + findViewById(R.id.savedLocationRecyclerView) + } - private lateinit var locationDbHelper: LocationDbHelper - private lateinit var locationLocalDataSource: LocationLocalDataSource - private lateinit var locationRemoteDataSource: LocationRemoteDataSource - private lateinit var locationRepository: LocationRepository - private lateinit var savedLocationRepository: SavedLocationRepository + private val locationDbHelper: LocationDbHelper by lazy { LocationDbHelper(this) } + private val locationLocalDataSource: LocationLocalDataSource by lazy { LocationLocalDataSource(locationDbHelper) } + private val locationRemoteDataSource: LocationRemoteDataSource by lazy { LocationRemoteDataSource() } + private val locationRepository: LocationRepository by lazy { LocationRepository(locationLocalDataSource, locationRemoteDataSource) } + private val savedLocationRepository: SavedLocationRepository by lazy { SavedLocationRepository(locationLocalDataSource) } - private lateinit var clearButton: ImageView - private lateinit var searchEditText: EditText - private lateinit var noResultTextView: TextView + private val clearButton: ImageView by lazy { findViewById(R.id.clearButton) } + private val searchEditText: EditText by lazy { findViewById(R.id.SearchEditTextInMain) } + private val noResultTextView: TextView by lazy { findViewById(R.id.NoResultTextView) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - initViews() setupSearchEditText() setupClearButton() setupViewModels() setupRecyclerViews() } - private fun initViews() { - locationDbHelper = LocationDbHelper(this) - locationLocalDataSource = LocationLocalDataSource(locationDbHelper) - locationRemoteDataSource = LocationRemoteDataSource() - locationRepository = LocationRepository(locationLocalDataSource, locationRemoteDataSource) - savedLocationRepository = SavedLocationRepository(locationLocalDataSource) - - locationViewModel = ViewModelProvider(this, LocationViewModelFactory(locationRepository)) - .get(LocationViewModel::class.java) - locationRecyclerView = findViewById(R.id.locationRecyclerView) - - savedLocationViewModel = ViewModelProvider(this, SavedLocationViewModelFactory(savedLocationRepository)) - .get(SavedLocationViewModel::class.java) - savedLocationRecyclerView = findViewById(R.id.savedLocationRecyclerView) - - clearButton = findViewById(R.id.clearButton) - searchEditText = findViewById(R.id.SearchEditTextInMain) - noResultTextView = findViewById(R.id.NoResultTextView) - } - private fun setupSearchEditText() { searchEditText.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val query = s.toString() - locationViewModel.searchLocationsFromKakaoAPI(query) {searchLocationsSize -> - if (searchLocationsSize > 0) { - noResultTextView.visibility = View.GONE - } else { - noResultTextView.visibility = View.VISIBLE - } + locationViewModel.searchLocationsFromKakaoAPI(query) { searchLocationsSize -> + handleNoResultMessage(searchLocationsSize) } } @@ -128,21 +112,46 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { } private fun setupRecyclerViews() { - locationAdapter = LocationAdapter(this) locationRecyclerView.layoutManager = LinearLayoutManager(this) locationRecyclerView.adapter = locationAdapter - savedLocationAdapter = SavedLocationAdapter(this) savedLocationRecyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) savedLocationRecyclerView.adapter = savedLocationAdapter } - override fun addSavedLocation(title: String) { + override fun onLocationViewClicked(title: String, longitude: String, latitude: String, address:String) { savedLocationViewModel.addSavedLocation(title) + + val intent = Intent(this@MainActivity, MapActivity::class.java) + intent.putExtra("title", title) + intent.putExtra("longitude", longitude) + intent.putExtra("latitude", latitude) + intent.putExtra("address", address) + startActivity(intent) } - override fun deleteSavedLocation(item: SavedLocation) { + override fun onSavedLocationXButtonClicked(item: SavedLocation) { savedLocationViewModel.deleteSavedLocation(item) } + + override fun onSavedLocationViewClicked(title: String) { + updateEditText(title) + locationViewModel.searchLocationsFromKakaoAPI(title){ searchLocationsSize -> + handleNoResultMessage(searchLocationsSize) + } + } + + private fun updateEditText(title: String) { + searchEditText.setText(title) + searchEditText.setSelection(searchEditText.text.length) + } + + private fun handleNoResultMessage(searchLocationsSize: Int) { + if (searchLocationsSize > 0) { + noResultTextView.visibility = View.GONE + } else { + noResultTextView.visibility = View.VISIBLE + } + } } diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt b/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt index 432f2090..811c067d 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt @@ -3,6 +3,7 @@ package campus.tech.kakao.map.view.search import campus.tech.kakao.map.model.SavedLocation interface OnItemSelectedListener { - fun addSavedLocation(title: String) - fun deleteSavedLocation(item: SavedLocation) + fun onLocationViewClicked(title: String, longitude: String, latitude: String, address:String) + fun onSavedLocationXButtonClicked(item: SavedLocation) + fun onSavedLocationViewClicked(title: String) } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt index cd8f60d0..97335afb 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt @@ -27,12 +27,19 @@ class SavedLocationAdapter( itemView:View, itemSelectedListener: OnItemSelectedListener ) : RecyclerView.ViewHolder(itemView) { - val savedLocationXButton: ImageView = itemView.findViewById(R.id.savedLocationXButton) - val savedLocationTextView: TextView = itemView.findViewById(R.id.savedLocationTextView) + val savedLocationXButton: ImageView by lazy{ + itemView.findViewById(R.id.savedLocationXButton) + } + val savedLocationTextView: TextView by lazy { + itemView.findViewById(R.id.savedLocationTextView) + } init { + itemView.setOnClickListener { + itemSelectedListener.onSavedLocationViewClicked(getItem(bindingAdapterPosition).title) + } savedLocationXButton.setOnClickListener { - itemSelectedListener.deleteSavedLocation(getItem(bindingAdapterPosition) as SavedLocation) + itemSelectedListener.onSavedLocationXButtonClicked(getItem(bindingAdapterPosition) as SavedLocation) } } } diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt index f3e4b0a9..b3f95a69 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt @@ -39,10 +39,10 @@ class LocationViewModel( _searchedLocations.value = emptyList() } - fun searchLocationsFromKakaoAPI(query: String, deleteNoResultMessageCallback: (Int) -> Unit) { + fun searchLocationsFromKakaoAPI(query: String, handleNoResultMessage: (Int) -> Unit) { viewModelScope.launch { _searchedLocations.value = locationRepository.getLocationRemote(query) - deleteNoResultMessageCallback(getSearchedLocationsSize()) + handleNoResultMessage(getSearchedLocationsSize()) } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/location_red_icon_resized.png b/app/src/main/res/drawable/location_red_icon_resized.png new file mode 100644 index 00000000..1f2b57bd Binary files /dev/null and b/app/src/main/res/drawable/location_red_icon_resized.png differ diff --git a/app/src/main/res/drawable/map_background_bottom_sheet.xml b/app/src/main/res/drawable/map_background_bottom_sheet.xml new file mode 100644 index 00000000..798be23e --- /dev/null +++ b/app/src/main/res/drawable/map_background_bottom_sheet.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml index 39747345..940e1691 100644 --- a/app/src/main/res/layout/activity_map.xml +++ b/app/src/main/res/layout/activity_map.xml @@ -40,4 +40,16 @@ android:layout_marginRight="10dp" android:elevation="4dp"/> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/error_map.xml b/app/src/main/res/layout/error_map.xml new file mode 100644 index 00000000..d392d7bb --- /dev/null +++ b/app/src/main/res/layout/error_map.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/map_bottom_sheet.xml b/app/src/main/res/layout/map_bottom_sheet.xml new file mode 100644 index 00000000..aabaa4b7 --- /dev/null +++ b/app/src/main/res/layout/map_bottom_sheet.xml @@ -0,0 +1,54 @@ + + + + + + + + + + \ No newline at end of file