This commit is contained in:
machiav3lli 2022-10-08 01:50:07 +02:00
parent 9a5607c52d
commit 25a3c2691f
5 changed files with 266 additions and 299 deletions

View File

@ -1,30 +1,31 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" <uses-permission
tools:ignore="QueryAllPackagesPermission" /> android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" /> <uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
<application <application
android:name=".MainApplication" android:name=".MainApplication"
android:allowBackup="false" android:allowBackup="false"
android:icon="${appIcon}" android:icon="${appIcon}"
android:label="@string/application_name" android:label="@string/application_name"
android:roundIcon="${appIconRound}" android:roundIcon="${appIconRound}"
android:supportsRtl="true" android:supportsRtl="true"
tools:ignore="GoogleAppIndexingWarning">
android:theme="@style/Theme.Main.Amoled" android:theme="@style/Theme.Main.Amoled"
tools:ignore="GoogleAppIndexingWarning">
<receiver <receiver
android:name=".MainApplication$BootReceiver" android:name=".MainApplication$BootReceiver"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.BOOT_COMPLETED" />
@ -33,10 +34,10 @@
</receiver> </receiver>
<activity <activity
android:name=".ui.activities.MainActivityX" android:name=".ui.activities.MainActivityX"
android:exported="true" android:exported="true"
android:launchMode="singleTask" android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -59,8 +60,8 @@
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data <data
android:host="details" android:host="details"
android:scheme="market" /> android:scheme="market" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
@ -82,29 +83,29 @@
</activity> </activity>
<activity <activity
android:name=".ui.activities.PrefsActivityX" android:name=".ui.activities.PrefsActivityX"
android:exported="true" android:exported="true"
android:launchMode="singleTask" android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<service android:name=".service.SyncService" /> <service android:name=".service.SyncService" />
<service <service
android:name=".service.SyncService$Job" android:name=".service.SyncService$Job"
android:exported="true" android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" /> android:permission="android.permission.BIND_JOB_SERVICE" />
<service android:name=".service.DownloadService" /> <service android:name=".service.DownloadService" />
<service <service
android:name=".installer.InstallerService" android:name=".installer.InstallerService"
android:exported="false" /> android:exported="false" />
<provider <provider
android:name=".content.Cache$Provider" android:name=".content.Cache$Provider"
android:authorities="${applicationId}.provider.cache" android:authorities="${applicationId}.provider.cache"
android:exported="false" android:exported="false"
android:grantUriPermissions="true" /> android:grantUriPermissions="true" />
</application> </application>

View File

