Эх сурвалжийг харах

Fixed the Suggested Changes

Signed-off-by: Smarshal21 <lcb2021048@iiitl.ac.in>
Smarshal21 1 жил өмнө
parent
commit
16f6e3c0cd

+ 37 - 43
app/src/main/java/com/nextcloud/talk/location/GeocodingActivity.kt

@@ -39,7 +39,6 @@ import androidx.preference.PreferenceManager
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import androidx.recyclerview.widget.RecyclerView
 import autodagger.AutoInjector
 import autodagger.AutoInjector
-import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.adapters.GeocodingAdapter
 import com.nextcloud.talk.adapters.GeocodingAdapter
@@ -50,11 +49,6 @@ import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.viewmodels.GeoCodingViewModel
 import com.nextcloud.talk.viewmodels.GeoCodingViewModel
 import fr.dudie.nominatim.client.TalkJsonNominatimClient
 import fr.dudie.nominatim.client.TalkJsonNominatimClient
 import fr.dudie.nominatim.model.Address
 import fr.dudie.nominatim.model.Address
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers.IO
-import kotlinx.coroutines.Dispatchers.Main
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 import okhttp3.OkHttpClient
 import okhttp3.OkHttpClient
 import org.osmdroid.config.Configuration
 import org.osmdroid.config.Configuration
 import javax.inject.Inject
 import javax.inject.Inject
@@ -83,6 +77,7 @@ class GeocodingActivity :
     private var geocodingResults: List<Address> = ArrayList()
     private var geocodingResults: List<Address> = ArrayList()
     private lateinit var recyclerView: RecyclerView
     private lateinit var recyclerView: RecyclerView
     private lateinit var viewModel: GeoCodingViewModel
     private lateinit var viewModel: GeoCodingViewModel
+
     override fun onCreate(savedInstanceState: Bundle?) {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         super.onCreate(savedInstanceState)
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
@@ -102,12 +97,27 @@ class GeocodingActivity :
         recyclerView.adapter = adapter
         recyclerView.adapter = adapter
         viewModel = ViewModelProvider(this).get(GeoCodingViewModel::class.java)
         viewModel = ViewModelProvider(this).get(GeoCodingViewModel::class.java)
 
 
-        // Observe geocoding results LiveData
+        query = viewModel.getQuery()
+        if (query.isNullOrEmpty()) {
+            query = intent.getStringExtra(BundleKeys.KEY_GEOCODING_QUERY)
+            viewModel.setQuery(query ?: "")
+        }
+        val savedResults = viewModel.getGeocodingResults()
+        initAdapter(savedResults)
         viewModel.getGeocodingResultsLiveData().observe(
         viewModel.getGeocodingResultsLiveData().observe(
             this,
             this,
-            Observer { results -> // Update the adapter with the new results
+            Observer { results ->
+                geocodingResults = results
                 adapter.updateData(results)
                 adapter.updateData(results)
-            })
+            }
+        )
+        viewModel.getQueryLiveData().observe(
+            this,
+            Observer { newQuery ->
+                query = newQuery
+                searchView?.setQuery(query, false)
+            }
+        )
         val baseUrl = getString(R.string.osm_geocoder_url)
         val baseUrl = getString(R.string.osm_geocoder_url)
         val email = context.getString(R.string.osm_geocoder_contact)
         val email = context.getString(R.string.osm_geocoder_contact)
         nominatimClient = TalkJsonNominatimClient(baseUrl, okHttpClient, email)
         nominatimClient = TalkJsonNominatimClient(baseUrl, okHttpClient, email)
@@ -123,11 +133,10 @@ class GeocodingActivity :
         super.onResume()
         super.onResume()
 
 
         if (!query.isNullOrEmpty()) {
         if (!query.isNullOrEmpty()) {
-            searchLocation()
+            viewModel.searchLocation(query!!)
         } else {
         } else {
             Log.e(TAG, "search string that was passed to GeocodingController was null or empty")
             Log.e(TAG, "search string that was passed to GeocodingController was null or empty")
         }
         }
-
         adapter.setOnItemClickListener(object : GeocodingAdapter.OnItemClickListener {
         adapter.setOnItemClickListener(object : GeocodingAdapter.OnItemClickListener {
             override fun onItemClick(position: Int) {
             override fun onItemClick(position: Int) {
                 val address: Address = adapter.getItem(position) as Address
                 val address: Address = adapter.getItem(position) as Address
@@ -139,6 +148,7 @@ class GeocodingActivity :
                 startActivity(intent)
                 startActivity(intent)
             }
             }
         })
         })
+        searchView?.setQuery(query, false)
     }
     }
 
 
     private fun setupActionBar() {
     private fun setupActionBar() {
@@ -182,7 +192,8 @@ class GeocodingActivity :
     }
     }
 
 
     override fun onQueryTextSubmit(query: String?): Boolean {
     override fun onQueryTextSubmit(query: String?): Boolean {
-        this.query = query
+        this.query = query ?: ""
+        viewModel.setQuery(this.query!!)
         if (query != null) {
         if (query != null) {
             viewModel.searchLocation(query)
             viewModel.searchLocation(query)
         }
         }
@@ -190,6 +201,18 @@ class GeocodingActivity :
         return true
         return true
     }
     }
 
 
