Migrate hidden items panel to Jetpack Compose

This commit is contained in:
MM20 2022-02-18 23:35:41 +01:00
parent 6b59aa5118
commit 5e18d25335
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
3 changed files with 101 additions and 61 deletions

View File

@ -9,8 +9,10 @@ import android.view.View
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.view.* import androidx.core.view.*
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewTreeLifecycleOwner
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.savedstate.ViewTreeSavedStateRegistryOwner
import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.bottomsheets.BottomSheet
@ -107,22 +109,20 @@ class LauncherActivity : BaseActivity() {
} }
} }
var hiddenItemsDialog: MaterialDialog? = null var hiddenItemsView: HiddenItemsView? = null
viewModel.isHiddenItemsShown.observe(this) { viewModel.isHiddenItemsShown.observe(this) {
if (it) { if (it) {
val view = HiddenItemsView(this) if (hiddenItemsView != null) return@observe
hiddenItemsDialog = MaterialDialog(this, BottomSheet(LayoutMode.MATCH_PARENT)) hiddenItemsView = HiddenItemsView(this).apply {
.show { onDismiss = {
title(R.string.menu_hidden_items) viewModel.hideHiddenItems()
customView(view = view)
negativeButton(R.string.close) { dismiss() }
onDismiss {
viewModel.hideHiddenItems()
}
} }
}
binding.rootView.addView(hiddenItemsView)
} else { } else {
hiddenItemsDialog?.dismiss() if (hiddenItemsView == null) return@observe
hiddenItemsDialog = null binding.rootView.removeView(hiddenItemsView)
hiddenItemsView = null
} }
} }

View File

@ -13,13 +13,5 @@ import org.koin.core.component.inject
class HiddenItemsVM: ViewModel(), KoinComponent { class HiddenItemsVM: ViewModel(), KoinComponent {
private val repository: FavoritesRepository by inject() private val repository: FavoritesRepository by inject()
val hiddenItems = MutableLiveData<List<Searchable>>(emptyList()) val hiddenItems = repository.getHiddenItems()
suspend fun onActive() {
withContext(Dispatchers.IO) {
repository.getHiddenItems().collectLatest {
hiddenItems.postValue(it)
}
}
}
} }

View File

@ -2,56 +2,104 @@ package de.mm20.launcher2.ui.launcher.modals
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.setMargins import androidx.compose.animation.AnimatedVisibility
import androidx.core.widget.NestedScrollView import androidx.compose.animation.core.MutableTransitionState
import de.mm20.launcher2.ktx.dp import androidx.compose.animation.slideIn
import de.mm20.launcher2.ktx.lifecycleScope import androidx.compose.foundation.layout.*
import de.mm20.launcher2.ui.legacy.search.SearchGridView import androidx.compose.foundation.rememberScrollState
import kotlinx.coroutines.Job import androidx.compose.foundation.verticalScroll
import kotlinx.coroutines.launch import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import de.mm20.launcher2.ui.MdcLauncherTheme
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.base.ProvideSettings
import de.mm20.launcher2.ui.launcher.search.common.SearchResultGrid
@OptIn(ExperimentalComposeUiApi::class)
class HiddenItemsView @JvmOverloads constructor( class HiddenItemsView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null context: Context, attrs: AttributeSet? = null
) : NestedScrollView(context, attrs) { ) : FrameLayout(context, attrs) {
private val viewModel: HiddenItemsVM by (context as AppCompatActivity).viewModels() private val viewModel: HiddenItemsVM by (context as AppCompatActivity).viewModels()
init { init {
clipChildren = false val composeView = ComposeView(context)
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, composeView.setContent {
ViewGroup.LayoutParams.WRAP_CONTENT MdcLauncherTheme {
) ProvideSettings {
val hiddenItemsGrid = SearchGridView(context) Dialog(
hiddenItemsGrid.layoutParams = FrameLayout.LayoutParams( properties = DialogProperties(usePlatformDefaultWidth = false),
ViewGroup.LayoutParams.MATCH_PARENT, onDismissRequest = { onDismiss() }) {
ViewGroup.LayoutParams.WRAP_CONTENT val animationState = remember {
).apply { MutableTransitionState(false).apply {
setMargins((8 * dp).toInt()) targetState = true
}
}
AnimatedVisibility(
animationState,
enter = slideIn { IntOffset(0, it.height) }
) {
Surface(modifier = Modifier.fillMaxSize()) {
Column(
modifier = Modifier
.fillMaxSize()
) {
Text(
stringResource(R.string.menu_hidden_items),
style = MaterialTheme.typography.titleLarge,
modifier = Modifier.padding(24.dp)
)
val items by viewModel.hiddenItems.collectAsState(emptyList())
SearchResultGrid(
items,
modifier = Modifier
.weight(1f)
.padding(8.dp)
.verticalScroll(rememberScrollState())
)
Box(
modifier = Modifier
.fillMaxWidth()
.padding(12.dp),
contentAlignment = Alignment.CenterEnd
) {
TextButton(onClick = { onDismiss() }) {
Text(
stringResource(id = R.string.close),
style = MaterialTheme.typography.labelLarge
)
}
}
}
}
}
}
}
}
} }
val hiddenItems = viewModel.hiddenItems
hiddenItems.observe(context as AppCompatActivity) { addView(composeView)
hiddenItemsGrid.submitItems(it)
}
addView(hiddenItemsGrid)
} }
private var job: Job? = null var onDismiss: () -> Unit = {}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val job = Job()
this.job = job
lifecycleScope.launch(job) {
viewModel.onActive()
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
job?.cancel()
}
} }