@ -1,7 +1,6 @@
package com.machiav3lli.fdroid.ui.pages package com.machiav3lli.fdroid.ui.pages
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@ -35,10 +34,8 @@ import com.machiav3lli.fdroid.ui.compose.ProductsVerticalRecycler
import com.machiav3lli.fdroid.ui.compose.components.CategoryChip import com.machiav3lli.fdroid.ui.compose.components.CategoryChip
import com.machiav3lli.fdroid.ui.compose.icons.Phosphor import com.machiav3lli.fdroid.ui.compose.icons.Phosphor
import com.machiav3lli.fdroid.ui.compose.icons.phosphor.FunnelSimple import com.machiav3lli.fdroid.ui.compose.icons.phosphor.FunnelSimple
import com.machiav3lli.fdroid.ui.compose.theme.AppTheme
import com.machiav3lli.fdroid.ui.navigation.NavItem import com.machiav3lli.fdroid.ui.navigation.NavItem
import com.machiav3lli.fdroid.ui.viewmodels.MainNavFragmentViewModelX import com.machiav3lli.fdroid.ui.viewmodels.MainNavFragmentViewModelX
import com.machiav3lli.fdroid.utility.isDarkTheme
import com.machiav3lli.fdroid.utility.onLaunchClick import com.machiav3lli.fdroid.utility.onLaunchClick
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -78,83 +75,75 @@ fun ExplorePage(viewModel: MainNavFragmentViewModelX) {
} }
} }
AppTheme( Column(
darkTheme = when (Preferences[Preferences.Key.Theme]) { Modifier
is Preferences.Theme.System -> isSystemInDarkTheme() .background(MaterialTheme.colorScheme.background)
is Preferences.Theme.SystemBlack -> isSystemInDarkTheme() .fillMaxSize()
else -> isDarkTheme
}
) { ) {
Column( Row(
Modifier modifier = Modifier.padding(horizontal = 6.dp),
.background(MaterialTheme.colorScheme.background) verticalAlignment = Alignment.CenterVertically,
.fillMaxSize()
) { ) {
Row( var favoriteFilter by remember {
modifier = Modifier.padding(horizontal = 6.dp), mutableStateOf(false)
verticalAlignment = Alignment.CenterVertically,
) {
var favoriteFilter by remember {
mutableStateOf(false)
}
SuggestionChip(
shape = MaterialTheme.shapes.medium,
colors = SuggestionChipDefaults.suggestionChipColors(
containerColor = MaterialTheme.colorScheme.surface,
labelColor = MaterialTheme.colorScheme.onSurface,
),
onClick = {
mainActivityX.navigateSortFilter(NavItem.Explore.destination)
},
icon = {
Icon(
modifier = Modifier.size(18.dp),
imageVector = Phosphor.FunnelSimple,
contentDescription = stringResource(id = R.string.sort_filter)
)
},
label = {
Text(text = stringResource(id = R.string.sort_filter))
}
)
Spacer(modifier = Modifier.weight(1f))
CategoryChip(
category = stringResource(id = R.string.favorite_applications),
isSelected = favoriteFilter,
onSelected = {
favoriteFilter = !favoriteFilter
viewModel.sections.postValue(
if (it) Section.FAVORITE
else Section.All
)
}
)
} }
ProductsVerticalRecycler(
productsList = products, SuggestionChip(
repositories = repositoriesMap, shape = MaterialTheme.shapes.medium,
favorites = favorites, colors = SuggestionChipDefaults.suggestionChipColors(
modifier = Modifier containerColor = MaterialTheme.colorScheme.surface,
.fillMaxWidth() labelColor = MaterialTheme.colorScheme.onSurface,
.weight(1f), ),
onUserClick = { item -> onClick = {
mainActivityX.navigateProduct(item.packageName) mainActivityX.navigateSortFilter(NavItem.Explore.destination)
}, },
onFavouriteClick = { item -> icon = {
viewModel.setFavorite( Icon(
item.packageName, modifier = Modifier.size(18.dp),
!favorites.contains(item.packageName) imageVector = Phosphor.FunnelSimple,
contentDescription = stringResource(id = R.string.sort_filter)
) )
}, },
getInstalled = { installedList?.get(it.packageName) } label = {
) { item -> Text(text = stringResource(id = R.string.sort_filter))
val installed = installedList?.get(item.packageName) }
if (installed != null && installed.launcherActivities.isNotEmpty()) )
context.onLaunchClick(installed, mainActivityX.supportFragmentManager) Spacer(modifier = Modifier.weight(1f))
else CategoryChip(
mainActivityX.syncConnection.binder?.installApps(listOf(item)) category = stringResource(id = R.string.favorite_applications),
} isSelected = favoriteFilter,
onSelected = {
favoriteFilter = !favoriteFilter
viewModel.sections.postValue(
if (it) Section.FAVORITE
else Section.All
)
}
)
}
ProductsVerticalRecycler(
productsList = products,
repositories = repositoriesMap,
favorites = favorites,
modifier = Modifier
.fillMaxWidth()
.weight(1f),
onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName)
},
onFavouriteClick = { item ->
viewModel.setFavorite(
item.packageName,
!favorites.contains(item.packageName)
)
},
getInstalled = { installedList?.get(it.packageName) }
) { item ->
val installed = installedList?.get(item.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty())
context.onLaunchClick(installed, mainActivityX.supportFragmentManager)
else
mainActivityX.syncConnection.binder?.installApps(listOf(item))
} }
} }
} }

View File

