Migrate hidden items panel to Jetpack Compose
This commit is contained in:
parent
6b59aa5118
commit
5e18d25335
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user