Skip to content

Commit

Permalink
Merge pull request lihenggui#183 from lihenggui/tab-pager
Browse files Browse the repository at this point in the history
Tab pager
  • Loading branch information
juliewww authored May 12, 2023
2 parents 684ccb6 + f05ab91 commit a1732e5
Show file tree
Hide file tree
Showing 10 changed files with 201 additions and 248 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package com.merxury.blocker.core.ui.applist
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.windowInsetsBottomHeight
import androidx.compose.foundation.lazy.LazyColumn
Expand All @@ -43,7 +44,7 @@ fun AppList(
modifier: Modifier = Modifier,
) {
val listState = rememberLazyListState()
Box(modifier) {
Box(modifier.fillMaxSize()) {
LazyColumn(
modifier = modifier,
state = listState,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@ fun RuleMatchedAppList(
NoApplicableAppScreen()
return
}
LazyColumn {
items(ruleMatchedAppListUiState.list, key = { it.app.packageName }) { ruleMatchedApp ->
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(
ruleMatchedAppListUiState.list,
key = { it.app.packageName },
) { ruleMatchedApp ->
MatchedComponentItem(
ruleMatchedApp = ruleMatchedApp,
onStopServiceClick = onStopServiceClick,
Expand All @@ -70,6 +73,7 @@ fun RuleMatchedAppList(
}
}
}

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package com.merxury.blocker.feature.appdetail
import android.content.res.Configuration
import androidx.compose.animation.core.FloatExponentialDecaySpec
import androidx.compose.animation.core.animateDecay
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.WindowInsets
Expand All @@ -29,6 +30,8 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarDuration
Expand Down Expand Up @@ -160,6 +163,7 @@ fun AppDetailRoute(
FOLDER_NOT_DEFINED,
MISSING_STORAGE_PERMISSION,
-> rulestring.error_msg_folder_not_defined

MISSING_ROOT_PERMISSION -> rulestring.error_msg_missing_root_permission
UNEXPECTED_EXCEPTION -> rulestring.error_msg_unexpected_exception
CANCELLED -> rulestring.task_cancelled
Expand Down Expand Up @@ -416,6 +420,7 @@ private fun rememberToolbarState(toolbarHeightRange: IntRange): ToolbarState {
}
}

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun AppDetailTabContent(
modifier: Modifier = Modifier,
Expand All @@ -435,17 +440,24 @@ fun AppDetailTabContent(
onCopyNameClick: (String) -> Unit = { _ -> },
onCopyFullNameClick: (String) -> Unit = { _ -> },
) {
val coroutineScope = rememberCoroutineScope()
val pagerState = rememberPagerState(initialPage = tabState.currentIndex) { tabState.items.size }
Column(
modifier = modifier,
) {
BlockerScrollableTabRow(
selectedTabIndex = tabState.currentIndex,
selectedTabIndex = pagerState.currentPage,
containerColor = MaterialTheme.colorScheme.surfaceVariant,
) {
tabState.items.forEachIndexed { index, tabItem ->
BlockerTab(
selected = index == tabState.currentIndex,
onClick = { switchTab(tabItem) },
selected = index == pagerState.currentPage,
onClick = {
switchTab(tabItem)
coroutineScope.launch {
pagerState.animateScrollToPage(index)
}
},
text = {
Text(
text = stringResource(
Expand All @@ -457,57 +469,65 @@ fun AppDetailTabContent(
)
}
}
when (tabState.selectedItem) {
Info -> SummaryContent(
app = app,
onExportRules = onExportRules,
onImportRules = onImportRules,
onExportIfw = onExportIfw,
onImportIfw = onImportIfw,
onResetIfw = onResetIfw,
)
HorizontalPager(state = pagerState) {
when (it) {
0 -> SummaryContent(
app = app,
onExportRules = onExportRules,
onImportRules = onImportRules,
onExportIfw = onExportIfw,
onImportIfw = onImportIfw,
onResetIfw = onResetIfw,
)

is Receiver -> ComponentList(
components = componentListUiState.receiver,
navigateToComponentDetail = navigateToComponentDetail,
onSwitchClick = onSwitchClick,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
)
1 -> ComponentList(
components = componentListUiState.receiver,
navigateToComponentDetail = navigateToComponentDetail,
onSwitchClick = onSwitchClick,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
)

is Service -> ComponentList(
components = componentListUiState.service,
navigateToComponentDetail = navigateToComponentDetail,
onSwitchClick = onSwitchClick,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
)
2 -> ComponentList(
components = componentListUiState.service,
navigateToComponentDetail = navigateToComponentDetail,
onSwitchClick = onSwitchClick,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
)

is Activity -> ComponentList(
components = componentListUiState.activity,
navigateToComponentDetail = navigateToComponentDetail,
onSwitchClick = onSwitchClick,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
)
3 -> ComponentList(
components = componentListUiState.activity,
navigateToComponentDetail = navigateToComponentDetail,
onSwitchClick = onSwitchClick,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
)

is Provider -> ComponentList(
components = componentListUiState.provider,
navigateToComponentDetail = navigateToComponentDetail,
onSwitchClick = onSwitchClick,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
)
4 -> ComponentList(
components = componentListUiState.provider,
navigateToComponentDetail = navigateToComponentDetail,
onSwitchClick = onSwitchClick,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
)
}
}
}
LaunchedEffect(tabState) {
pagerState.animateScrollToPage(tabState.currentIndex)
}
LaunchedEffect(pagerState.currentPage) {
switchTab(tabState.items[pagerState.currentPage])
}
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package com.merxury.blocker.feature.appdetail.summary

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
Expand Down Expand Up @@ -52,7 +53,7 @@ fun SummaryContent(
onResetIfw: (String) -> Unit = {},
) {
val listState: LazyListState = rememberLazyListState()
Box(modifier) {
Box(modifier.fillMaxSize()) {
LazyColumn(
modifier = Modifier
.fillMaxWidth(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package com.merxury.blocker.feature.ruledetail
import android.content.res.Configuration
import androidx.compose.animation.core.FloatExponentialDecaySpec
import androidx.compose.animation.core.animateDecay
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
Expand All @@ -28,6 +29,8 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
Expand Down Expand Up @@ -328,6 +331,7 @@ private fun rememberToolbarState(toolbarHeightRange: IntRange): ToolbarState {
}
}

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun RuleDetailTabContent(
modifier: Modifier = Modifier,
Expand All @@ -344,35 +348,52 @@ fun RuleDetailTabContent(
onEnableAllClick: (List<ComponentItem>) -> Unit = { _ -> },
onSwitch: (String, String, Boolean) -> Unit = { _, _, _ -> },
) {
val pagerState = rememberPagerState(initialPage = tabState.currentIndex) { tabState.items.size }
val coroutineScope = rememberCoroutineScope()
Column(
modifier = modifier,
) {
BlockerTabRow(
selectedTabIndex = tabState.currentIndex,
selectedTabIndex = pagerState.currentPage,
containerColor = MaterialTheme.colorScheme.surfaceVariant,
) {
tabState.items.forEachIndexed { index, tabItem ->
BlockerTab(
selected = index == tabState.currentIndex,
onClick = { switchTab(tabItem) },
text = { Text(text = stringResource(id = tabItem.title)) },
selected = index == pagerState.currentPage,
onClick = {
switchTab(tabItem)
coroutineScope.launch {
pagerState.animateScrollToPage(index)
}
},
text = {
Text(
text = stringResource(
id = tabItem.title,
),
)
},
)
}
}
when (tabState.selectedItem) {
Description -> RuleDescription(rule = ruleInfoUiState.ruleInfo)
HorizontalPager(
state = pagerState,
) {
when (it) {
0 -> RuleDescription(rule = ruleInfoUiState.ruleInfo)

Applicable -> RuleMatchedAppList(
ruleMatchedAppListUiState = ruleMatchedAppListUiState,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
navigateToAppDetail = navigateToAppDetail,
onBlockAllClick = onBlockAllClick,
onEnableAllClick = onEnableAllClick,
onSwitch = onSwitch,
)
1 -> RuleMatchedAppList(
ruleMatchedAppListUiState = ruleMatchedAppListUiState,
onStopServiceClick = onStopServiceClick,
onLaunchActivityClick = onLaunchActivityClick,
onCopyNameClick = onCopyNameClick,
onCopyFullNameClick = onCopyFullNameClick,
navigateToAppDetail = navigateToAppDetail,
onBlockAllClick = onBlockAllClick,
onEnableAllClick = onEnableAllClick,
onSwitch = onSwitch,
)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package com.merxury.blocker.feature.ruledetail.component

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
Expand All @@ -42,7 +42,7 @@ fun RuleDescription(
Column(
modifier = modifier
.verticalScroll(rememberScrollState())
.fillMaxWidth()
.fillMaxSize()
.padding(16.dp),
) {
InfoItemHeading(description = listOf(rule.description))
Expand Down
Loading

0 comments on commit a1732e5

Please sign in to comment.