@ -2,7 +2,6 @@ package com.machiav3lli.fdroid.ui.pages
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@ -43,10 +42,8 @@ import com.machiav3lli.fdroid.ui.compose.icons.phosphor.CaretDown
import com.machiav3lli.fdroid.ui.compose.icons.phosphor.CaretUp import com.machiav3lli.fdroid.ui.compose.icons.phosphor.CaretUp
import com.machiav3lli.fdroid.ui.compose.icons.phosphor.Download import com.machiav3lli.fdroid.ui.compose.icons.phosphor.Download
import com.machiav3lli.fdroid.ui.compose.icons.phosphor.FunnelSimple import com.machiav3lli.fdroid.ui.compose.icons.phosphor.FunnelSimple
import com.machiav3lli.fdroid.ui.compose.theme.AppTheme
import com.machiav3lli.fdroid.ui.navigation.NavItem import com.machiav3lli.fdroid.ui.navigation.NavItem
import com.machiav3lli.fdroid.ui.viewmodels.MainNavFragmentViewModelX import com.machiav3lli.fdroid.ui.viewmodels.MainNavFragmentViewModelX
import com.machiav3lli.fdroid.utility.isDarkTheme
import com.machiav3lli.fdroid.utility.onLaunchClick import com.machiav3lli.fdroid.utility.onLaunchClick
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -87,133 +84,125 @@ fun InstalledPage(viewModel: MainNavFragmentViewModelX) {
} }
} }
AppTheme( var updatesVisible by remember(secondaryList) { mutableStateOf(true) }
darkTheme = when (Preferences[Preferences.Key.Theme]) {
is Preferences.Theme.System -> isSystemInDarkTheme()
is Preferences.Theme.SystemBlack -> isSystemInDarkTheme()
else -> isDarkTheme
}
) {
var updatesVisible by remember(secondaryList) { mutableStateOf(true) }
Column( Column(
Modifier Modifier
.background(MaterialTheme.colorScheme.background) .background(MaterialTheme.colorScheme.background)
.fillMaxSize() .fillMaxSize()
) { ) {
AnimatedVisibility(visible = secondaryList.orEmpty().isNotEmpty()) { AnimatedVisibility(visible = secondaryList.orEmpty().isNotEmpty()) {
Column { Column {
Row( Row(
modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) {
ElevatedButton(
colors = ButtonDefaults.elevatedButtonColors(
contentColor = MaterialTheme.colorScheme.primary
),
onClick = { updatesVisible = !updatesVisible }
) { ) {
ElevatedButton( Text(
colors = ButtonDefaults.elevatedButtonColors( modifier = Modifier.padding(start = 4.dp),
contentColor = MaterialTheme.colorScheme.primary text = stringResource(id = R.string.updates),
), textAlign = TextAlign.Center,
onClick = { updatesVisible = !updatesVisible } style = MaterialTheme.typography.titleSmall
) { )
Text( Spacer(modifier = Modifier.width(8.dp))
modifier = Modifier.padding(start = 4.dp), Icon(
text = stringResource(id = R.string.updates), modifier = Modifier.size(18.dp),
textAlign = TextAlign.Center, imageVector = if (updatesVisible) Phosphor.CaretUp else Phosphor.CaretDown,
style = MaterialTheme.typography.titleSmall contentDescription = stringResource(id = R.string.updates)
)
Spacer(modifier = Modifier.width(8.dp))
Icon(
modifier = Modifier.size(18.dp),
imageVector = if (updatesVisible) Phosphor.CaretUp else Phosphor.CaretDown,
contentDescription = stringResource(id = R.string.updates)
)
}
Spacer(modifier = Modifier.weight(1f))
SuggestionChip(
shape = MaterialTheme.shapes.medium,
colors = SuggestionChipDefaults.suggestionChipColors(
containerColor = MaterialTheme.colorScheme.surface,
labelColor = MaterialTheme.colorScheme.onSurface,
),
onClick = {
secondaryList?.let {
mainActivityX.syncConnection.binder?.updateApps(
it.map(
Product::toItem
)
)
}
},
icon = {
Icon(
modifier = Modifier.size(18.dp),
imageVector = Phosphor.Download,
contentDescription = stringResource(id = R.string.update_all)
)
},
label = {
Text(text = stringResource(id = R.string.update_all))
}
) )
} }
AnimatedVisibility(visible = updatesVisible) { Spacer(modifier = Modifier.weight(1f))
ProductsHorizontalRecycler(secondaryList, repositoriesMap) { item -> SuggestionChip(
mainActivityX.navigateProduct(item.packageName) shape = MaterialTheme.shapes.medium,
colors = SuggestionChipDefaults.suggestionChipColors(
containerColor = MaterialTheme.colorScheme.surface,
labelColor = MaterialTheme.colorScheme.onSurface,
),
onClick = {
secondaryList?.let {
mainActivityX.syncConnection.binder?.updateApps(
it.map(
Product::toItem
)
)
}
},
icon = {
Icon(
modifier = Modifier.size(18.dp),
imageVector = Phosphor.Download,
contentDescription = stringResource(id = R.string.update_all)
)
},
label = {
Text(text = stringResource(id = R.string.update_all))
} }
)
}
AnimatedVisibility(visible = updatesVisible) {
ProductsHorizontalRecycler(secondaryList, repositoriesMap) { item ->
mainActivityX.navigateProduct(item.packageName)
} }
} }
} }
Row( }
modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), Row(
verticalAlignment = Alignment.CenterVertically modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp),
) { verticalAlignment = Alignment.CenterVertically
Text( ) {
text = stringResource(id = R.string.installed_applications), Text(
modifier = Modifier.weight(1f), text = stringResource(id = R.string.installed_applications),
) modifier = Modifier.weight(1f),
SuggestionChip( )
shape = MaterialTheme.shapes.medium, SuggestionChip(
colors = SuggestionChipDefaults.suggestionChipColors( shape = MaterialTheme.shapes.medium,
containerColor = MaterialTheme.colorScheme.surface, colors = SuggestionChipDefaults.suggestionChipColors(
labelColor = MaterialTheme.colorScheme.onSurface, containerColor = MaterialTheme.colorScheme.surface,
), labelColor = MaterialTheme.colorScheme.onSurface,
onClick = { ),
mainActivityX.navigateSortFilter(NavItem.Installed.destination) onClick = {
}, mainActivityX.navigateSortFilter(NavItem.Installed.destination)
icon = {
Icon(
modifier = Modifier.size(18.dp),
imageVector = Phosphor.FunnelSimple,
contentDescription = stringResource(id = R.string.sort_filter)
)
},
label = {
Text(text = stringResource(id = R.string.sort_filter))
}
)
}
ProductsVerticalRecycler(
productsList = primaryList?.sortedBy { it.label.lowercase() },
repositories = repositoriesMap,
favorites = favorites,
modifier = Modifier
.fillMaxWidth()
.weight(1f),
onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName)
}, },
onFavouriteClick = { item -> icon = {
viewModel.setFavorite( Icon(
item.packageName, modifier = Modifier.size(18.dp),
!favorites.contains(item.packageName) imageVector = Phosphor.FunnelSimple,
contentDescription = stringResource(id = R.string.sort_filter)
) )
}, },
getInstalled = { installedList?.get(it.packageName) } label = {
) { item -> Text(text = stringResource(id = R.string.sort_filter))
val installed = installedList?.get(item.packageName) }
if (installed != null && installed.launcherActivities.isNotEmpty()) )
context.onLaunchClick(installed, mainActivityX.supportFragmentManager) }
else ProductsVerticalRecycler(
mainActivityX.syncConnection.binder?.installApps(listOf(item)) productsList = primaryList?.sortedBy { it.label.lowercase() },
} repositories = repositoriesMap,
favorites = favorites,
modifier = Modifier
.fillMaxWidth()
.weight(1f),
onUserClick = { item ->
mainActivityX.navigateProduct(item.packageName)
},
onFavouriteClick = { item ->
viewModel.setFavorite(
item.packageName,
!favorites.contains(item.packageName)
)
},
getInstalled = { installedList?.get(it.packageName) }
) { item ->
val installed = installedList?.get(item.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty())
context.onLaunchClick(installed, mainActivityX.supportFragmentManager)
else
mainActivityX.syncConnection.binder?.installApps(listOf(item))
} }
} }
} }

