Bimba.git

ref: f42cabb4c00acd643489c8758be0f6d490414ea8

app/src/main/java/ml/adamsprogs/bimba/dashboard/ui/home/HomeViewModel.kt


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package ml.adamsprogs.bimba.dashboard.ui.home

import android.content.SharedPreferences
import android.net.ConnectivityManager
import android.os.Handler
import android.os.Looper
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import ml.adamsprogs.bimba.api.*
import java.io.InputStream

class HomeViewModel : ViewModel() {
	private val mutableItems = MutableLiveData<List<Item>>()
	val items: LiveData<List<Item>> = mutableItems

	fun getItems(cm: ConnectivityManager, server: Server, query: String) {
		viewModelScope.launch {
			val itemsResult = queryItems(cm, server, query, limit = 6)
			if (itemsResult.stream == null) {
				Log.e("HVM.getItems", "$itemsResult")
			} else {
				val response = unmarshallItemResponse(itemsResult.stream)
				if (itemsResult.error == null) {
					mutableItems.value = (response as ItemsSuccess).items
				} else {
					Log.w("HVM.getItems", "$itemsResult")
					Log.w("HVM.getItems", "$response")
				}
			}
		}
	}

	private suspend fun unmarshallItemResponse(stream: InputStream): ItemsResponse {
		return withContext(Dispatchers.IO) {
			ItemsResponse.unmarshal(stream)
		}
	}

	inner class SearchBarWatcher(
		private val preferences: SharedPreferences,
		private val cm: ConnectivityManager
	) :
		TextWatcher {
		private val handler = Handler(Looper.getMainLooper())
		private var workRunnable = Runnable {}

		override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
		}

		override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
		}

		override fun afterTextChanged(s: Editable?) {
			handler.removeCallbacks(workRunnable)
			workRunnable = Runnable {
				val host = preferences.getString("host", "bimba.apiote.xyz")!!
				val text = s.toString()
				getItems(
					cm,
					Server(
						host, preferences.getString("token", "")!!,
						preferences.getString("${host}_feeds", "")!!
					), text
				)
			}
			handler.postDelayed(
				workRunnable,
				1000
			) // todo(ux,low) make good time (probably between 500, 1000ms)
		}
	}
}