Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package finance.robo.android.offices.ui.map
- import android.Manifest
- import android.annotation.SuppressLint
- import android.content.pm.PackageManager
- import android.graphics.Color
- import android.location.Location
- import android.location.LocationListener
- import android.location.LocationManager
- import android.net.Uri
- import android.os.Bundle
- import android.support.design.widget.BottomSheetBehavior
- import android.support.v4.app.ActivityCompat
- import android.support.v4.content.ContextCompat
- import android.view.LayoutInflater
- import android.view.View
- import android.view.ViewGroup
- import android.widget.Toast
- import com.arellomobile.mvp.presenter.InjectPresenter
- import com.arellomobile.mvp.presenter.PresenterType
- import com.arellomobile.mvp.presenter.ProvidePresenter
- import com.arellomobile.mvp.presenter.ProvidePresenterTag
- import com.facebook.drawee.backends.pipeline.Fresco
- import com.facebook.imagepipeline.common.ResizeOptions
- import com.facebook.imagepipeline.request.ImageRequestBuilder
- import com.google.android.gms.location.FusedLocationProviderClient
- import com.google.android.gms.location.LocationServices
- import com.google.android.gms.maps.CameraUpdateFactory
- import com.google.android.gms.maps.GoogleMap
- import com.google.android.gms.maps.OnMapReadyCallback
- import com.google.android.gms.maps.SupportMapFragment
- import com.google.android.gms.maps.model.*
- import finance.robo.android.core.analytics.IAnalytic
- import finance.robo.android.core.analytics.RoutesTags
- import finance.robo.android.core.base.BaseFragment
- import finance.robo.android.core.baseComponentsProvider
- import finance.robo.android.core.permissions.PermissionInstructionDialog
- import finance.robo.android.core.permissions.PermissionsUtils
- import finance.robo.android.offices.R
- import finance.robo.android.offices.di.DaggerOfficesComponent
- import finance.robo.android.offices.entity.Office
- import finance.robo.android.offices.presentation.OfficesPresenter
- import finance.robo.android.offices.presentation.OfficesView
- import kotlinx.android.synthetic.main.fragment_offices_map.*
- import kotlinx.android.synthetic.main.fragment_offices_map.view.*
- import javax.inject.Inject
- class OfficesMapFragment : BaseFragment(), OfficesView, OnMapReadyCallback {
- lateinit var fusedLocationClient: FusedLocationProviderClient
- lateinit var lastKnownLocation: Location
- companion object {
- @JvmStatic
- fun newInstance(routingTag: String? = null): OfficesMapFragment {
- val fragment = OfficesMapFragment()
- fragment.arguments = Bundle().apply { putString(RoutesTags.ROUTER_KEY, routingTag) }
- return fragment
- }
- }
- private var isMapReady = false
- private lateinit var map: GoogleMap
- private var offices = listOf<Office>()
- private lateinit var bottomSheetBehavior: BottomSheetBehavior<ViewGroup>
- private lateinit var mapFragment: SupportMapFragment
- @Inject
- lateinit var analytics: IAnalytic
- @Inject
- @InjectPresenter(type = PresenterType.WEAK)
- lateinit var officesPresenter: OfficesPresenter
- @ProvidePresenter(type = PresenterType.WEAK)
- fun provideOfficesPresenter() = officesPresenter
- @ProvidePresenterTag(type = PresenterType.WEAK, presenterClass = OfficesPresenter::class)
- fun provideOfficePresenterTag() = "OfficesPresenter"
- override fun inject() {
- DaggerOfficesComponent
- .builder()
- .commonComponent(context!!.baseComponentsProvider().provideCommonComponent())
- .build()
- .inject(this)
- officesPresenter.routingTag = arguments?.getString(RoutesTags.ROUTER_KEY)
- }
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- return inflater.inflate(R.layout.fragment_offices_map, container, false)
- }
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- mapFragment = childFragmentManager.findFragmentById(R.id.mapFragment) as SupportMapFragment
- mapFragment.getMapAsync(this)
- bottomSheetBehavior = BottomSheetBehavior.from(view.officeInfoPanel)
- // mapFragment.view?.findViewById<View>(Integer.parseInt("1"))?.parent?.let { parentView -> (parentView as View).findViewById<View>(Integer.parseInt("2"))?.performClick() }
- }
- override fun onMapReady(map: GoogleMap) {
- isMapReady = true
- this.map = map
- map.setOnMarkerClickListener { marker ->
- findOfficeByAddress(marker.title)?.let { office -> showOfficeInfo(office) }
- true
- }
- map.setOnMapClickListener { collapseInfoPanel() }
- setMapMarkers(offices)
- closeButton.setOnClickListener { collapseInfoPanel() }
- map.setOnMyLocationButtonClickListener { false }
- permissionDialog()
- }
- @SuppressLint("MissingPermission")
- override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults)
- if (requestCode == PermissionsUtils.REQUEST_ACCESS_FINE_LOCATION && permissions.isNotEmpty()) {
- if (PermissionsUtils.hasPermission(fragmentContext, permissions[0])) {
- map.isMyLocationEnabled = true
- mapFragment.view?.findViewById<View>(Integer.parseInt("1"))?.parent?.let { parentView -> (parentView as View).findViewById<View>(Integer.parseInt("2"))?.performClick() }
- } else {
- permissionDialog()
- }
- }
- }
- override fun showLoadingError(details: Map<String, List<String>>) {
- showMessage(getString(R.string.error_offices_loading))
- }
- override fun showProgress(show: Boolean) {
- }
- override fun showItemsAdded(index: Int, count: Int, showMoreButton: Boolean) {
- setMapMarkers(offices)
- }
- override fun updateEmptyView(imageRes: Int?, message: String?) {
- }
- override fun clearAll() {
- }
- override fun showMoreProgress() {
- }
- override fun hideMoreProgress() {
- }
- override fun showNetworkError() {
- //Empty implementation
- }
- override fun bindData(data: List<Office>) {
- offices = data
- }
- @SuppressLint("MissingPermission")
- fun permissionDialog() {
- val permissionDialog = PermissionInstructionDialog.newInstance(
- R.string.permission_dialog_map_message,
- arrayListOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION),
- PermissionsUtils.REQUEST_ACCESS_FINE_LOCATION
- )
- if (!permissionDialog.showIfRequired(activity?.supportFragmentManager!!, fragmentContext)) {
- map.isMyLocationEnabled = true
- //лайфхах от Витали :)
- mapFragment.view?.findViewById<View>(Integer.parseInt("1"))?.parent?.let { parentView -> (parentView as View).findViewById<View>(Integer.parseInt("2"))?.performClick() }
- }
- }
- @SuppressLint("MissingPermission")
- private fun setMapMarkers(offices: List<Office>) {
- if (!isMapReady || offices.isEmpty()) {
- return
- }
- val builder = LatLngBounds.Builder()
- offices
- .filter { office -> office.address.latitude != null && office.address.longitude != null }
- .forEach { office ->
- office.address.let { address ->
- val marker = MarkerOptions()
- .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker))
- .position(LatLng(address.latitude!!.toDouble(), address.longitude!!.toDouble()))
- .title(address.full)
- map.addMarker(marker)
- builder.include(marker.position)
- }
- }
- map.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 0))
- }
- @SuppressLint("MissingPermission")
- fun getDeviceLoacation() {
- // context?.let { fusedLocationClient = LocationServices.getFusedLocationProviderClient(it) }
- // val locationResult = fusedLocationClient.lastLocation
- // locationResult.addOnCompleteListener { task ->
- // if (task.isSuccessful) {
- // lastKnownLocation = task.result
- // map.moveCamera(CameraUpdateFactory.newLatLng(LatLng(lastKnownLocation.latitude, lastKnownLocation.longitude)))
- // }
- //// else {
- //// map.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 0))
- //// map.uiSettings.isMyLocationButtonEnabled = false
- //// }
- // }
- }
- private fun showOfficeInfo(office: Office) {
- address.text = office.address.full
- workTime.text = office.workingTime
- office.photoUrl?.let { url ->
- val imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url))
- .setResizeOptions(ResizeOptions(photo.width, photo.height))
- .build()
- photo.controller = Fresco.newDraweeControllerBuilder()
- .setOldController(photo.controller)
- .setImageRequest(imageRequest)
- .build()
- }
- expandInfoPanel()
- }
- private fun expandInfoPanel() {
- if (bottomSheetBehavior.state != BottomSheetBehavior.STATE_EXPANDED)
- bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED
- }
- private fun collapseInfoPanel() {
- if (bottomSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED)
- bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
- }
- private fun findOfficeByAddress(address: String) = offices.firstOrNull { office -> office.address.full == address }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement