Skip to content

Commit 24e3631

Browse files
author
Simon Schubert
committed
Release
1 parent b566a4b commit 24e3631

22 files changed

Lines changed: 224 additions & 166 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
![Icon](https://raw.githubusercontent.com/SimonSchubert/LinuxCommandLibrary/master/art/web_hi_res_144.png)
44

5-
The app currently has **6488** manual pages, **22+** basic categories and a bunch of general terminal tips. It works 100% offline, doesn't need an internet connection and has no tracking software.
5+
The app currently has **6513** manual pages, **22+** basic categories and a bunch of general terminal tips. It works 100% offline, doesn't need an internet connection and has no tracking software.
66

77
[![Play Store](https://raw.githubusercontent.com/SimonSchubert/LinuxCommandBibliotheca/master/art/play_store_badge.png)](https://play.google.com/store/apps/details?id=com.inspiredandroid.linuxcommandbibliotheca)
88
[![F-Droid](https://raw.githubusercontent.com/SimonSchubert/LinuxCommandBibliotheca/master/art/fdroid_badge.png)](https://f-droid.org/en/packages/com.inspiredandroid.linuxcommandbibliotheca/)

android/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ android {
3939
applicationId = "com.inspiredandroid.linuxcommandbibliotheca"
4040
minSdk = 24
4141
targetSdk = 35
42-
versionCode = 94
42+
versionCode = 95
4343
versionName = project.version.toString()
4444
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
4545
}

android/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
android:icon="@mipmap/ic_launcher"
99
android:label="@string/app_name"
1010
android:supportsRtl="true"
11-
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
11+
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar">
1212
<activity
1313
android:name=".MainActivity"
1414
android:exported="true">

android/src/main/java/com/inspiredandroid/linuxcommandbibliotheca/MainActivity.kt

Lines changed: 107 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import androidx.appcompat.app.AppCompatActivity
1111
import androidx.compose.foundation.background
1212
import androidx.compose.foundation.layout.Box
1313
import androidx.compose.foundation.layout.padding
14-
import androidx.compose.foundation.layout.safeDrawingPadding
14+
import androidx.compose.foundation.layout.statusBarsPadding
15+
import androidx.compose.foundation.layout.systemBarsPadding
16+
import androidx.compose.material.MaterialTheme
1517
import androidx.compose.material.Scaffold
1618
import androidx.compose.runtime.Composable
1719
import androidx.compose.runtime.mutableStateOf
@@ -30,18 +32,14 @@ import com.inspiredandroid.linuxcommandbibliotheca.ui.composables.BottomBar
3032
import com.inspiredandroid.linuxcommandbibliotheca.ui.composables.TopBar
3133
import com.inspiredandroid.linuxcommandbibliotheca.ui.screens.basiccategories.BasicCategoriesScreen
3234
import com.inspiredandroid.linuxcommandbibliotheca.ui.screens.basicgroups.BasicGroupsScreen
33-
import com.inspiredandroid.linuxcommandbibliotheca.ui.screens.basicgroups.BasicGroupsViewModel
3435
import com.inspiredandroid.linuxcommandbibliotheca.ui.screens.commanddetail.CommandDetailScreen
35-
import com.inspiredandroid.linuxcommandbibliotheca.ui.screens.commanddetail.CommandDetailViewModel
3636
import com.inspiredandroid.linuxcommandbibliotheca.ui.screens.commandlist.CommandListScreen
37-
import com.inspiredandroid.linuxcommandbibliotheca.ui.screens.commandlist.CommandListViewModel
3837
import com.inspiredandroid.linuxcommandbibliotheca.ui.screens.tips.TipsScreen
3938
import com.inspiredandroid.linuxcommandbibliotheca.ui.theme.LinuxTheme
39+
import com.inspiredandroid.linuxcommandbibliotheca.ui.theme.LocalCustomColors
4040
import com.linuxcommandlibrary.shared.hasDatabase
4141
import com.linuxcommandlibrary.shared.initDatabase
4242
import org.koin.android.ext.android.inject
43-
import org.koin.androidx.compose.koinViewModel
44-
import org.koin.core.parameter.parametersOf
4543

4644
/* Copyright 2022 Simon Schubert
4745
*
@@ -76,12 +74,20 @@ class MainActivity : AppCompatActivity() {
7674
initDatabase(this)
7775

7876
setContent {
79-
Box(
80-
Modifier
81-
.background(Color(0xFFd34747))
82-
.safeDrawingPadding(),
83-
) {
84-
LinuxApp()
77+
LinuxTheme {
78+
Box(
79+
Modifier
80+
.background(MaterialTheme.colors.primary)
81+
.statusBarsPadding(),
82+
) {
83+
Box(
84+
Modifier
85+
.background(LocalCustomColors.current.navBarBackground)
86+
.systemBarsPadding(),
87+
) {
88+
LinuxApp()
89+
}
90+
}
8591
}
8692
}
8793
}
@@ -102,105 +108,100 @@ fun LinuxApp() {
102108
navController.navigate(it)
103109
}
104110

105-
LinuxTheme {
106-
Scaffold(
107-
topBar = {
108-
TopBar(
109-
navBackStackEntry,
110-
searchTextValue,
111-
onNavigateBack = {
112-
navController.popBackStack()
113-
},
114-
)
115-
},
116-
bottomBar = {
117-
BottomBar(navController)
118-
},
119-
) { innerPadding ->
111+
Scaffold(
112+
topBar = {
113+
TopBar(
114+
navBackStackEntry = navBackStackEntry,
115+
textFieldValue = searchTextValue,
116+
onNavigateBack = {
117+
navController.popBackStack()
118+
},
119+
)
120+
},
121+
bottomBar = {
122+
BottomBar(navController)
123+
},
124+
) { innerPadding ->
120125

121-
NavHost(
122-
navController,
123-
startDestination = Screen.Basics.route,
124-
Modifier.padding(innerPadding),
126+
NavHost(
127+
navController = navController,
128+
startDestination = Screen.Basics.route,
129+
modifier = Modifier.padding(innerPadding),
130+
) {
131+
composable(
132+
Screen.Basics.route,
133+
deepLinks = listOf(
134+
navDeepLink { uriPattern = "$DEEPLINK_URI/basics" },
135+
navDeepLink { uriPattern = "$DEEPLINK_URI/basics.html" },
136+
),
125137
) {
126-
composable(
127-
Screen.Basics.route,
128-
deepLinks = listOf(
129-
navDeepLink { uriPattern = "$DEEPLINK_URI/basics" },
130-
navDeepLink { uriPattern = "$DEEPLINK_URI/basics.html" },
131-
),
132-
) {
133-
BasicCategoriesScreen(onNavigate)
134-
}
135-
composable(
136-
Screen.Commands.route,
137-
deepLinks = listOf(
138-
navDeepLink { uriPattern = "$DEEPLINK_URI/" },
139-
navDeepLink { uriPattern = "$DEEPLINK_URI/index.html" },
140-
),
141-
) {
142-
val viewModel = koinViewModel<CommandListViewModel>()
143-
144-
CommandListScreen(
145-
searchTextValue.value.text,
146-
viewModel,
147-
onNavigate,
138+
BasicCategoriesScreen(onNavigate)
139+
}
140+
composable(
141+
Screen.Commands.route,
142+
deepLinks = listOf(
143+
navDeepLink { uriPattern = "$DEEPLINK_URI/" },
144+
navDeepLink { uriPattern = "$DEEPLINK_URI/index.html" },
145+
),
146+
) {
147+
CommandListScreen(
148+
searchText = searchTextValue.value.text,
149+
onNavigate = onNavigate,
150+
)
151+
}
152+
composable(
153+
Screen.Tips.route,
154+
deepLinks = listOf(
155+
navDeepLink { uriPattern = "$DEEPLINK_URI/tips" },
156+
navDeepLink { uriPattern = "$DEEPLINK_URI/tips.html" },
157+
),
158+
) {
159+
TipsScreen(onNavigate)
160+
}
161+
composable(
162+
"basicgroups?categoryId={categoryId}&categoryName={categoryName}",
163+
arguments = listOf(
164+
navArgument("categoryId") { defaultValue = "" },
165+
navArgument("categoryName") {},
166+
),
167+
deepLinks = listOf(
168+
navDeepLink {
169+
uriPattern = "$DEEPLINK_URI/basic/{categoryName}.html"
170+
},
171+
navDeepLink { uriPattern = "$DEEPLINK_URI/basic/{categoryName}" },
172+
),
173+
) { backStackEntry ->
174+
val categoryId = backStackEntry.getCategoryId()
175+
if (categoryId != null) {
176+
BasicGroupsScreen(
177+
categoryId = categoryId,
178+
onNavigate = onNavigate,
148179
)
149-
}
150-
composable(
151-
Screen.Tips.route,
152-
deepLinks = listOf(
153-
navDeepLink { uriPattern = "$DEEPLINK_URI/tips" },
154-
navDeepLink { uriPattern = "$DEEPLINK_URI/tips.html" },
155-
),
156-
) {
180+
} else {
181+
// open tips screen on invalid deeplink parameters
157182
TipsScreen(onNavigate)
158183
}
159-
composable(
160-
"basicgroups?categoryId={categoryId}&categoryName={categoryName}",
161-
arguments = listOf(
162-
navArgument("categoryId") { defaultValue = "" },
163-
navArgument("categoryName") {},
164-
),
165-
deepLinks = listOf(
166-
navDeepLink {
167-
uriPattern = "$DEEPLINK_URI/basic/{categoryName}.html"
168-
},
169-
navDeepLink { uriPattern = "$DEEPLINK_URI/basic/{categoryName}" },
170-
),
171-
) { backStackEntry ->
172-
val categoryId = backStackEntry.getCategoryId()
173-
if (categoryId != null) {
174-
val viewModel = koinViewModel<BasicGroupsViewModel>(
175-
parameters = { parametersOf(categoryId) },
176-
)
177-
BasicGroupsScreen(onNavigate, viewModel)
178-
} else {
179-
// open tips screen on invalid deeplink parameters
180-
TipsScreen(onNavigate)
181-
}
182-
}
183-
composable(
184-
"command?commandId={commandId}&commandName={commandName}",
185-
arguments = listOf(
186-
navArgument("commandId") { defaultValue = "" },
187-
navArgument("commandName") {},
188-
),
189-
deepLinks = listOf(
190-
navDeepLink { uriPattern = "$DEEPLINK_URI/man/{commandName}.html" },
191-
navDeepLink { uriPattern = "$DEEPLINK_URI/man/{commandName}" },
192-
),
193-
) { backStackEntry ->
194-
val commandId = backStackEntry.getCommandId()
195-
if (commandId != null) {
196-
val viewModel = koinViewModel<CommandDetailViewModel>(
197-
parameters = { parametersOf(commandId) },
198-
)
199-
CommandDetailScreen(onNavigate, viewModel)
200-
} else {
201-
// open tips screen on invalid deeplink parameters
202-
TipsScreen(onNavigate)
203-
}
184+
}
185+
composable(
186+
"command?commandId={commandId}&commandName={commandName}",
187+
arguments = listOf(
188+
navArgument("commandId") { defaultValue = "" },
189+
navArgument("commandName") {},
190+
),
191+
deepLinks = listOf(
192+
navDeepLink { uriPattern = "$DEEPLINK_URI/man/{commandName}.html" },
193+
navDeepLink { uriPattern = "$DEEPLINK_URI/man/{commandName}" },
194+
),
195+
) { backStackEntry ->
196+
val commandId = backStackEntry.getCommandId()
197+
if (commandId != null) {
198+
CommandDetailScreen(
199+
commandId = commandId,
200+
onNavigate = onNavigate,
201+
)
202+
} else {
203+
// open tips screen on invalid deeplink parameters
204+
TipsScreen(onNavigate)
204205
}
205206
}
206207
}

android/src/main/java/com/inspiredandroid/linuxcommandbibliotheca/PreferenceUtil.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ class PreferenceUtil(private val context: Context) {
4646
companion object {
4747
const val KEY_BOOKMARKS = "KEY_BOOKMARKS"
4848
const val KEY_DATABASE_VERSION = "DATABASE_VERSION"
49-
const val CURRENT_DATABASE_VERSION = 9
49+
const val CURRENT_DATABASE_VERSION = 10
5050
}
5151
}

android/src/main/java/com/inspiredandroid/linuxcommandbibliotheca/ui/composables/BottomBar.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.compose.ui.unit.dp
1616
import androidx.navigation.NavGraph.Companion.findStartDestination
1717
import androidx.navigation.NavHostController
1818
import com.inspiredandroid.linuxcommandbibliotheca.Screen
19+
import com.inspiredandroid.linuxcommandbibliotheca.ui.theme.LocalCustomColors
1920

2021
/* Copyright 2022 Simon Schubert
2122
*
@@ -42,13 +43,16 @@ fun BottomBar(navController: NavHostController) {
4243
// TODO: read current route from navcontroller
4344
val selectedRoute = rememberSaveable { mutableStateOf(Screen.Basics.route) }
4445

45-
BottomNavigation(backgroundColor = MaterialTheme.colors.surface) {
46+
BottomNavigation(
47+
backgroundColor = LocalCustomColors.current.navBarBackground,
48+
elevation = 0.dp,
49+
) {
4650
items.forEach { screen ->
4751
BottomNavigationItem(
4852
icon = {
4953
Icon(
50-
painterResource(id = screen.drawableRes),
51-
null,
54+
painter = painterResource(id = screen.drawableRes),
55+
contentDescription = null,
5256
modifier = Modifier.size(24.dp),
5357
)
5458
},

android/src/main/java/com/inspiredandroid/linuxcommandbibliotheca/ui/composables/TopBar.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ fun TopBar(
9090
}) {
9191
Icon(
9292
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
93-
modifier = Modifier,
9493
contentDescription = stringResource(id = R.string.back),
9594
)
9695
}
@@ -117,6 +116,7 @@ fun TopBar(
117116
unfocusedIndicatorColor = Color.Transparent,
118117
backgroundColor = Color.Transparent,
119118
cursorColor = LocalContentColor.current.copy(alpha = LocalContentAlpha.current),
119+
trailingIconColor = Color.White,
120120
),
121121
trailingIcon = {
122122
IconButton(onClick = {

android/src/main/java/com/inspiredandroid/linuxcommandbibliotheca/ui/screens/InitializeDatabaseScreen.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.fillMaxSize
77
import androidx.compose.foundation.layout.padding
88
import androidx.compose.foundation.layout.size
99
import androidx.compose.material.LinearProgressIndicator
10+
import androidx.compose.material.MaterialTheme
1011
import androidx.compose.material.Text
1112
import androidx.compose.runtime.Composable
1213
import androidx.compose.runtime.LaunchedEffect
@@ -44,7 +45,11 @@ fun InitializeDatabaseScreen(onFinish: () -> Unit = {}) {
4445
.size(240.dp)
4546
.align(Alignment.CenterHorizontally),
4647
)
47-
Text("Initialize database", modifier = Modifier.align(Alignment.CenterHorizontally))
48+
Text(
49+
"Initialize database",
50+
color = MaterialTheme.colors.onSurface,
51+
modifier = Modifier.align(Alignment.CenterHorizontally),
52+
)
4853
LinearProgressIndicator(
4954
progress = status.intValue.div(100f),
5055
modifier = Modifier.padding(top = 16.dp),

android/src/main/java/com/inspiredandroid/linuxcommandbibliotheca/ui/screens/basicgroups/BasicGroupsScreen.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import com.inspiredandroid.linuxcommandbibliotheca.ui.composables.CommandView
2020
import com.linuxcommandlibrary.shared.databaseHelper
2121
import com.linuxcommandlibrary.shared.getCommandList
2222
import databases.BasicGroup
23+
import org.koin.androidx.compose.koinViewModel
24+
import org.koin.core.parameter.parametersOf
2325

2426
/* Copyright 2022 Simon Schubert
2527
*
@@ -38,8 +40,11 @@ import databases.BasicGroup
3840

3941
@Composable
4042
fun BasicGroupsScreen(
43+
categoryId: Long,
44+
viewModel: BasicGroupsViewModel = koinViewModel<BasicGroupsViewModel>(
45+
parameters = { parametersOf(categoryId) },
46+
),
4147
onNavigate: (String) -> Unit = {},
42-
viewModel: BasicGroupsViewModel,
4348
) {
4449
LazyColumn(Modifier.fillMaxSize()) {
4550
items(

0 commit comments

Comments
 (0)