mirror of
https://github.com/nacabaro/vbhelper.git
synced 2026-10-01 07:31:37 +00:00
Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
366f425539 | ||
|
|
37076a9bf0 | ||
|
|
8c99046edb | ||
|
|
c990a495b7 | ||
|
|
0e61723db1 |
+28
-17
@@ -1,21 +1,23 @@
|
||||
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||
|
||||
plugins {
|
||||
alias(libs.plugins.android.application)
|
||||
alias(libs.plugins.kotlin.android)
|
||||
alias(libs.plugins.kotlin.compose)
|
||||
id("com.google.devtools.ksp") version "2.0.21-1.0.27"
|
||||
id("com.google.devtools.ksp") version "2.3.0"
|
||||
id("com.google.protobuf")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.github.nacabaro.vbhelper"
|
||||
compileSdk = 35
|
||||
compileSdk = 36
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "com.github.nacabaro.vbhelper"
|
||||
minSdk = 28
|
||||
targetSdk = 35
|
||||
targetSdk = 36
|
||||
versionCode = 1
|
||||
versionName = "Alpha 0.6.2"
|
||||
versionName = "Alpha 0.6.3"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
@@ -33,9 +35,7 @@ android {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
kotlinOptions {
|
||||
jvmTarget = "11"
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
compose = true
|
||||
}
|
||||
@@ -45,6 +45,12 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
kotlin {
|
||||
compilerOptions {
|
||||
jvmTarget = JvmTarget.JVM_11
|
||||
}
|
||||
}
|
||||
|
||||
protobuf {
|
||||
protoc {
|
||||
artifact = "com.google.protobuf:protoc:4.27.0"
|
||||
@@ -68,10 +74,13 @@ dependencies {
|
||||
implementation(libs.androidx.room.runtime)
|
||||
implementation(libs.vb.nfc.reader)
|
||||
implementation(libs.dim.reader)
|
||||
ksp(libs.androidx.room.compiler)
|
||||
annotationProcessor(libs.androidx.room.compiler)
|
||||
implementation(libs.androidx.core.ktx)
|
||||
implementation("androidx.room:room-ktx:2.6.1")
|
||||
implementation(libs.androidx.room.ktx)
|
||||
implementation(libs.androidx.datastore.preferences)
|
||||
implementation(libs.androidx.navigation.compose)
|
||||
implementation(libs.material)
|
||||
implementation(libs.protobuf.javalite)
|
||||
implementation(libs.androidx.compose.material)
|
||||
implementation(libs.androidx.lifecycle.runtime.ktx)
|
||||
implementation(libs.androidx.activity.compose)
|
||||
implementation(platform(libs.androidx.compose.bom))
|
||||
@@ -80,16 +89,18 @@ dependencies {
|
||||
implementation(libs.androidx.ui.graphics)
|
||||
implementation(libs.androidx.ui.tooling.preview)
|
||||
implementation(libs.androidx.material3)
|
||||
implementation(libs.androidx.compose.material.icons.extended)
|
||||
|
||||
debugImplementation(libs.androidx.ui.tooling)
|
||||
debugImplementation(libs.androidx.ui.test.manifest)
|
||||
|
||||
testImplementation(libs.junit)
|
||||
|
||||
ksp(libs.androidx.room.compiler)
|
||||
annotationProcessor(libs.androidx.room.compiler)
|
||||
|
||||
androidTestImplementation(libs.androidx.junit)
|
||||
androidTestImplementation(libs.androidx.espresso.core)
|
||||
androidTestImplementation(platform(libs.androidx.compose.bom))
|
||||
androidTestImplementation(libs.androidx.ui.test.junit4)
|
||||
debugImplementation(libs.androidx.ui.tooling)
|
||||
debugImplementation(libs.androidx.ui.test.manifest)
|
||||
implementation("androidx.navigation:navigation-compose:2.7.0")
|
||||
implementation("com.google.android.material:material:1.2.0")
|
||||
implementation(libs.protobuf.javalite)
|
||||
implementation("androidx.compose.material:material")
|
||||
implementation("androidx.datastore:datastore-preferences:1.1.7")
|
||||
}
|
||||
@@ -152,7 +152,8 @@ fun ItemDisplay(
|
||||
fun SpecialMissionsEntry(
|
||||
specialMission: SpecialMissions,
|
||||
modifier: Modifier = Modifier,
|
||||
onClickCard: () -> Unit = { },
|
||||
onClickMission: (Long) -> Unit = { },
|
||||
onClickCollect: (Long) -> Unit = { }
|
||||
) {
|
||||
val textValue = when (specialMission.missionType) {
|
||||
SpecialMission.Type.NONE -> stringResource(R.string.special_mission_none)
|
||||
@@ -219,10 +220,12 @@ fun SpecialMissionsEntry(
|
||||
Card(
|
||||
modifier = modifier,
|
||||
shape = androidx.compose.material.MaterialTheme.shapes.small,
|
||||
onClick = if (specialMission.status == SpecialMission.Status.COMPLETED || specialMission.status == SpecialMission.Status.FAILED) {
|
||||
onClickCard
|
||||
onClick = if (specialMission.status == SpecialMission.Status.COMPLETED) {
|
||||
{ onClickCollect(specialMission.id) }
|
||||
} else if (specialMission.status == SpecialMission.Status.UNAVAILABLE) {
|
||||
{ }
|
||||
} else {
|
||||
{ }
|
||||
{ onClickMission(specialMission.id) }
|
||||
},
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = color
|
||||
|
||||
@@ -2,6 +2,8 @@ package com.github.nacabaro.vbhelper.daos
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Query
|
||||
import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
@Dao
|
||||
interface SpecialMissionDao {
|
||||
@@ -12,4 +14,11 @@ interface SpecialMissionDao {
|
||||
WHERE id = :id
|
||||
""")
|
||||
suspend fun clearSpecialMission(id: Long)
|
||||
|
||||
@Query("""
|
||||
SELECT *
|
||||
FROM SpecialMissions
|
||||
WHERE id = :id
|
||||
""")
|
||||
fun getSpecialMission(id: Long): Flow<SpecialMissions>
|
||||
}
|
||||
+1
-2
@@ -1,9 +1,8 @@
|
||||
package com.github.nacabaro.vbhelper.screens.homeScreens
|
||||
|
||||
import com.github.cfogrady.vbnfc.vb.SpecialMission
|
||||
import com.github.nacabaro.vbhelper.dtos.ItemDtos
|
||||
|
||||
interface HomeScreenController {
|
||||
fun didAdventureMissionsFinish(onCompletion: (Boolean) -> Unit)
|
||||
fun clearSpecialMission(missionId: Long, missionCompletion: SpecialMission.Status, onCleared: (ItemDtos.PurchasedItem?, Int?) -> Unit)
|
||||
fun clearSpecialMission(missionId: Long, onCleared: (ItemDtos.PurchasedItem?, Int?) -> Unit)
|
||||
}
|
||||
+7
-3
@@ -33,13 +33,18 @@ class HomeScreenControllerImpl(
|
||||
}
|
||||
}
|
||||
|
||||
override fun clearSpecialMission(missionId: Long, missionCompletion: SpecialMission.Status, onCleared: (ItemDtos.PurchasedItem?, Int?) -> Unit) {
|
||||
override fun clearSpecialMission(missionId: Long, onCleared: (ItemDtos.PurchasedItem?, Int?) -> Unit) {
|
||||
componentActivity.lifecycleScope.launch {
|
||||
val missionStatus = database
|
||||
.specialMissionDao()
|
||||
.getSpecialMission(missionId)
|
||||
.first()
|
||||
|
||||
database
|
||||
.specialMissionDao()
|
||||
.clearSpecialMission(missionId)
|
||||
|
||||
if (missionCompletion == SpecialMission.Status.COMPLETED) {
|
||||
if (missionStatus.status == SpecialMission.Status.COMPLETED) {
|
||||
val randomItem = database
|
||||
.itemDao()
|
||||
.getAllItems()
|
||||
@@ -73,7 +78,6 @@ class HomeScreenControllerImpl(
|
||||
} else {
|
||||
onCleared(null, null)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
package com.github.nacabaro.vbhelper.screens.homeScreens.dialogs
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.Dialog
|
||||
import com.github.nacabaro.vbhelper.R
|
||||
|
||||
@Composable
|
||||
fun DeleteSpecialMissionDialog(
|
||||
onClickDismiss: () -> Unit,
|
||||
onClickDelete: () -> Unit
|
||||
) {
|
||||
Dialog(
|
||||
onDismissRequest = onClickDismiss
|
||||
) {
|
||||
Card {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(16.dp)
|
||||
) {
|
||||
Text(
|
||||
text = stringResource(R.string.home_special_mission_delete_main),
|
||||
textAlign = TextAlign.Center
|
||||
)
|
||||
Spacer(modifier = Modifier.padding(8.dp))
|
||||
Row {
|
||||
Button(
|
||||
onClick = onClickDismiss,
|
||||
modifier = Modifier
|
||||
.padding(8.dp)
|
||||
) {
|
||||
Text(text = stringResource(R.string.home_special_mission_delete_dismiss))
|
||||
}
|
||||
|
||||
Button(
|
||||
onClick = onClickDelete,
|
||||
modifier = Modifier
|
||||
.padding(8.dp)
|
||||
) {
|
||||
Text(text = stringResource(R.string.home_special_mission_delete_remove))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+28
-4
@@ -10,6 +10,10 @@ import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
@@ -26,6 +30,7 @@ import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreenControllerImpl
|
||||
import com.github.nacabaro.vbhelper.utils.BitmapData
|
||||
import java.util.Locale
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import com.github.nacabaro.vbhelper.screens.homeScreens.dialogs.DeleteSpecialMissionDialog
|
||||
|
||||
|
||||
@Composable
|
||||
@@ -39,6 +44,8 @@ fun VBDiMHomeScreen(
|
||||
contentPadding: PaddingValues,
|
||||
onClickCollect: (ItemDtos.PurchasedItem?, Int?) -> Unit
|
||||
) {
|
||||
var selectedSpecialMissionId by remember { mutableStateOf<Long>(-1) }
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(top = contentPadding.calculateTopPadding())
|
||||
@@ -183,11 +190,28 @@ fun VBDiMHomeScreen(
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(8.dp),
|
||||
) {
|
||||
homeScreenController
|
||||
.clearSpecialMission(mission.id, mission.status, onClickCollect)
|
||||
}
|
||||
onClickMission = { missionId ->
|
||||
selectedSpecialMissionId = missionId
|
||||
},
|
||||
onClickCollect = {
|
||||
homeScreenController
|
||||
.clearSpecialMission(selectedSpecialMissionId, onClickCollect)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (selectedSpecialMissionId.toInt() != -1) {
|
||||
DeleteSpecialMissionDialog(
|
||||
onClickDismiss = {
|
||||
selectedSpecialMissionId = -1
|
||||
},
|
||||
onClickDelete = {
|
||||
homeScreenController
|
||||
.clearSpecialMission(selectedSpecialMissionId, onClickCollect)
|
||||
selectedSpecialMissionId = -1
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
+22
-20
@@ -162,33 +162,35 @@ class ItemsScreenControllerImpl (
|
||||
ItemTypes.Win4.id -> 4
|
||||
else -> 0
|
||||
}
|
||||
|
||||
val specialMissionSlot = when (itemIcon) {
|
||||
ItemTypes.Step8k.id -> 0
|
||||
ItemTypes.Step4k.id -> 0
|
||||
ItemTypes.Vitals1000.id -> 1
|
||||
ItemTypes.Vitals250.id -> 1
|
||||
ItemTypes.Battle20.id -> 2
|
||||
ItemTypes.Battle5.id -> 2
|
||||
ItemTypes.Win10.id -> 3
|
||||
ItemTypes.Win4.id -> 3
|
||||
else -> 0
|
||||
}
|
||||
|
||||
val availableSpecialMissions = database
|
||||
.userCharacterDao()
|
||||
.getSpecialMissions(characterId)
|
||||
.first()
|
||||
|
||||
var firstUnavailableMissionSlot: Long = 0
|
||||
var watchId = 0
|
||||
|
||||
for ((index, mission) in availableSpecialMissions.first().withIndex()) {
|
||||
if (
|
||||
mission.status == SpecialMission.Status.UNAVAILABLE
|
||||
) {
|
||||
firstUnavailableMissionSlot = mission.id
|
||||
watchId = index + 1
|
||||
}
|
||||
}
|
||||
|
||||
val newSpecialMission = SpecialMissions(
|
||||
id = firstUnavailableMissionSlot,
|
||||
characterId = characterId,
|
||||
missionType = specialMissionType,
|
||||
var newSpecialMission = availableSpecialMissions[specialMissionSlot]
|
||||
newSpecialMission = SpecialMissions(
|
||||
id = newSpecialMission.id,
|
||||
characterId = newSpecialMission.characterId,
|
||||
goal = specialMissionGoal,
|
||||
timeLimitInMinutes = itemLength,
|
||||
watchId = watchId,
|
||||
status = SpecialMission.Status.AVAILABLE,
|
||||
watchId = newSpecialMission.watchId,
|
||||
progress = 0,
|
||||
timeElapsedInMinutes = 0
|
||||
status = SpecialMission.Status.AVAILABLE,
|
||||
timeElapsedInMinutes = 0,
|
||||
timeLimitInMinutes = itemLength,
|
||||
missionType = specialMissionType
|
||||
)
|
||||
|
||||
database
|
||||
|
||||
@@ -222,5 +222,8 @@
|
||||
<string name="special_mission_wins_progress">Won %1$d battles</string>
|
||||
<string name="special_mission_vitals_progress">Earned %1$d vitals</string>
|
||||
<string name="special_mission_icon_content_description">Special mission icon</string>
|
||||
<string name="home_special_mission_delete_main">Are you sure you want to delete this special mission with this progress?</string>
|
||||
<string name="home_special_mission_delete_dismiss">Dismiss</string>
|
||||
<string name="home_special_mission_delete_remove">Remove</string>
|
||||
|
||||
</resources>
|
||||
+20
-11
@@ -1,24 +1,32 @@
|
||||
[versions]
|
||||
agp = "8.13.2"
|
||||
datastore = "1.1.2"
|
||||
kotlin = "2.0.0"
|
||||
coreKtx = "1.15.0"
|
||||
datastore = "1.2.0"
|
||||
datastorePreferences = "1.2.0"
|
||||
kotlin = "2.3.0"
|
||||
coreKtx = "1.17.0"
|
||||
junit = "4.13.2"
|
||||
junitVersion = "1.2.1"
|
||||
espressoCore = "3.6.1"
|
||||
lifecycleRuntimeKtx = "2.8.7"
|
||||
activityCompose = "1.10.0"
|
||||
composeBom = "2025.01.00"
|
||||
protobufGradlePlugin = "0.9.4"
|
||||
protobufJavalite = "4.27.0"
|
||||
roomRuntime = "2.6.1"
|
||||
junitVersion = "1.3.0"
|
||||
espressoCore = "3.7.0"
|
||||
lifecycleRuntimeKtx = "2.10.0"
|
||||
activityCompose = "1.12.2"
|
||||
composeBom = "2026.01.00"
|
||||
material = "1.13.0"
|
||||
navigationCompose = "2.9.6"
|
||||
protobufGradlePlugin = "0.9.6"
|
||||
protobufJavalite = "4.33.4"
|
||||
roomRuntime = "2.8.4"
|
||||
vbNfcReader = "0.2.0-SNAPSHOT"
|
||||
dimReader = "2.1.0"
|
||||
|
||||
[libraries]
|
||||
androidx-compose-material = { module = "androidx.compose.material:material" }
|
||||
androidx-compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" }
|
||||
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
|
||||
androidx-datastore = { module = "androidx.datastore:datastore", version.ref = "datastore" }
|
||||
androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" }
|
||||
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" }
|
||||
androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomRuntime" }
|
||||
androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomRuntime" }
|
||||
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" }
|
||||
junit = { group = "junit", name = "junit", version.ref = "junit" }
|
||||
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
|
||||
@@ -33,6 +41,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin
|
||||
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
|
||||
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
|
||||
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
|
||||
material = { module = "com.google.android.material:material", version.ref = "material" }
|
||||
protobuf-gradle-plugin = { module = "com.google.protobuf:protobuf-gradle-plugin", version.ref = "protobufGradlePlugin" }
|
||||
protobuf-javalite = { module = "com.google.protobuf:protobuf-javalite", version.ref = "protobufJavalite" }
|
||||
vb-nfc-reader = { module = "com.github.cfogrady:vb-nfc-reader", version.ref = "vbNfcReader" }
|
||||
|
||||
Reference in New Issue
Block a user