~cytrogen/vbhelper

c990a495b77035ec486af782561974df3123ffe1 — nacabaro 2 months ago 0e61723
Fix Special Missions a bit more
Now they should behave a bit better, and it will not allow the watch to have multiple missions of the same type, plus you can now delete special missions.
M app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt => app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt +7 -4
@@ 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

M app/src/main/java/com/github/nacabaro/vbhelper/daos/SpecialMissionDao.kt => app/src/main/java/com/github/nacabaro/vbhelper/daos/SpecialMissionDao.kt +9 -0
@@ 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>
}
\ No newline at end of file

M app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenController.kt => app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenController.kt +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)
}
\ No newline at end of file

M app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenControllerImpl.kt => app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenControllerImpl.kt +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)
            }

        }
    }
}
\ No newline at end of file

A app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/dialogs/DeleteSpecialMissionDialog.kt => app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/dialogs/DeleteSpecialMissionDialog.kt +56 -0
@@ 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))
                    }
                }
            }
        }
    }
}
\ No newline at end of file

M app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/VBDiMHomeScreen.kt => app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/VBDiMHomeScreen.kt +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
            }
        )
    }
}
\ No newline at end of file

M app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt => app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt +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

M app/src/main/res/values/strings.xml => app/src/main/res/values/strings.xml +3 -0
@@ 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>
\ No newline at end of file