Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate search fragment to compose UI #2108

Closed
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
bbc439a
Refactor: Migrate SearchFragment to Jetpack Compose
ashutosh-kumar-kushwaha Feb 29, 2024
fa0ce92
Merge branch 'master' into search_fragment_to_compose
ashutosh-kumar-kushwaha Mar 18, 2024
e9968d1
Fixed the imports
ashutosh-kumar-kushwaha Mar 18, 2024
1719c17
Merge branch 'master' into search_fragment_to_compose
ashutosh-kumar-kushwaha May 10, 2024
3934a10
Resolved Merge conflicts
ashutosh-kumar-kushwaha May 10, 2024
eed2607
Remove Dialog in ProgressBar, Use Mifos Mifos Color Scheme and use co…
ashutosh-kumar-kushwaha May 14, 2024
083c62f
Fix the TextField moved to below on click issue
ashutosh-kumar-kushwaha May 20, 2024
71fa7f2
Refactor: Migrate SearchFragment to Jetpack Compose
ashutosh-kumar-kushwaha Feb 29, 2024
263e37a
Fixed the imports
ashutosh-kumar-kushwaha Mar 18, 2024
98e85e5
Resolved Merge conflicts
ashutosh-kumar-kushwaha May 10, 2024
6d488f4
Remove Dialog in ProgressBar, Use Mifos Mifos Color Scheme and use co…
ashutosh-kumar-kushwaha May 14, 2024
1ae12c8
Fix the TextField moved to below on click issue
ashutosh-kumar-kushwaha May 20, 2024
2419218
Merge remote-tracking branch 'ashutosh/search_fragment_to_compose' in…
niyajali Jun 4, 2024
4a920ce
refactor - search fragment to compose ui
niyajali Jun 5, 2024
66efd3d
Merge branch 'refs/heads/master' into MIFOSAC-168-migrate-search-frag…
niyajali Jul 18, 2024
887da84
- Resolved Merge Conflicts
niyajali Jul 18, 2024
3709fdf
Merge branch 'refs/heads/master' into MIFOSAC-168-migrate-search-frag…
niyajali Jul 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions core/data/src/main/java/com/mifos/core/data/di/DataModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package com.mifos.core.data.di
import com.mifos.core.data.repository.CheckerInboxTasksRepository
import com.mifos.core.data.repository.GroupsListRepository
import com.mifos.core.data.repository.NewIndividualCollectionSheetRepository
import com.mifos.core.data.repository.SearchRepository
import com.mifos.core.data.repository_imp.CheckerInboxTasksRepositoryImp
import com.mifos.core.data.repository_imp.GroupsListRepositoryImpl
import com.mifos.core.data.repository_imp.NewIndividualCollectionSheetRepositoryImp
import com.mifos.core.data.repository_imp.SearchRepositoryImp
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
Expand All @@ -25,4 +27,7 @@ abstract class DataModule {
internal abstract fun provideGroupListRepository(
groupsListRepositoryImpl: GroupsListRepositoryImpl
): GroupsListRepository

@Binds
internal abstract fun provideSearchRepository(repository: SearchRepositoryImp): SearchRepository
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package com.mifos.mifosxdroid.online.search
package com.mifos.core.data.repository

import com.mifos.core.objects.SearchedEntity
import rx.Observable
import kotlinx.coroutines.flow.Flow

/**
* Created by Aditya Gupta on 06/08/23.
*/
interface SearchRepository {

fun searchResources(
suspend fun searchResources(
query: String?,
resources: String?,
exactMatch: Boolean?
): Observable<List<SearchedEntity>>
): Flow<List<SearchedEntity>>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.mifos.core.data.repository_imp

import com.mifos.core.common.network.Dispatcher
import com.mifos.core.common.network.MifosDispatchers
import com.mifos.core.data.repository.SearchRepository
import com.mifos.core.network.datamanager.DataManagerSearch
import com.mifos.core.objects.SearchedEntity
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import javax.inject.Inject

/**
* Created by Aditya Gupta on 06/08/23.
*/
class SearchRepositoryImp @Inject constructor(
private val dataManagerSearch: DataManagerSearch,
@Dispatcher(MifosDispatchers.IO)
private val ioDispatcher: CoroutineDispatcher,
) : SearchRepository {

override suspend fun searchResources(
query: String?,
resources: String?,
exactMatch: Boolean?
): Flow<List<SearchedEntity>> = flow {
val result = dataManagerSearch.searchResources(query, resources, exactMatch)
emit(result)
}.flowOn(ioDispatcher)
.distinctUntilChanged()
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.mifos.core.designsystem.theme.BluePrimary
Expand Down Expand Up @@ -143,6 +144,8 @@ fun MifosOutlinedTextField(
Text(
text = label,
style = MaterialTheme.typography.labelMedium,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
},
leadingIcon = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,11 @@ fun MifosPagingAppendProgress() {

@Composable
fun MifosCircularProgress(
contentDesc: String = "loadingIndicator"
modifier: Modifier = Modifier,
contentDesc: String = "loadingIndicator",
) {
Box(
modifier = Modifier
modifier = modifier
.fillMaxSize()
.semantics { contentDescription = contentDesc },
contentAlignment = Alignment.Center
Expand All @@ -60,5 +61,4 @@ fun MifosCircularProgress(
color = DarkGray
)
}

}
Original file line number Diff line number Diff line change
@@ -1,28 +1,39 @@
@file:OptIn(ExperimentalMaterial3Api::class)

package com.mifos.core.designsystem.component

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material3.FabPosition
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import com.mifos.core.designsystem.theme.White
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color

@Composable
fun MifosScaffold(
topBar: @Composable () -> Unit,
snackbarHostState: SnackbarHostState?,
bottomBar: @Composable () -> Unit,
modifier: Modifier = Modifier,
topBar: @Composable () -> Unit = {},
bottomBar: @Composable () -> Unit = {},
floatingActionButton: @Composable () -> Unit = {},
snackbarHostState: SnackbarHostState = remember { SnackbarHostState() },
floatingActionButtonPosition: FabPosition = FabPosition.End,
containerColor: Color = Color.White,
contentColor: Color = contentColorFor(containerColor),
content: @Composable (PaddingValues) -> Unit
) {

Scaffold(
modifier = modifier,
topBar = topBar,
snackbarHost = { snackbarHostState?.let { SnackbarHost(it) } },
containerColor = White,
bottomBar = bottomBar
floatingActionButton = floatingActionButton,
floatingActionButtonPosition = floatingActionButtonPosition,
snackbarHost = { SnackbarHost(snackbarHostState) },
bottomBar = bottomBar,
containerColor = containerColor,
contentColor = contentColor,
contentWindowInsets = WindowInsets(0, 0, 0, 0)
) { padding ->
content(padding)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ import javax.inject.Singleton
*/
@Singleton
class DataManagerSearch @Inject constructor(private val baseApiManager: BaseApiManager) {
fun searchResources(
suspend fun searchResources(
query: String?, resources: String?,
exactMatch: Boolean?
): Observable<List<SearchedEntity>> {
): List<SearchedEntity> {
return baseApiManager.searchApi.searchResources(query, resources, exactMatch)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ import rx.Observable
*/
interface SearchService {
@GET(APIEndPoint.SEARCH)
fun searchResources(
suspend fun searchResources(
@Query("query") clientName: String?,
@Query("resource") resources: String?,
@Query("exactMatch") exactMatch: Boolean?
): Observable<List<SearchedEntity>>
): List<SearchedEntity>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.mifos.core.ui.components

import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.expandVertically
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.shrinkVertically
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp

enum class FabType {
CLIENT, CENTER, GROUP
}

sealed class FabButtonState {
data object Collapsed : FabButtonState()

data object Expand : FabButtonState()

fun isExpanded() = this == Expand

fun toggleValue() = if (isExpanded()) {
Collapsed
} else {
Expand
}
}

data class FabButton(
val fabType: FabType,
val iconRes: Int,
)

@Composable
fun FabItem(
modifier: Modifier = Modifier,
fabButton: FabButton,
onFabClick: (FabType) -> Unit
) {
FloatingActionButton(
onClick = {
onFabClick(fabButton.fabType)
},
modifier = modifier
.size(48.dp)
) {
Icon(
painter = painterResource(id = fabButton.iconRes),
contentDescription = fabButton.fabType.name
)
}
}

@Composable
fun MultiFloatingActionButton(
modifier: Modifier = Modifier,
fabButtons: List<FabButton>,
fabButtonState: FabButtonState,
onFabButtonStateChange: (FabButtonState) -> Unit,
onFabClick: (FabType) -> Unit,
) {
val rotation by animateFloatAsState(
if (fabButtonState.isExpanded())
45f
else
0f, label = "mainFabRotation"
)

Column(
modifier = modifier,
horizontalAlignment = Alignment.CenterHorizontally
) {
AnimatedVisibility(
visible = fabButtonState.isExpanded(),
enter = fadeIn() + expandVertically(),
exit = fadeOut() + shrinkVertically()
) {
Column {
fabButtons.forEach {
FabItem(
fabButton = it,
onFabClick = onFabClick
)
Spacer(modifier = Modifier.height(24.dp))
}
}
}

FloatingActionButton(
onClick = {
onFabButtonStateChange(fabButtonState.toggleValue())
},
modifier = Modifier
.rotate(rotation)
) {
Icon(
imageVector = Icons.Default.Add,
contentDescription = "mainFabIcon"
)
}
}
}
Loading
Loading