Merge pull request #1877 from esensar/fix/dropdown-colors

Fix colors for dropdown menus
This commit is contained in:
Tibor Kaputa 2023-10-11 18:42:53 +02:00 committed by GitHub
commit d91dbb64bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 265 additions and 197 deletions

View file

@ -17,6 +17,7 @@ import androidx.compose.ui.unit.dp
import com.simplemobiletools.commons.compose.extensions.MyDevices import com.simplemobiletools.commons.compose.extensions.MyDevices
import com.simplemobiletools.commons.compose.extensions.rememberMutableInteractionSource import com.simplemobiletools.commons.compose.extensions.rememberMutableInteractionSource
import com.simplemobiletools.commons.compose.theme.AppThemeSurface import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.compose.theme.SimpleTheme
private val dropDownPaddings = Modifier.padding(horizontal = 14.dp, vertical = 16.dp) private val dropDownPaddings = Modifier.padding(horizontal = 14.dp, vertical = 16.dp)
@ -37,16 +38,20 @@ fun SimpleDropDownMenuItem(
indication: Indication? = LocalIndication.current, indication: Indication? = LocalIndication.current,
onClick: () -> Unit onClick: () -> Unit
) = ) =
Box(modifier = modifier SimpleDropDownMenuItem(
.fillMaxWidth() modifier = modifier,
.clickable(interactionSource = interactionSource, indication = indication, onClick = onClick) interactionSource = interactionSource,
.then(dropDownPaddings)) { indication = indication,
Text( onClick = onClick,
text = text, text = {
modifier = Modifier Text(
.fillMaxWidth() text = text,
) modifier = Modifier
} .fillMaxWidth(),
color = SimpleTheme.colorScheme.onSurface
)
}
)
@Composable @Composable
fun SimpleDropDownMenuItem( fun SimpleDropDownMenuItem(

View file

@ -1,6 +1,7 @@
package com.simplemobiletools.commons.compose.menus package com.simplemobiletools.commons.compose.menus
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.foundation.background
import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
@ -30,6 +31,8 @@ import com.simplemobiletools.commons.compose.extensions.rememberMutableInteracti
import com.simplemobiletools.commons.compose.theme.AppThemeSurface import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.compose.theme.Shapes import com.simplemobiletools.commons.compose.theme.Shapes
import com.simplemobiletools.commons.compose.theme.SimpleTheme import com.simplemobiletools.commons.compose.theme.SimpleTheme
import com.simplemobiletools.commons.dialogs.dialogBorder
import com.simplemobiletools.commons.dialogs.dialogContainerColor
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
@ -140,6 +143,9 @@ fun ActionMenu(
} }
} }
DropdownMenu( DropdownMenu(
modifier = Modifier
.background(dialogContainerColor)
.dialogBorder,
expanded = isMenuVisible, expanded = isMenuVisible,
onDismissRequest = { onMenuToggle(false) }, onDismissRequest = { onMenuToggle(false) },
) { ) {

View file

@ -2,58 +2,103 @@ package com.simplemobiletools.commons.samples.activities
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import com.simplemobiletools.commons.activities.BaseSimpleActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import com.simplemobiletools.commons.activities.AboutActivity
import com.simplemobiletools.commons.activities.CustomizationActivity
import com.simplemobiletools.commons.activities.ManageBlockedNumbersActivity import com.simplemobiletools.commons.activities.ManageBlockedNumbersActivity
import com.simplemobiletools.commons.dialogs.BottomSheetChooserDialog import com.simplemobiletools.commons.compose.alert_dialog.AlertDialogState
import com.simplemobiletools.commons.dialogs.WritePermissionDialog import com.simplemobiletools.commons.compose.alert_dialog.rememberAlertDialogState
import com.simplemobiletools.commons.extensions.appLaunched import com.simplemobiletools.commons.compose.extensions.*
import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import com.simplemobiletools.commons.extensions.viewBinding import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.helpers.LICENSE_AUTOFITTEXTVIEW import com.simplemobiletools.commons.dialogs.DonateAlertDialog
import com.simplemobiletools.commons.dialogs.RateStarsAlertDialog
import com.simplemobiletools.commons.extensions.hideKeyboard
import com.simplemobiletools.commons.extensions.launchMoreAppsFromUsIntent
import com.simplemobiletools.commons.extensions.launchViewIntent
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FAQItem import com.simplemobiletools.commons.models.FAQItem
import com.simplemobiletools.commons.models.SimpleListItem
import com.simplemobiletools.commons.samples.BuildConfig import com.simplemobiletools.commons.samples.BuildConfig
import com.simplemobiletools.commons.samples.R import com.simplemobiletools.commons.samples.R
import com.simplemobiletools.commons.samples.databinding.ActivityMainBinding import com.simplemobiletools.commons.samples.screens.MainScreen
class MainActivity : BaseSimpleActivity() {
override fun getAppLauncherName() = getString(R.string.smtco_app_name)
override fun getAppIconIDs(): ArrayList<Int> {
val ids = ArrayList<Int>()
ids.add(R.mipmap.commons_launcher)
return ids
}
private val binding by viewBinding(ActivityMainBinding::inflate)
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID)
updateMaterialActivityViews(binding.mainCoordinator, binding.mainHolder, useTransparentNavigation = true, useTopSearchMenu = false) enableEdgeToEdgeSimple()
setupMaterialScrollListener(binding.mainNestedScrollview, binding.mainToolbar) setContent {
AppThemeSurface {
binding.mainColorCustomization.setOnClickListener { val showMoreApps = onEventValue { !resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations) }
startCustomizationActivity()
}
binding.bottomSheetChooser.setOnClickListener {
launchAbout()
}
binding.manageBlockedNumbers.setOnClickListener {
startActivity(Intent(this, ManageBlockedNumbersActivity::class.java))
}
binding.composeDialogs.setOnClickListener {
startActivity(Intent(this, TestDialogActivity::class.java))
}
binding.testButton.setOnClickListener {
WritePermissionDialog(this, writePermissionDialogMode = WritePermissionDialog.WritePermissionDialogMode.OpenDocumentTreeSDK30(".")){
MainScreen(
openColorCustomization = ::startCustomizationActivity,
manageBlockedNumbers = {
startActivity(Intent(this@MainActivity, ManageBlockedNumbersActivity::class.java))
},
showComposeDialogs = {
startActivity(Intent(this@MainActivity, TestDialogActivity::class.java))
},
openTestButton = {
ConfirmationDialog(
this@MainActivity,
FAKE_VERSION_APP_LABEL,
positive = com.simplemobiletools.commons.R.string.ok,
negative = 0
) {
launchViewIntent(DEVELOPER_PLAY_STORE_URL)
}
},
showMoreApps = showMoreApps,
openAbout = ::launchAbout,
moreAppsFromUs = ::launchMoreAppsFromUsIntent
)
AppLaunched()
} }
} }
} }
@Composable
private fun AppLaunched(
donateAlertDialogState: AlertDialogState = getDonateAlertDialogState(),
rateStarsAlertDialogState: AlertDialogState = getRateStarsAlertDialogState(),
) {
LaunchedEffect(Unit) {
appLaunchedCompose(
appId = BuildConfig.APPLICATION_ID,
showDonateDialog = donateAlertDialogState::show,
showRateUsDialog = rateStarsAlertDialogState::show,
showUpgradeDialog = {}
)
}
}
@Composable
private fun getDonateAlertDialogState() =
rememberAlertDialogState().apply {
DialogMember {
DonateAlertDialog(alertDialogState = this)
}
}
@Composable
private fun getRateStarsAlertDialogState() = rememberAlertDialogState().apply {
DialogMember {
RateStarsAlertDialog(alertDialogState = this, onRating = ::rateStarsRedirectAndThankYou)
}
}
private fun startCustomizationActivity() {
Intent(applicationContext, CustomizationActivity::class.java).apply {
putExtra(APP_ICON_IDS, getAppIconIDs())
putExtra(APP_LAUNCHER_NAME, getAppLauncherName())
startActivity(this)
}
}
private fun launchAbout() { private fun launchAbout() {
val licenses = LICENSE_AUTOFITTEXTVIEW val licenses = LICENSE_AUTOFITTEXTVIEW
@ -71,27 +116,29 @@ class MainActivity : BaseSimpleActivity() {
startAboutActivity(R.string.smtco_app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true) startAboutActivity(R.string.smtco_app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true)
} }
private fun launchBottomSheetDemo() { private fun startAboutActivity(
BottomSheetChooserDialog.createChooser( appNameId: Int, licenseMask: Long, versionName: String, faqItems: ArrayList<FAQItem>, showFAQBeforeMail: Boolean,
fragmentManager = supportFragmentManager, getAppIconIDs: ArrayList<Int> = getAppIconIDs(),
title = com.simplemobiletools.commons.R.string.please_select_destination, getAppLauncherName: String = getAppLauncherName()
items = arrayOf( ) {
SimpleListItem(1, com.simplemobiletools.commons.R.string.record_video, com.simplemobiletools.commons.R.drawable.ic_camera_vector), hideKeyboard()
SimpleListItem( Intent(applicationContext, AboutActivity::class.java).apply {
2, putExtra(APP_ICON_IDS, getAppIconIDs)
com.simplemobiletools.commons.R.string.record_audio, putExtra(APP_LAUNCHER_NAME, getAppLauncherName)
com.simplemobiletools.commons.R.drawable.ic_microphone_vector, putExtra(APP_NAME, getString(appNameId))
selected = true putExtra(APP_LICENSES, licenseMask)
), putExtra(APP_VERSION_NAME, versionName)
SimpleListItem(4, com.simplemobiletools.commons.R.string.choose_contact, com.simplemobiletools.commons.R.drawable.ic_add_person_vector) putExtra(APP_FAQ, faqItems)
) putExtra(SHOW_FAQ_BEFORE_MAIL, showFAQBeforeMail)
) { startActivity(this)
toast("Clicked ${it.id}")
} }
} }
override fun onResume() { private fun getAppLauncherName() = getString(R.string.smtco_app_name)
super.onResume()
setupToolbar(binding.mainToolbar) private fun getAppIconIDs(): ArrayList<Int> {
val ids = ArrayList<Int>()
ids.add(R.mipmap.commons_launcher)
return ids
} }
} }