View File

@ -1,7 +1,6 @@
package com.machiav3lli.fdroid.ui.pages package com.machiav3lli.fdroid.ui.pages
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -32,10 +31,8 @@ import com.machiav3lli.fdroid.ui.compose.ProductsHorizontalRecycler
import com.machiav3lli.fdroid.ui.compose.components.ProductsListItem import com.machiav3lli.fdroid.ui.compose.components.ProductsListItem
import com.machiav3lli.fdroid.ui.compose.icons.Phosphor import com.machiav3lli.fdroid.ui.compose.icons.Phosphor
import com.machiav3lli.fdroid.ui.compose.icons.phosphor.FunnelSimple import com.machiav3lli.fdroid.ui.compose.icons.phosphor.FunnelSimple
import com.machiav3lli.fdroid.ui.compose.theme.AppTheme
import com.machiav3lli.fdroid.ui.navigation.NavItem import com.machiav3lli.fdroid.ui.navigation.NavItem
import com.machiav3lli.fdroid.ui.viewmodels.MainNavFragmentViewModelX import com.machiav3lli.fdroid.ui.viewmodels.MainNavFragmentViewModelX
import com.machiav3lli.fdroid.utility.isDarkTheme
import com.machiav3lli.fdroid.utility.onLaunchClick import com.machiav3lli.fdroid.utility.onLaunchClick
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -77,85 +74,77 @@ fun LatestPage(viewModel: MainNavFragmentViewModelX) {
} }
} }
AppTheme( LazyColumn(
darkTheme = when (Preferences[Preferences.Key.Theme]) { Modifier
is Preferences.Theme.System -> isSystemInDarkTheme() .background(MaterialTheme.colorScheme.background)
is Preferences.Theme.SystemBlack -> isSystemInDarkTheme() .fillMaxSize(),
else -> isDarkTheme
}
) { ) {
LazyColumn( item {
Modifier Text(
.background(MaterialTheme.colorScheme.background) text = stringResource(id = R.string.new_applications),
.fillMaxSize(), modifier = Modifier.padding(8.dp)
) { )
item { ProductsHorizontalRecycler(secondaryList, repositoriesMap) { item ->
mainActivityX.navigateProduct(item.packageName)
}
}
item {
Row(
modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text( Text(
text = stringResource(id = R.string.new_applications), text = stringResource(id = R.string.recently_updated),
modifier = Modifier.padding(8.dp) modifier = Modifier.weight(1f),
) )
ProductsHorizontalRecycler(secondaryList, repositoriesMap) { item -> SuggestionChip(
mainActivityX.navigateProduct(item.packageName) shape = MaterialTheme.shapes.medium,
} colors = SuggestionChipDefaults.suggestionChipColors(
} containerColor = MaterialTheme.colorScheme.surface,
item { labelColor = MaterialTheme.colorScheme.onSurface,
Row( ),
modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), onClick = {
verticalAlignment = Alignment.CenterVertically mainActivityX.navigateSortFilter(NavItem.Latest.destination)
) { },
Text( icon = {
text = stringResource(id = R.string.recently_updated), Icon(
modifier = Modifier.weight(1f), modifier = Modifier.size(18.dp),
) imageVector = Phosphor.FunnelSimple,
SuggestionChip( contentDescription = stringResource(id = R.string.sort_filter)
shape = MaterialTheme.shapes.medium,
colors = SuggestionChipDefaults.suggestionChipColors(
containerColor = MaterialTheme.colorScheme.surface,
labelColor = MaterialTheme.colorScheme.onSurface,
),
onClick = {
mainActivityX.navigateSortFilter(NavItem.Latest.destination)
},
icon = {
Icon(
modifier = Modifier.size(18.dp),
imageVector = Phosphor.FunnelSimple,
contentDescription = stringResource(id = R.string.sort_filter)
)
},
label = {
Text(text = stringResource(id = R.string.sort_filter))
}
)
}
}
items(
items = primaryList?.map { it.toItem() } ?: emptyList(),
) { item ->
ProductsListItem(
item = item,
repo = repositoriesMap[item.repositoryId],
isFavorite = favorites.contains(item.packageName),
onUserClick = { mainActivityX.navigateProduct(it.packageName) },
onFavouriteClick = {
viewModel.setFavorite(
it.packageName,
!favorites.contains(it.packageName)
) )
}, },
installed = installedList?.get(item.packageName), label = {
onActionClick = { Text(text = stringResource(id = R.string.sort_filter))
val installed = installedList?.get(it.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty())
context.onLaunchClick(
installed,
mainActivityX.supportFragmentManager
)
else
mainActivityX.syncConnection.binder?.installApps(listOf(it))
} }
) )
} }
} }
items(
items = primaryList?.map { it.toItem() } ?: emptyList(),
) { item ->
ProductsListItem(
item = item,
repo = repositoriesMap[item.repositoryId],
isFavorite = favorites.contains(item.packageName),
onUserClick = { mainActivityX.navigateProduct(it.packageName) },
onFavouriteClick = {
viewModel.setFavorite(
it.packageName,
!favorites.contains(it.packageName)
)
},
installed = installedList?.get(item.packageName),
onActionClick = {
val installed = installedList?.get(it.packageName)
if (installed != null && installed.launcherActivities.isNotEmpty())
context.onLaunchClick(
installed,
mainActivityX.supportFragmentManager
)
else
mainActivityX.syncConnection.binder?.installApps(listOf(it))
}
)
}
} }
} }

View File

@ -41,7 +41,6 @@ fun PrefsOtherPage() {
Preferences.Key.ProxyHost, Preferences.Key.ProxyHost,
Preferences.Key.ProxyPort, Preferences.Key.ProxyPort,
) )
val infoPrefs = emptyList<Preferences.Key<*>>()
Scaffold( Scaffold(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()