Home > OS >  How to return a List field as an empty list "[]" in Android Studio?
How to return a List field as an empty list "[]" in Android Studio?

Time:11-03

So I have been tackling this issue for a couple of days now. I have a Data class that is used to send information back into the API. In this instance, I have this x amount of fields. In these fields, there are three List fields with different types, as such.

The Data Classes

data class ApiSurveySiteUpdateBody(
        @SerializedName("UserId") val userId: Int,
        @SerializedName("SStatusId") val sStatusId: Int,
        @SerializedName("SSId") val sSId: Int,
        @SerializedName("SPONum") val sPoNum: Int,
        @SerializedName("WorkPerformanceTypeId") val workPerformTypeId: Int,
        @SerializedName("SSAddressId") val sSAddressId: Int,
        @SerializedName("WorktoPerformDate") val workToBePerformedDate: String,
        @SerializedName("CableRun") val cableRun: String,
        @SerializedName("Entrance") val entranceInfo: String,
        @SerializedName("DoorLockHardware") val doorLockHardware: String,
        @SerializedName("HandicapOperator") val handicapOperator: String,
        @SerializedName("DeviceComplete") val completedPrimaryDeviceList: List<Int>,
        @SerializedName("TemplateId") val templateId: Int,
        @SerializedName("NewDeviceList") val newDeviceList: List<ApiNewDeviceList> = emptyList(),
        @SerializedName("UpdateDeviceList") val updateDeviceList: List<ApiUpdateDeviceList> = emptyList(),
        @SerializedName("RemoveDeviceList") val removedDeviceList: List<ApiRemovedDeviceList> = emptyList()
)

The Converter function

 private fun getSomeRequestBody(
            dbInfo: DbFormWithEList,
            apiSurveySiteMedias: List<ApiSSMediaInfo>
        )
                : ApiSSUpdateBody {
            val updateRequestApi = ApiSSUpdateBody(
                userId = dbInfo.sSDbInfo.userId,
                sSId = dbInfo.sSDbInfo.sSId,
                sStatusId = dbInfo.sStatusDbInfo.sSId,
                sPoNum = dbInfo.sSDbInfo.sPoNumber,
                workPerformTypeId = dbInfo.sSDbInfo.workPerformTypeId,
                sSAddressId = dbInfo.sSDbInfo.sSAddressId,
                workToBePerformedDate = dbInfo.sSDbInfo.workToBePerformedDate,
                cableRun = dbInfo.sSDbInfo.cableRun,
                entranceInfo = dbInfo.sSDbInfo.entranceInfo,
                doorLockHardware = dbInfo.sSDbInfo.doorLockHardware,
                handicapOperator = dbInfo.sSDbInfo.handicapOperator,
                completedPrimaryDeviceList = dbInfo.sSDbInfo.completedPrimaryDeviceList.toIntList(),
                templateId = dbInfo.sSDbInfo.templateId,
                newDeviceList = List(dbInfo.equipmentList.size) { i -> // “NewDeviceList”
                    val dbEquipmentInfo = dbInfo.equipmentList[i].sSEquipmentDbInfo
                    Log.d(TAG, "NewDeviceListDB $dbEquipmentInfo")
                    val secondaryDeviceCheckedStatus = dbEquipmentInfo.secondaryDeviceCheckedStatus
                    val isDuplicateDeviceInUpdatePhase = dbEquipmentInfo.isDeviceUpdateMode
                    
                    if (sDeviceCheckedS == CHECKED_YES && !isDuplicateDUP){
                        val newDeviceListRequestBody =  ApiNewDeviceList(
                            secondaryDeviceId = dbEquipmentInfo.secondaryDeviceId,
                            deviceInstanceId = dbEquipmentInfo.deviceInstanceId.toString(),
                            mediaNameList = dbEquipmentInfo.mediaNames,
                            deviceSerialNumber = dbEquipmentInfo.deviceSerialNumber,
                            devicePartNumber = dbEquipmentInfo.devicePartNumber,
                            deviceManufacturerName = dbEquipmentInfo.deviceManufacturer,
                            deviceInstallationDate = DateUtil.dateToStringUTCSS(dbEquipmentInfo.deviceInstallationDate),
                            deviceLocation = dbEquipmentInfo.locationInfo,
                            deviceTechnicianNotes = dbEquipmentInfo.deviceTechnicianNotes
                        )
                        Log.d(TAG, "newDeviceListRequestBodyAPI $newDeviceListRequestBody")
                        newDeviceListRequestBody
                    }
                    else if (sDeviceCheckedS == CHECKED_NO){
                        apiDeviceListMapperUpdateSS.sendDeviceNotExistsInNewDeviceList(dbEquipmentInfo)
                    }
                    else {
                        apiDeviceListMapperUpdateSS.sendEmptyNewDeviceList()
                    }
                },

                updateDeviceList = (List(dbInfo.equipmentList.size) { i ->
                    val dbEquipmentInfo = dbInfo.equipmentList[i].sSEquipmentDbInfo
                    Log.d("UpdatingSiteSurvey", "UpdateDeviceListDB $dbEquipmentInfo")
                    val secondaryDeviceCheckedStatus = dbEquipmentInfo.secondaryDeviceCheckedStatus
                    val isDuplicateDeviceInUpdatePhase = dbEquipmentInfo.isDeviceUpdateMode
                     if (secondaryDeviceCheckedStatus == CHECKED_YES && isDuplicateDeviceInUpdatePhase){
                        val updateDeviceListRequestBody =  ApiUpdateDeviceList(
                                deviceEquipmentId = dbEquipmentInfo.deviceEquipmentId,
                                secondaryDeviceId = dbEquipmentInfo.secondaryDeviceId,
                                deviceInstanceId = dbEquipmentInfo.deviceInstanceId.toString(),
                                deviceSerialNumber = dbEquipmentInfo.deviceSerialNumber,
                                devicePartNumber = dbEquipmentInfo.devicePartNumber,
                                deviceManufacturerName = dbEquipmentInfo.deviceManufacturer,
                                deviceInstallationDate = DateUtil.dateToStringUTCSiteSurvey(dbEquipmentInfo.deviceInstallationDate),
                                deviceLocation = dbEquipmentInfo.locationInfo,
                                deviceTechnicianNotes = dbEquipmentInfo.deviceTechnicianNotes
                        )
                        Log.d(TAG, "updateDeviceListRequestBodyAPI $updateDeviceListRequestBody")
                        updateDeviceListRequestBody
                    } else Unit.apply {  } //<- the issue is here 
    
                }) as List<ApiUpdateDeviceList>,
                removedDeviceList = List(dbInfo.sSDbInfo.removedDeviceList.size) { i ->
                    val dbRemovedMediaItem = dbInfo.sSDbInfo.removedDeviceList[i]
                    Log.d(TAG, "RemovedListDB $dbRemovedMediaItem")
                   
    

                    if (dbRemovedMediaItem.removedDeviceEquipmentId == null && dbRemovedMediaItem.removedMediaName.isNullOrEmpty()){
                       val removeDevice =  apiDeviceListMapperUpdateSiteSurvey.removeDevice(dbRemovedMediaItem)
                        Log.d(TAG, "removeDevice $removeDevice")
                        removeDevice
                    }else{
                        val removeMediaForExistingDevice = apiDeviceListMapperUpdateSS.removeMediaForExistingDevice(dbRemovedMediaItem)
                        Log.d(TAG, "removeMediaForExistingDevice $removeMediaForExistingDevice")
                        removeMediaForExistingDevice
                    }
                }
            )
            Log.d(TAG, "MainUpdateRequestAPI $updateRequestApi")
            return updateRequestApi
        }

