package org.thoughtcrime.securesms.keyboard.emoji import android.content.Context import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.emoji.EmojiPageModel import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.EmojiHeader import org.thoughtcrime.securesms.components.emoji.RecentEmojiPageModel import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.emoji.EmojiCategory import org.thoughtcrime.securesms.keyboard.emoji.EmojiKeyboardPageCategoryMappingModel.EmojiCategoryMappingModel import org.thoughtcrime.securesms.util.DefaultValueLiveData import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.adapter.mapping.MappingModelList import org.thoughtcrime.securesms.util.livedata.LiveDataUtil class EmojiKeyboardPageViewModel(private val repository: EmojiKeyboardPageRepository) : ViewModel() { private val internalSelectedKey = DefaultValueLiveData(getStartingTab()) val selectedKey: LiveData get() = internalSelectedKey val allEmojiModels: MutableLiveData> = MutableLiveData() val pages: LiveData val categories: LiveData init { pages = LiveDataUtil.mapAsync(allEmojiModels) { models -> val list = MappingModelList() models.forEach { pageModel -> if (RecentEmojiPageModel.KEY != pageModel.key) { val category = EmojiCategory.forKey(pageModel.key) list += EmojiHeader(pageModel.key, category.getCategoryLabel()) list += pageModel.toMappingModels() } else if (pageModel.displayEmoji.isNotEmpty()) { list += EmojiHeader(pageModel.key, R.string.ReactWithAnyEmojiBottomSheetDialogFragment__recently_used) list += pageModel.toMappingModels() } } list } categories = LiveDataUtil.combineLatest(allEmojiModels, internalSelectedKey) { models, selectedKey -> val list = MappingModelList() list += models.map { m -> if (RecentEmojiPageModel.KEY == m.key) { EmojiKeyboardPageCategoryMappingModel.RecentsMappingModel(m.key == selectedKey) } else { val category = EmojiCategory.forKey(m.key) EmojiCategoryMappingModel(category, category.key == selectedKey) } } list } } fun onKeySelected(key: String) { internalSelectedKey.value = key } fun refreshRecentEmoji() { repository.getEmoji(allEmojiModels::postValue) } companion object { fun getStartingTab(): String { return if (RecentEmojiPageModel.hasRecents(ApplicationDependencies.getApplication(), TextSecurePreferences.RECENT_STORAGE_KEY)) { RecentEmojiPageModel.KEY } else { EmojiCategory.PEOPLE.key } } } class Factory(context: Context) : ViewModelProvider.Factory { private val repository = EmojiKeyboardPageRepository(context) override fun create(modelClass: Class): T { return requireNotNull(modelClass.cast(EmojiKeyboardPageViewModel(repository))) } } }