'How to make a check for entering the correct city when entering

I have a way where when I enter the name of the city, I substitute the name of the city in the api, and everything works fine, but if I enter a non-real city, then nonsense is put in the api accordingly and the application crashes. I would like to make it so that if the city does not exist, that is, I output an error, then Toast "enter the correct name of the city" appears. Thank you in advance

введите сюда описание изображения

Код:

const val USE_DEVICE_LOCATION = "USE_DEVICE_LOCATION"
const val CUSTOM_LOCATION = "CUSTOM_LOCATION"


class LocationProviderImpl(
    private val fusedLocationProviderClient: FusedLocationProviderClient,
    context: Context) : PreferenceProvider(context), LocationProvider {

    private val appContext = context.applicationContext

    override suspend fun hasLocationChanged(lastWeatherLocation: WeatherLocation): Boolean {
        val deviceLocationChanged = try {
            hasDeviceLocationChanged(lastWeatherLocation)
        } catch (e: LocationPermissionNotGrantedException) {
            false
        }

        return deviceLocationChanged || hasCustomLocationChanged(lastWeatherLocation)
    }

    override suspend fun getPreferredLocationString(): String {
        if(isUsingDeviceLocation()) {
            try {
                val deviceLocation = getLastDeviceLocation()
                    ?: return "${getCustomLocationName()}"
                return "${deviceLocation.latitude},${deviceLocation.longitude}"
            } catch (e: LocationPermissionNotGrantedException) {
                return "${getCustomLocationName()}"
            }
        }
        else {
            return "${getCustomLocationName()}"
        }
    }

    private suspend fun hasDeviceLocationChanged(lastWeatherLocation: WeatherLocation): Boolean {

        if (!isUsingDeviceLocation())
            return false

        val deviceLocation = getLastDeviceLocation()
            ?: return false

        // Comparing doubles cannot be done with "=="
        val comparisonThreshold = 0.03
        return Math.abs(deviceLocation.latitude - lastWeatherLocation.lat) > comparisonThreshold &&
                Math.abs(deviceLocation.longitude - lastWeatherLocation.lon) > comparisonThreshold
    }

    private fun hasCustomLocationChanged(lastWeatherLocation: WeatherLocation): Boolean {

        if (!isUsingDeviceLocation()) {
            val customLocationName = getCustomLocationName()
            return customLocationName != lastWeatherLocation.name
        }
        return false
    }

    private fun getCustomLocationName(): String? {
        try {
            return preferences.getString(CUSTOM_LOCATION, null)
        }
        catch (e: Exception) {
            isUsingDeviceLocation()
        }
        throw LocationPermissionNotGrantedException()
    }

    private fun isUsingDeviceLocation(): Boolean {
        return preferences.getBoolean(USE_DEVICE_LOCATION, true)
    }

    @SuppressLint("MissingPermission")
    private suspend fun getLastDeviceLocation(): Location? {
        return (if (hasLocationPermission())
            fusedLocationProviderClient.lastLocation.asDeferred()
        else {
            throw LocationPermissionNotGrantedException()
        }).await()
    }

    private fun hasLocationPermission(): Boolean {
        return ContextCompat.checkSelfPermission(appContext,
            android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
    }
}

CurrentWeatherFragment

    class CurrentWeatherFragment : ScopedFragment(), KodeinAware, SharedPreferences.OnSharedPreferenceChangeListener {
    
        override val kodein by closestKodein()
        private val viewModelFactory: CurrentWeatherViewModelFactory by instance()
    
        private lateinit var viewModel: CurrentWeatherViewModel
    
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.current_weather_fragment, container, false)
    
        }
    
        override fun onActivityCreated(savedInstanceState: Bundle?) {
            super.onActivityCreated(savedInstanceState)
            loadBannerAd()
            viewModel = ViewModelProvider(this, viewModelFactory)
                .get(CurrentWeatherViewModel::class.java)
            bindUI()
            applyDarkModeSetting()
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
        }
        private fun loadBannerAd() {
            MobileAds.initialize(context) {}
    
            mAdViewCurrent = adView
            val adRequest = AdRequest.Builder().build()
            mAdViewCurrent.loadAd(adRequest)
    
            mAdViewCurrent.adListener = object: AdListener() {
                override fun onAdLoaded() {
                }
    
                override fun onAdFailedToLoad(adError : LoadAdError) {
                    // Code to be executed when an ad request fails.
                }
    
                override fun onAdOpened() {
                    // Code to be executed when an ad opens an overlay that
                    // covers the screen.
                }
    
                override fun onAdClicked() {
                    // Code to be executed when the user clicks on an ad.
                }
    
                override fun onAdClosed() {
                }
            }
        }
    
        override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
            if (key == "GENDER") {
                val prefs = sharedPreferences?.getString(key, "1")
                when(prefs?.toInt()) {
                    1->{
                        bindUI()
                    }
                    2->{
                        bindUIWomen()
                    }
                }
            }
            applyDarkModeSetting()
        }
        override fun onDestroy() {
            super.onDestroy()
            context?.let {
                PreferenceManager.getDefaultSharedPreferences(it)
                    .registerOnSharedPreferenceChangeListener(this)
            }
        }
        private fun applyDarkModeSetting() {
            val sharedPreferences = context?.let { PreferenceManager.getDefaultSharedPreferences(it) }
            val settingValue = sharedPreferences?.getString("GENDER", null)?.toIntOrNull() ?: 1
            val mode = when (settingValue) {
                1 -> {bindUI()}
                2 -> {bindUIWomen()}
                else -> Toast.makeText(context, "Nothing", Toast.LENGTH_LONG).show()
            }
    
        }
    
        private fun bindUI() = launch(Dispatchers.Main) {
            val currentWeather = viewModel.weather.await()
            val weatherLocation = viewModel.weatherLocation.await()
    
            val CurrentWeatherEntries = viewModel.weather.await()
    
            CurrentWeatherEntries.observe(viewLifecycleOwner, Observer { weatherAll ->
                if (weatherAll == null){
                    return@Observer
                }
                recyclerViewClothes.apply {
                    layoutManager = LinearLayoutManager(activity)
                    adapter = ClothesAdapter(weatherAll)
                }
    
            })
    
            weatherLocation.observe(viewLifecycleOwner, Observer { location ->
                if (location == null) return@Observer
                updateLocation(location.name)
                updateCityName(location.name)
            })
    
            currentWeather.observe(viewLifecycleOwner, Observer {
                if(it == null) return@Observer
    
                group_loading.visibility = View.GONE
                weatherAll.visibility = View.VISIBLE
                updateDateToday()
                //updateIsDay(it.isDay)
                updateHumidity(it.humidity)
                updateTemperature(it.temperature, it.feelsLikeTemperature)
                updateCondition(it.conditionText)
                updatePressure(it.pressure)
                updateWind(it.windSpeed)
                updateCloudy(it.cloud)
    
                GlideApp.with(this@CurrentWeatherFragment)
                    .load("https:${it.conditionIconUrl}")
                    .into(imageView_condition_icon)
            })
            refreshApp()
        }
private fun List<UnitSpecificCurrentWeatherEntry>.toCurrentWeatherItems() : List<ClothesAdapter> {
        return this.map {
            ClothesAdapter(it) //ClothesAdapter
        }
    }
//    private fun List<UnitSpecificCurrentWeatherEntry>.toCurrentWeatherItems() : List<ClothesAdapterWomen> {
//        return this.map {
//            ClothesAdapterWomen(it) //ClothesAdapter
//        }
//    }
    private fun chooseLocalizationUnitAbbreviation(metric: String, imperial: String): String {
        return if(viewModel.isMetricUnit) metric else imperial
    }
    private fun updateLocation(location: String) {
        (activity as? AppCompatActivity)?.supportActionBar?.subtitle = getString(R.string.todayTitle)
    }
    private fun updateDateToday() {
        (activity as? AppCompatActivity)?.supportActionBar?.subtitle = getString(R.string.todayTitle)
    }
    private fun updateCityName(cityName: String) {
        textView_cityName.text = cityName
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source