refactor: add new cs screen into custom selector activity

Also, refactor the UI components
This commit is contained in:
Rohit Verma 2024-10-03 23:41:34 +05:30
parent 0ff2880ba9
commit 5da9097547
3 changed files with 56 additions and 111 deletions

View file

@ -49,7 +49,7 @@ fun SecondaryButton(
modifier = modifier, modifier = modifier,
border = BorderStroke(1.dp, color = MaterialTheme.colorScheme.primary), border = BorderStroke(1.dp, color = MaterialTheme.colorScheme.primary),
shape = shape, shape = shape,
contentPadding = PaddingValues(horizontal = 24.dp, vertical = 4.dp) contentPadding = PaddingValues(horizontal = 16.dp, vertical = 4.dp)
) { ) {
Text( Text(
text = text, text = text,

View file

@ -28,6 +28,7 @@ fun CustomSelectorTopBar(
onNavigateBack: ()-> Unit, onNavigateBack: ()-> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
secondaryText: String? = null, secondaryText: String? = null,
showNavigationIcon: Boolean = true,
showAlertIcon: Boolean = false, showAlertIcon: Boolean = false,
onAlertAction: ()-> Unit = { }, onAlertAction: ()-> Unit = { },
) { ) {
@ -36,7 +37,7 @@ fun CustomSelectorTopBar(
Column { Column {
Text( Text(
text = primaryText, text = primaryText,
style = MaterialTheme.typography.titleMedium.copy(fontSize = 20.sp), style = MaterialTheme.typography.titleMedium.copy(fontSize = 18.sp),
color = MaterialTheme.colorScheme.primary, color = MaterialTheme.colorScheme.primary,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
@ -44,7 +45,7 @@ fun CustomSelectorTopBar(
secondaryText?.let { secondaryText?.let {
Text( Text(
text = it, text = it,
style = MaterialTheme.typography.labelLarge, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
@ -52,6 +53,7 @@ fun CustomSelectorTopBar(
}, },
modifier = modifier, modifier = modifier,
navigationIcon = { navigationIcon = {
if(showNavigationIcon) {
IconButton(onClick = onNavigateBack) { IconButton(onClick = onNavigateBack) {
Icon( Icon(
imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowLeft, imageVector = Icons.AutoMirrored.Rounded.KeyboardArrowLeft,
@ -59,6 +61,7 @@ fun CustomSelectorTopBar(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) )
} }
}
}, },
actions = { actions = {
if(showAlertIcon) { if(showAlertIcon) {

View file

@ -13,53 +13,34 @@ import android.view.Window
import android.widget.Button import android.widget.Button
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.TextView import android.widget.TextView
import androidx.activity.result.ActivityResult import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedCard
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import fr.free.nrw.commons.R import fr.free.nrw.commons.R
import fr.free.nrw.commons.customselector.data.MediaReader
import fr.free.nrw.commons.customselector.database.NotForUploadStatus import fr.free.nrw.commons.customselector.database.NotForUploadStatus
import fr.free.nrw.commons.customselector.database.NotForUploadStatusDao import fr.free.nrw.commons.customselector.database.NotForUploadStatusDao
import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants
import fr.free.nrw.commons.customselector.listeners.FolderClickListener import fr.free.nrw.commons.customselector.listeners.FolderClickListener
import fr.free.nrw.commons.customselector.listeners.ImageSelectListener import fr.free.nrw.commons.customselector.listeners.ImageSelectListener
import fr.free.nrw.commons.customselector.model.Image import fr.free.nrw.commons.customselector.model.Image
import fr.free.nrw.commons.customselector.ui.screens.CustomSelectorScreen
import fr.free.nrw.commons.databinding.ActivityCustomSelectorBinding import fr.free.nrw.commons.databinding.ActivityCustomSelectorBinding
import fr.free.nrw.commons.databinding.CustomSelectorBottomLayoutBinding import fr.free.nrw.commons.databinding.CustomSelectorBottomLayoutBinding
import fr.free.nrw.commons.databinding.CustomSelectorToolbarBinding import fr.free.nrw.commons.databinding.CustomSelectorToolbarBinding
import fr.free.nrw.commons.filepicker.Constants import fr.free.nrw.commons.filepicker.Constants
import fr.free.nrw.commons.media.ZoomableActivity import fr.free.nrw.commons.media.ZoomableActivity
import fr.free.nrw.commons.theme.BaseActivity import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.ui.theme.CommonsTheme
import fr.free.nrw.commons.upload.FileUtilsWrapper import fr.free.nrw.commons.upload.FileUtilsWrapper
import fr.free.nrw.commons.utils.CustomSelectorUtils import fr.free.nrw.commons.utils.CustomSelectorUtils
import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File import java.io.File
import java.lang.Integer.max import java.lang.Integer.max
import javax.inject.Inject import javax.inject.Inject
@ -166,25 +147,24 @@ class CustomSelectorActivity :
showPartialAccessIndicator = true showPartialAccessIndicator = true
} }
binding = ActivityCustomSelectorBinding.inflate(layoutInflater) // binding = ActivityCustomSelectorBinding.inflate(layoutInflater)
toolbarBinding = CustomSelectorToolbarBinding.bind(binding.root) // toolbarBinding = CustomSelectorToolbarBinding.bind(binding.root)
bottomSheetBinding = CustomSelectorBottomLayoutBinding.bind(binding.root) // bottomSheetBinding = CustomSelectorBottomLayoutBinding.bind(binding.root)
binding.partialAccessIndicator.setContent { // binding.partialAccessIndicator.setContent {
partialStorageAccessIndicator( // PartialStorageAccessDialog(
isVisible = showPartialAccessIndicator, // isVisible = showPartialAccessIndicator,
onManage = { // onManage = {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
requestPermissions(arrayOf(Manifest.permission.READ_MEDIA_IMAGES), 1) // requestPermissions(arrayOf(Manifest.permission.READ_MEDIA_IMAGES), 1)
} // }
}, // },
modifier = // modifier = Modifier
Modifier // .padding(vertical = 8.dp, horizontal = 4.dp)
.padding(vertical = 8.dp, horizontal = 4.dp) // .fillMaxWidth()
.fillMaxWidth(), // )
) // }
} // val view = binding.root
val view = binding.root // setContentView(view)
setContentView(view)
prefs = applicationContext.getSharedPreferences("CustomSelector", MODE_PRIVATE) prefs = applicationContext.getSharedPreferences("CustomSelector", MODE_PRIVATE)
viewModel = viewModel =
@ -192,7 +172,25 @@ class CustomSelectorActivity :
CustomSelectorViewModel::class.java, CustomSelectorViewModel::class.java,
) )
setupViews() val mediaReader = MediaReader(this)
setContent {
val csViewModel = viewModel<fr.free.nrw.commons.customselector.ui.screens.CustomSelectorViewModel> {
fr.free.nrw.commons.customselector.ui.screens.CustomSelectorViewModel(mediaReader)
}
val uiState by csViewModel.uiState.collectAsStateWithLifecycle()
CommonsTheme {
CustomSelectorScreen(
uiState = uiState,
onEvent = csViewModel::onEvent,
selectedImageIds = csViewModel.selectedImageIds
)
}
}
// setupViews()
if (prefs.getBoolean("customSelectorFirstLaunch", true)) { if (prefs.getBoolean("customSelectorFirstLaunch", true)) {
// show welcome dialog on first launch // show welcome dialog on first launch
@ -602,59 +600,3 @@ class CustomSelectorActivity :
const val ITEM_ID: String = "ItemId" const val ITEM_ID: String = "ItemId"
} }
} }
@Composable
fun partialStorageAccessIndicator(
isVisible: Boolean,
onManage: () -> Unit,
modifier: Modifier = Modifier,
) {
if (isVisible) {
OutlinedCard(
modifier = modifier,
colors =
CardDefaults.cardColors(
containerColor = colorResource(R.color.primarySuperLightColor),
),
border = BorderStroke(0.5.dp, color = colorResource(R.color.primaryColor)),
shape = RoundedCornerShape(8.dp),
) {
Row(modifier = Modifier.padding(16.dp).fillMaxWidth()) {
Text(
text = "You've given access to a select number of photos",
modifier = Modifier.weight(1f),
)
TextButton(
onClick = onManage,
modifier = Modifier.align(Alignment.Bottom),
colors =
ButtonDefaults.buttonColors(
containerColor = colorResource(R.color.primaryColor),
),
shape = RoundedCornerShape(8.dp),
) {
Text(
text = "Manage",
style = MaterialTheme.typography.labelMedium,
color = colorResource(R.color.primaryTextColor),
)
}
}
}
}
}
@Preview
@Composable
fun partialStorageAccessIndicatorPreview() {
Surface {
partialStorageAccessIndicator(
isVisible = true,
onManage = {},
modifier =
Modifier
.padding(vertical = 8.dp, horizontal = 4.dp)
.fillMaxWidth(),
)
}
}