View file

@ -1,129 +0,0 @@
package com.simplemobiletools.commons.samples.activities
import android.annotation.SuppressLint
import android.view.*
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.interfaces.ItemMoveCallback
import com.simplemobiletools.commons.interfaces.ItemTouchHelperContract
import com.simplemobiletools.commons.interfaces.StartReorderDragListener
import com.simplemobiletools.commons.samples.databinding.ListItemBinding
import com.simplemobiletools.commons.views.MyRecyclerView
import java.util.*
class StringsAdapter(
activity: BaseSimpleActivity, var strings: MutableList<String>, recyclerView: MyRecyclerView, val swipeRefreshLayout: SwipeRefreshLayout,
itemClick: (Any) -> Unit
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract {
private var isChangingOrder = false
private var startReorderDragListener: StartReorderDragListener
init {
setupDragListener(true)
val touchHelper = ItemTouchHelper(ItemMoveCallback(this, true))
touchHelper.attachToRecyclerView(recyclerView)
startReorderDragListener = object : StartReorderDragListener {
override fun requestDrag(viewHolder: RecyclerView.ViewHolder) {
touchHelper.startDrag(viewHolder)
}
}
}
override fun getActionMenuId() = com.simplemobiletools.commons.R.menu.cab_delete_only
override fun prepareActionMode(menu: Menu) {}
override fun actionItemPressed(id: Int) {
if (selectedKeys.isEmpty()) {
return
}
when (id) {
com.simplemobiletools.commons.R.id.cab_delete -> changeOrder()
}
}
override fun getSelectableItemCount() = strings.size
override fun getIsItemSelectable(position: Int) = true
override fun getItemSelectionKey(position: Int) = strings.getOrNull(position)?.hashCode()
override fun getItemKeyPosition(key: Int) = strings.indexOfFirst { it.hashCode() == key }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false).run { ViewHolder(root) }
override fun onActionModeCreated() {}
override fun onActionModeDestroyed() {
if (isChangingOrder) {
notifyDataSetChanged()
}
isChangingOrder = false
}
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val item = strings[position]
holder.bindView(item, true, true) { itemView, layoutPosition ->
setupView(ListItemBinding.bind(itemView), item, holder)
}
bindViewHolder(holder)
}
override fun getItemCount() = strings.size
private fun changeOrder() {
isChangingOrder = true
notifyDataSetChanged()
}
@SuppressLint("ClickableViewAccessibility")
private fun setupView(view: ListItemBinding, string: String, holder: ViewHolder) {
val isSelected = selectedKeys.contains(string.hashCode())
view.apply {
itemFrame.isSelected = isSelected
itemName.text = string
dragHandle.beVisibleIf(isChangingOrder)
if (isChangingOrder) {
dragHandle.setOnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
startReorderDragListener.requestDrag(holder)
}
false
}
}
}
}
override fun onRowMoved(fromPosition: Int, toPosition: Int) {
if (fromPosition < toPosition) {
for (i in fromPosition until toPosition) {
Collections.swap(strings, i, i + 1)
}
} else {
for (i in fromPosition downTo toPosition + 1) {
Collections.swap(strings, i, i - 1)
}
}
notifyItemMoved(fromPosition, toPosition)
}
override fun onRowSelected(myViewHolder: ViewHolder?) {
swipeRefreshLayout.isEnabled = false
}
override fun onRowClear(myViewHolder: ViewHolder?) {
swipeRefreshLayout.isEnabled = true
}
}