The goal is to have the else statement that is highlighted to return an emptyList "[]" to that updateDeviceList field. I have tried a few ways but never was able to return that exact empty list "[]". Any help will be appreciated. Thank you.

CodePudding user response:

I can't tell if you want (1) the whole list to be invalidated and become empty if any item in the iteration fails the if check, or if you just want (2) to filter out items that fail the if check. But here's how I would approach each of those tasks.

I am breaking out the conversion between DbEquipmentInfo and ApiUpdateDeviceList into a separate extension function (fun DbEquipmentInfo.toApiUpdateDeviceList(): ApiUpdateDeviceList). Not just to avoid code repetition, but also to keep the logic code easy to read, and make the project's code more maintainable in general.

1.

val isValid = dbInfo.equipmentList.all { dbEquipmentInfo -> 
        val secondaryDeviceCheckedStatus = dbEquipmentInfo.secondaryDeviceCheckedStatus
        val isDuplicateDeviceInUpdatePhase = dbEquipmentInfo.isDeviceUpdateMode
        secondaryDeviceCheckedStatus == CHECKED_YES && isDuplicateDeviceInUpdatePhase
    }
updateDeviceList = 
    if (isValid) dbInfo.equipmentList.map { it.toApiUpdateDeviceList() }
    else emptyList()
updateDeviceList = dbInfo.equipmentList.filter { dbEquipmentInfo -> 
        val secondaryDeviceCheckedStatus = dbEquipmentInfo.secondaryDeviceCheckedStatus
        val isDuplicateDeviceInUpdatePhase = dbEquipmentInfo.isDeviceUpdateMode
        secondaryDeviceCheckedStatus == CHECKED_YES && isDuplicateDeviceInUpdatePhase
    }.map { it.toApiUpdateDeviceList() }
  • Related