+    override fun onSaveInstanceState(outState: Bundle) {
+        super.onSaveInstanceState(outState)
+        query?.let { viewModel.setQuery(it) }
+        outState.putString(KEY_SEARCH_QUERY, query)
+    }
+
+    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
+        super.onRestoreInstanceState(savedInstanceState)
+        query = viewModel.getQuery()
+        query = savedInstanceState.getString(KEY_SEARCH_QUERY)
+    }
+
     override fun onQueryTextChange(newText: String?): Boolean {
     override fun onQueryTextChange(newText: String?): Boolean {
         return true
         return true
     }
     }
@@ -231,37 +254,8 @@ class GeocodingActivity :
         nominatimClient = TalkJsonNominatimClient(baseUrl, okHttpClient, email)
         nominatimClient = TalkJsonNominatimClient(baseUrl, okHttpClient, email)
     }
     }
 
 
-    private fun searchLocation(): Boolean {
-        CoroutineScope(IO).launch {
-            executeGeocodingRequest()
-        }
-        return true
-    }
-
-    @Suppress("Detekt.TooGenericExceptionCaught")
-    private suspend fun executeGeocodingRequest() {
-        var results: ArrayList<Address> = ArrayList()
-        try {
-            results = nominatimClient!!.search(query) as ArrayList<Address>
-            for (address in results) {
-                Log.d(TAG, address.displayName)
-                Log.d(TAG, address.latitude.toString())
-                Log.d(TAG, address.longitude.toString())
-            }
-        } catch (e: Exception) {
-            Log.e(TAG, "Failed to get geocoded addresses", e)
-            Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
-        }
-        updateResultsOnMainThread(results)
-    }
-
-    private suspend fun updateResultsOnMainThread(results: ArrayList<Address>) {
-        withContext(Main) {
-            initAdapter(results)
-        }
-    }
-
     companion object {
     companion object {
-        private val TAG = GeocodingActivity::class.java.simpleName
+        val TAG = GeocodingActivity::class.java.simpleName
+        const val KEY_SEARCH_QUERY = "search_query"
     }
     }
 }
 }

+ 37 - 8
app/src/main/java/com/nextcloud/talk/viewmodels/GeoCodingViewModel.kt

@@ -25,6 +25,7 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModel
 import com.nextcloud.talk.activities.CallActivity.Companion.TAG
 import com.nextcloud.talk.activities.CallActivity.Companion.TAG
+import com.nextcloud.talk.location.GeocodingActivity
 import fr.dudie.nominatim.client.TalkJsonNominatimClient
 import fr.dudie.nominatim.client.TalkJsonNominatimClient
 import fr.dudie.nominatim.model.Address
 import fr.dudie.nominatim.model.Address
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineScope
@@ -35,12 +36,32 @@ import java.io.IOException
 
 
 class GeoCodingViewModel : ViewModel() {
 class GeoCodingViewModel : ViewModel() {
     private val geocodingResultsLiveData = MutableLiveData<List<Address>>()
     private val geocodingResultsLiveData = MutableLiveData<List<Address>>()
+    private val queryLiveData = MutableLiveData<String>()
+    private val nominatimClient: TalkJsonNominatimClient
+    private val okHttpClient: OkHttpClient = OkHttpClient.Builder().build()
+    private var geocodingResults: List<Address> = ArrayList()
+    private var query: String = ""
     fun getGeocodingResultsLiveData(): LiveData<List<Address>> {
     fun getGeocodingResultsLiveData(): LiveData<List<Address>> {
         return geocodingResultsLiveData
         return geocodingResultsLiveData
     }
     }
 
 
-    private val nominatimClient: TalkJsonNominatimClient
-    private val okHttpClient: OkHttpClient = OkHttpClient.Builder().build()
+    fun getQueryLiveData(): LiveData<String> {
+        return queryLiveData
+    }
+
+    fun getQuery(): String {
+        return query
+    }
+
+    fun setQuery(query: String) {
+        if (queryLiveData.value.isNullOrEmpty()) {
+            queryLiveData.value = query
+        }
+    }
+
+    fun getGeocodingResults(): List<Address> {
+        return geocodingResults
+    }
 
 
     init {
     init {
         nominatimClient = TalkJsonNominatimClient(
         nominatimClient = TalkJsonNominatimClient(
@@ -51,12 +72,20 @@ class GeoCodingViewModel : ViewModel() {
     }
     }
 
 
     fun searchLocation(query: String) {
     fun searchLocation(query: String) {
-        CoroutineScope(Dispatchers.IO).launch {
-            try {
-                val results = nominatimClient.search(query) as ArrayList<Address>
-                geocodingResultsLiveData.postValue(results)
-            } catch (e: IOException) {
-                Log.e(TAG, "Failed to get geocoded addresses", e)
+        if (query.isNotEmpty()) {
+            CoroutineScope(Dispatchers.IO).launch {
+                try {
+                    val results = nominatimClient.search(query) as ArrayList<Address>
+                    for (address in results) {
+                        Log.d(GeocodingActivity.TAG, address.displayName)
+                        Log.d(GeocodingActivity.TAG, address.latitude.toString())
+                        Log.d(GeocodingActivity.TAG, address.longitude.toString())
+                    }
+                    geocodingResults = results
+                    geocodingResultsLiveData.postValue(results)
+                } catch (e: IOException) {
+                    Log.e(TAG, "Failed to get geocoded addresses", e)
+                }
             }
             }
         }
         }
     }
     }