View file

@ -0,0 +1,139 @@
package com.simplemobiletools.commons.samples.screens
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Info
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.compose.extensions.MyDevices
import com.simplemobiletools.commons.compose.lists.SimpleScaffold
import com.simplemobiletools.commons.compose.lists.simpleTopAppBarColors
import com.simplemobiletools.commons.compose.lists.topAppBarInsets
import com.simplemobiletools.commons.compose.lists.topAppBarPaddings
import com.simplemobiletools.commons.compose.menus.ActionItem
import com.simplemobiletools.commons.compose.menus.ActionMenu
import com.simplemobiletools.commons.compose.menus.OverflowMode
import com.simplemobiletools.commons.compose.theme.AppThemeSurface
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
@Composable
fun MainScreen(
openColorCustomization: () -> Unit,
manageBlockedNumbers: () -> Unit,
showComposeDialogs: () -> Unit,
openTestButton: () -> Unit,
showMoreApps: Boolean,
openAbout: () -> Unit,
moreAppsFromUs: () -> Unit,
) {
SimpleScaffold(
customTopBar = { scrolledColor: Color, _: MutableInteractionSource, scrollBehavior: TopAppBarScrollBehavior, statusBarColor: Int, colorTransitionFraction: Float, contrastColor: Color ->
TopAppBar(
title = {},
actions = {
val actionMenus = remember {
buildActionMenuItems(
showMoreApps = showMoreApps,
openAbout = openAbout,
moreAppsFromUs = moreAppsFromUs
)
}
var isMenuVisible by remember { mutableStateOf(false) }
ActionMenu(
items = actionMenus,
numIcons = 2,
isMenuVisible = isMenuVisible,
onMenuToggle = { isMenuVisible = it },
iconsColor = scrolledColor
)
},
scrollBehavior = scrollBehavior,
colors = simpleTopAppBarColors(statusBarColor, colorTransitionFraction, contrastColor),
modifier = Modifier.topAppBarPaddings(),
windowInsets = topAppBarInsets()
)
}
) {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Button(
onClick = openColorCustomization
) {
Text(stringResource(id = R.string.color_customization))
}
Button(
onClick = openAbout
) {
Text("About")
}
Button(
onClick = manageBlockedNumbers
) {
Text("Manage blocked numbers")
}
Button(
onClick = showComposeDialogs
) {
Text("Compose dialogs")
}
Button(
onClick = openTestButton
) {
Text("Test button")
}
}
}
}
private fun buildActionMenuItems(
showMoreApps: Boolean,
openAbout: () -> Unit,
moreAppsFromUs: () -> Unit
): ImmutableList<ActionItem> {
val list = mutableListOf<ActionItem>()
list += ActionItem(
R.string.about,
icon = Icons.Outlined.Info,
doAction = openAbout,
overflowMode = OverflowMode.NEVER_OVERFLOW
)
if (showMoreApps) {
list += ActionItem(
R.string.more_apps_from_us,
doAction = moreAppsFromUs,
overflowMode = OverflowMode.ALWAYS_OVERFLOW
)
}
return list.toImmutableList()
}
@Composable
@MyDevices
private fun MainScreenPreview() {
AppThemeSurface {
MainScreen(
openColorCustomization = {},
manageBlockedNumbers = {},
showComposeDialogs = {},
openTestButton = {},
showMoreApps = true,
openAbout = {},
moreAppsFromUs = {}
)
}
}