Skip to content

Commit f5f270c

Browse files
committed
fixed boot_b
lowered minSdk to 29 bumped dependencies cleaned up warnings
1 parent 02a2090 commit f5f270c

29 files changed

+187
-157
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
/local.properties
44
/.idea
55
.DS_Store
6+
/app/release
67
/build
78
/captures
89
.externalNativeBuild

app/build.gradle

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
11
plugins {
2-
id 'com.android.application'
3-
id 'org.jetbrains.kotlin.android'
4-
id 'org.jetbrains.kotlin.kapt'
5-
id 'org.jetbrains.kotlin.plugin.serialization'
2+
alias(libs.plugins.android.application)
3+
alias(libs.plugins.devtools.ksp)
4+
alias(libs.plugins.kotlin.android)
5+
alias(libs.plugins.kotlin.serialization)
66
}
77

88
android {
9-
compileSdk 33
9+
compileSdk 34
1010

1111
defaultConfig {
1212
applicationId "com.github.capntrips.kernelflasher"
13-
minSdk 30
14-
targetSdk 33
15-
versionCode 14
16-
versionName "1.0.0-alpha14"
13+
minSdk 29
14+
targetSdk 34
15+
versionCode 15
16+
versionName "1.0.0-alpha15"
17+
18+
javaCompileOptions {
19+
annotationProcessorOptions {
20+
arguments += [
21+
"room.schemaLocation": "$projectDir/schemas".toString(),
22+
"room.incremental": "true"
23+
]
24+
}
25+
}
1726

1827
vectorDrawables {
1928
useSupportLibrary true
@@ -25,18 +34,21 @@ android {
2534
minifyEnabled false
2635
}
2736
}
37+
buildFeatures {
38+
aidl true
39+
}
2840
compileOptions {
29-
sourceCompatibility JavaVersion.VERSION_1_8
30-
targetCompatibility JavaVersion.VERSION_1_8
41+
sourceCompatibility JavaVersion.VERSION_17
42+
targetCompatibility JavaVersion.VERSION_17
3143
}
3244
kotlinOptions {
33-
jvmTarget = '1.8'
45+
jvmTarget = '17'
3446
}
3547
buildFeatures {
3648
compose true
3749
}
3850
composeOptions {
39-
kotlinCompilerExtensionVersion compiler_version
51+
kotlinCompilerExtensionVersion libs.versions.compose.compiler.get()
4052
}
4153
packagingOptions {
4254
resources {
@@ -47,26 +59,25 @@ android {
4759
}
4860

4961
dependencies {
50-
implementation "androidx.activity:activity-compose:$activity_version"
51-
implementation "androidx.appcompat:appcompat:$appcompat_version"
52-
implementation "androidx.compose.material3:material3:$material3_version"
53-
implementation "androidx.compose.foundation:foundation:$compose_version"
54-
implementation "androidx.compose.ui:ui:$compose_version"
55-
implementation "androidx.core:core-ktx:$core_version"
56-
implementation "androidx.core:core-splashscreen:$splashscreen_version"
57-
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
58-
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version"
59-
implementation "androidx.navigation:navigation-compose:$nav_version"
60-
implementation "androidx.room:room-runtime:$room_version"
61-
annotationProcessor "androidx.room:room-compiler:$room_version"
62-
kapt "androidx.room:room-compiler:$room_version"
63-
implementation "com.github.topjohnwu.libsu:core:$libsu_version"
64-
implementation "com.github.topjohnwu.libsu:io:$libsu_version"
65-
implementation "com.github.topjohnwu.libsu:nio:$libsu_version"
66-
implementation "com.github.topjohnwu.libsu:service:$libsu_version"
67-
implementation "com.google.accompanist:accompanist-navigation-animation:$accompanist_version"
68-
implementation "com.google.accompanist:accompanist-swiperefresh:$accompanist_version"
69-
implementation "com.google.android.material:material:$material_version"
70-
implementation("com.squareup.okhttp3:okhttp:$okhttp_version")
71-
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization_version"
62+
implementation(libs.androidx.activity.compose)
63+
implementation(libs.androidx.appcompat)
64+
implementation(libs.androidx.compose.material)
65+
implementation(libs.androidx.compose.material3)
66+
implementation(libs.androidx.compose.foundation)
67+
implementation(libs.androidx.compose.ui)
68+
implementation(libs.androidx.core.ktx)
69+
implementation(libs.androidx.core.splashscreen)
70+
implementation(libs.androidx.lifecycle.runtime.ktx)
71+
implementation(libs.androidx.lifecycle.viewmodel.compose)
72+
implementation(libs.androidx.navigation.compose)
73+
implementation(libs.androidx.room.runtime)
74+
annotationProcessor(libs.androidx.room.compiler)
75+
ksp(libs.androidx.room.compiler)
76+
implementation(libs.libsu.core)
77+
implementation(libs.libsu.io)
78+
implementation(libs.libsu.nio)
79+
implementation(libs.libsu.service)
80+
implementation(libs.material)
81+
implementation(libs.okhttp)
82+
implementation(libs.kotlinx.serialization.json)
7283
}

app/src/main/java/com/github/capntrips/kernelflasher/MainActivity.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.activity.compose.BackHandler
1616
import androidx.activity.compose.setContent
1717
import androidx.compose.animation.AnimatedVisibilityScope
1818
import androidx.compose.animation.ExperimentalAnimationApi
19+
import androidx.compose.material.ExperimentalMaterialApi
1920
import androidx.compose.material3.ExperimentalMaterial3Api
2021
import androidx.compose.runtime.Composable
2122
import androidx.compose.ui.res.stringResource
@@ -26,6 +27,9 @@ import androidx.core.view.WindowCompat
2627
import androidx.lifecycle.ViewModelProvider
2728
import androidx.lifecycle.viewmodel.compose.viewModel
2829
import androidx.navigation.NavBackStackEntry
30+
import androidx.navigation.compose.NavHost
31+
import androidx.navigation.compose.composable
32+
import androidx.navigation.compose.rememberNavController
2933
import com.github.capntrips.kernelflasher.ui.screens.RefreshableScreen
3034
import com.github.capntrips.kernelflasher.ui.screens.backups.BackupsContent
3135
import com.github.capntrips.kernelflasher.ui.screens.backups.SlotBackupsContent
@@ -40,20 +44,18 @@ import com.github.capntrips.kernelflasher.ui.screens.updates.UpdatesChangelogCon
4044
import com.github.capntrips.kernelflasher.ui.screens.updates.UpdatesContent
4145
import com.github.capntrips.kernelflasher.ui.screens.updates.UpdatesViewContent
4246
import com.github.capntrips.kernelflasher.ui.theme.KernelFlasherTheme
43-
import com.google.accompanist.navigation.animation.AnimatedNavHost
44-
import com.google.accompanist.navigation.animation.composable
45-
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
4647
import com.topjohnwu.superuser.Shell
4748
import com.topjohnwu.superuser.ipc.RootService
4849
import com.topjohnwu.superuser.nio.FileSystemManager
4950
import kotlinx.serialization.ExperimentalSerializationApi
5051
import java.io.File
5152

5253

54+
@ExperimentalAnimationApi
55+
@ExperimentalMaterialApi
56+
@ExperimentalMaterial3Api
5357
@ExperimentalSerializationApi
5458
@ExperimentalUnitApi
55-
@ExperimentalMaterial3Api
56-
@ExperimentalAnimationApi
5759
class MainActivity : ComponentActivity() {
5860
companion object {
5961
const val TAG: String = "MainActivity"
@@ -164,7 +166,7 @@ class MainActivity : ComponentActivity() {
164166
}
165167
}
166168
setContent {
167-
val navController = rememberAnimatedNavController()
169+
val navController = rememberNavController()
168170
viewModel = viewModel {
169171
val application = checkNotNull(get(ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY))
170172
MainViewModel(application, fileSystemManager, navController)
@@ -200,7 +202,7 @@ class MainActivity : ComponentActivity() {
200202
SlotBackupsContent(slotViewModel, backupsViewModel, slotSuffix, navController)
201203
}
202204
}
203-
AnimatedNavHost(navController = navController, startDestination = "main") {
205+
NavHost(navController = navController, startDestination = "main") {
204206
composable("main") {
205207
RefreshableScreen(mainViewModel, navController, swipeEnabled = true) {
206208
MainContent(mainViewModel, navController)

app/src/main/java/com/github/capntrips/kernelflasher/common/PartitionUtil.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.github.capntrips.kernelflasher.common.types.partitions.FstabEntry
66
import com.topjohnwu.superuser.Shell
77
import com.topjohnwu.superuser.nio.ExtendedFile
88
import com.topjohnwu.superuser.nio.FileSystemManager
9-
import kotlinx.serialization.decodeFromString
109
import kotlinx.serialization.json.Json
1110
import java.io.File
1211
import java.security.DigestOutputStream
@@ -27,13 +26,13 @@ object PartitionUtil {
2726
val AvailablePartitions = mutableListOf<String>()
2827

2928
private var fileSystemManager: FileSystemManager? = null
30-
private var bootDevice: File? = null
29+
private var bootParent: File? = null
3130

3231
fun init(context: Context, fileSystemManager: FileSystemManager) {
3332
this.fileSystemManager = fileSystemManager
3433
val fstabEntry = findPartitionFstabEntry(context, "boot")
3534
if (fstabEntry != null) {
36-
bootDevice = File(fstabEntry.blkDevice).parentFile
35+
bootParent = File(fstabEntry.blkDevice).parentFile
3736
}
3837
val activeSlotSuffix = Shell.cmd("getprop ro.boot.slot_suffix").exec().out[0]
3938
for (partitionName in PartitionNames) {
@@ -67,10 +66,13 @@ object PartitionUtil {
6766
}
6867
} else {
6968
blockDevice = fileSystemManager!!.getFile(fstabEntry.blkDevice)
69+
if (blockDevice.name != "$partitionName$slotSuffix") {
70+
blockDevice = fileSystemManager!!.getFile(blockDevice.parentFile, "$partitionName$slotSuffix")
71+
}
7072
}
7173
}
72-
if (blockDevice == null) {
73-
val siblingDevice = if (bootDevice != null) fileSystemManager!!.getFile(bootDevice!!, partitionName) else null
74+
if (blockDevice == null || !blockDevice.exists()) {
75+
val siblingDevice = if (bootParent != null) fileSystemManager!!.getFile(bootParent!!, "$partitionName$slotSuffix") else null
7476
val physicalDevice = fileSystemManager!!.getFile("/dev/block/by-name/$partitionName$slotSuffix")
7577
val logicalDevice = fileSystemManager!!.getFile("/dev/block/mapper/$partitionName$slotSuffix")
7678
if (siblingDevice?.exists() == true) {

app/src/main/java/com/github/capntrips/kernelflasher/common/extensions/ExtendedFile.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ object ExtendedFile {
1616
@Suppress("unused")
1717
fun ExtendedFile.writeText(text: String, charset: Charset = Charsets.UTF_8): Unit = writeBytes(text.toByteArray(charset))
1818

19-
@Suppress("MemberVisibilityCanBePrivate")
2019
fun ExtendedFile.inputStream(): InputStream = newInputStream()
2120

22-
@Suppress("MemberVisibilityCanBePrivate")
2321
fun ExtendedFile.outputStream(): OutputStream = newOutputStream()
2422
}

app/src/main/java/com/github/capntrips/kernelflasher/common/types/partitions/Partitions.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ data class Partitions(
77
val boot: String? = null,
88
val vbmeta: String? = null,
99
val dtbo: String? = null,
10-
val vendor_boot: String? = null,
11-
val vendor_kernel_boot: String? = null,
12-
val vendor_dlkm: String? = null,
13-
val init_boot: String? = null,
10+
@Suppress("PropertyName") val vendor_boot: String? = null,
11+
@Suppress("PropertyName") val vendor_kernel_boot: String? = null,
12+
@Suppress("PropertyName") val vendor_dlkm: String? = null,
13+
@Suppress("PropertyName") val init_boot: String? = null,
1414
val recovery: String? = null
1515
) {
1616
companion object {

app/src/main/java/com/github/capntrips/kernelflasher/ui/components/FlashButton.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.activity.result.contract.ActivityResultContracts
66
import androidx.compose.animation.ExperimentalAnimationApi
77
import androidx.compose.foundation.layout.fillMaxWidth
88
import androidx.compose.foundation.shape.RoundedCornerShape
9+
import androidx.compose.material.ExperimentalMaterialApi
910
import androidx.compose.material3.ExperimentalMaterial3Api
1011
import androidx.compose.material3.OutlinedButton
1112
import androidx.compose.material3.Text
@@ -18,9 +19,10 @@ import androidx.compose.ui.unit.ExperimentalUnitApi
1819
import androidx.compose.ui.unit.dp
1920
import com.github.capntrips.kernelflasher.MainActivity
2021

21-
@ExperimentalUnitApi
2222
@ExperimentalAnimationApi
23+
@ExperimentalMaterialApi
2324
@ExperimentalMaterial3Api
25+
@ExperimentalUnitApi
2426
@Composable
2527
fun FlashButton(
2628
buttonText: String,

app/src/main/java/com/github/capntrips/kernelflasher/ui/components/FlashList.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.compose.material3.Text
1616
import androidx.compose.runtime.Composable
1717
import androidx.compose.runtime.LaunchedEffect
1818
import androidx.compose.runtime.getValue
19+
import androidx.compose.runtime.mutableIntStateOf
1920
import androidx.compose.runtime.mutableStateOf
2021
import androidx.compose.runtime.remember
2122
import androidx.compose.runtime.setValue
@@ -85,10 +86,9 @@ fun Modifier.scrollbar(
8586
width: Dp = 6.dp
8687
): Modifier = composed {
8788
var visibleItemsCountChanged = false
88-
var visibleItemsCount by remember { mutableStateOf(state.layoutInfo.visibleItemsInfo.size) }
89+
var visibleItemsCount by remember { mutableIntStateOf(state.layoutInfo.visibleItemsInfo.size) }
8990
if (visibleItemsCount != state.layoutInfo.visibleItemsInfo.size) {
9091
visibleItemsCountChanged = true
91-
@Suppress("UNUSED_VALUE")
9292
visibleItemsCount = state.layoutInfo.visibleItemsInfo.size
9393
}
9494

app/src/main/java/com/github/capntrips/kernelflasher/ui/components/SlotCard.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import androidx.compose.animation.AnimatedVisibility
44
import androidx.compose.material3.ExperimentalMaterial3Api
55
import androidx.compose.material3.MaterialTheme
66
import androidx.compose.runtime.Composable
7-
import androidx.compose.runtime.mutableStateOf
7+
import androidx.compose.runtime.mutableIntStateOf
88
import androidx.compose.runtime.remember
99
import androidx.compose.ui.res.stringResource
1010
import androidx.compose.ui.text.font.FontFamily
@@ -34,7 +34,7 @@ fun SlotCard(
3434
}
3535
}
3636
) {
37-
val cardWidth = remember { mutableStateOf(0) }
37+
val cardWidth = remember { mutableIntStateOf(0) }
3838
DataRow(
3939
label = stringResource(R.string.boot_sha1),
4040
value = viewModel.sha1.substring(0, 8),

app/src/main/java/com/github/capntrips/kernelflasher/ui/screens/RefreshableScreen.kt

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ import androidx.compose.foundation.layout.padding
1717
import androidx.compose.foundation.layout.statusBars
1818
import androidx.compose.foundation.rememberScrollState
1919
import androidx.compose.foundation.verticalScroll
20+
import androidx.compose.material.ExperimentalMaterialApi
2021
import androidx.compose.material.icons.Icons
2122
import androidx.compose.material.icons.filled.ArrowBack
23+
import androidx.compose.material.pullrefresh.PullRefreshIndicator
24+
import androidx.compose.material.pullrefresh.pullRefresh
25+
import androidx.compose.material.pullrefresh.rememberPullRefreshState
2226
import androidx.compose.material3.ExperimentalMaterial3Api
2327
import androidx.compose.material3.Icon
2428
import androidx.compose.material3.IconButton
@@ -34,10 +38,8 @@ import androidx.compose.ui.unit.dp
3438
import androidx.navigation.NavController
3539
import com.github.capntrips.kernelflasher.R
3640
import com.github.capntrips.kernelflasher.ui.screens.main.MainViewModel
37-
import com.google.accompanist.swiperefresh.SwipeRefresh
38-
import com.google.accompanist.swiperefresh.SwipeRefreshIndicator
39-
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
4041

42+
@ExperimentalMaterialApi
4143
@ExperimentalMaterial3Api
4244
@Composable
4345
fun RefreshableScreen(
@@ -48,6 +50,10 @@ fun RefreshableScreen(
4850
) {
4951
val statusBar = WindowInsets.statusBars.only(WindowInsetsSides.Top).asPaddingValues()
5052
val navigationBars = WindowInsets.navigationBars.asPaddingValues()
53+
val context = LocalContext.current
54+
val state = rememberPullRefreshState(viewModel.isRefreshing, onRefresh = {
55+
viewModel.refresh(context)
56+
})
5157
Scaffold(
5258
topBar = {
5359
Box(
@@ -85,24 +91,11 @@ fun RefreshableScreen(
8591
}
8692
}
8793
) { paddingValues ->
88-
val context = LocalContext.current
89-
SwipeRefresh(
94+
Box(
9095
modifier = Modifier
9196
.padding(paddingValues)
97+
.pullRefresh(state, swipeEnabled)
9298
.fillMaxSize(),
93-
state = rememberSwipeRefreshState(viewModel.isRefreshing),
94-
swipeEnabled = swipeEnabled,
95-
// TODO: move onRefresh to signature?
96-
onRefresh = { viewModel.refresh(context) },
97-
indicator = { state, trigger ->
98-
SwipeRefreshIndicator(
99-
state = state,
100-
refreshTriggerDistance = trigger,
101-
backgroundColor = MaterialTheme.colorScheme.background,
102-
contentColor = MaterialTheme.colorScheme.primaryContainer,
103-
scale = true
104-
)
105-
}
10699
) {
107100
Column(
108101
modifier = Modifier
@@ -111,6 +104,14 @@ fun RefreshableScreen(
111104
.verticalScroll(rememberScrollState()),
112105
content = content
113106
)
107+
PullRefreshIndicator(
108+
viewModel.isRefreshing,
109+
state = state,
110+
modifier = Modifier.align(Alignment.TopCenter),
111+
backgroundColor = MaterialTheme.colorScheme.background,
112+
contentColor = MaterialTheme.colorScheme.primaryContainer,
113+
scale = true
114+
)
114115
}
115116
}
116117
}

0 commit comments

Comments
 (0)