core
This module provides core functionality, data models, types, and utilities used across all Smart1 SDK modules.
Overview
The core module contains:
Common data models used throughout the SDK
Result types for operation outcomes
Error handling structures
Common types and enums
Constants
Conversion utilities
Main Components
ResultS1SDK
Generic result type for SDK operations.
Sealed Class:
Success<T>(data: T)- Successful operation with dataError<E>(error: E)- Failed operation with error
ErrorS1SDK
Interface for SDK error types. Implementations include:
Error Types:
ApiError- API-related errorsCommonError- Common validation and logic errorsSdkInitConfigError- SDK initialization errorsApiListError- API list operation errorsRegisterUserOperatorError- API Errors when creating a new User Operator
Models
SessionData
Contains user session information.
Properties:
email: String- User's emailphoneNumber: String- User's phone numberuserId: Long- User identifierroleId: Long- Role identifierpermission: List<String>- List of permissionsclientName: String- Client nameroleName: String- Role namecompanyIds: List<Long>- Associated company IDsaccessToken: String- Access tokenexpireTokenUTC: String- Token expiration (UTC)tokenType: String- Token typeaddedOn: String- Account creation datekey: String- KeyaccessTokenFirebase: String- Firebase access tokenaccessTokenPubSub: String- PubSub access tokenprojectId: String- Project ID for PubSubtopicName: String- Topic name for PubSub
CoordinatesData
Geographic coordinates representation.
Properties:
latitude: Double- Latitude (-90 to 90)longitude: Double- Longitude (-180 to 180)
DataSet
Paginated data container.
Properties:
data: List<T>- List of itemspaginationInfo: PaginationInfo- Pagination metadata
PaginationInfo
Pagination metadata.
Properties:
currentPage: Int- Current page numbertotalPages: Int- Total number of pagestotalRecords: Int- Total number of recordspageSize: Int- Items per page
CapacityInfo
Capacity information for orders, routes, etc.
Properties:
name: String- Capacity type namevalue: Double- Capacity valueunit: String- Unit of measurement
Types
ApiLogicalOperator
Logical operators for API queries.
Values:
AND- Logical AND operationOR- Logical OR operation
ApiSearchType
Search types for API queries.
Values:
EXACT- Exact match searchCONTAINS- Partial match search
ApiSortType
Sort order types.
Values:
ASC- Ascending orderDESC- Descending order
FleetType
Fleet type classifications.
Values:
OWN- Own fleetTHIRD- Third party fleetMIXED- Mixed fleetUNKNOWN- Unknown fleet type
LoadType
Load type classifications.
Values:
REAR- Rear loadSIDE- Side loadMIXED- Mixed loadUNKNOWN- Unknown load type
PlaceStatusType
Place status types.
Values:
ACTIVE- Active placeINACTIVE- Inactive placeDELETED- Deleted placeUNKNOWN- Unknown status
Constants
Common constants used across the SDK.
Values:
DEFAULT_RECORD_QUANTITY_PER_PAGE: Int- Default pagination size (100)EMPTY_STR: String- Empty string constant ("")INT_INVALID: Int- Invalid integer marker (-1)LONG_INVALID: Long- Invalid long marker (-1L)DOUBLE_INVALID: Double- Invalid double marker (-1.0)
Usage Examples
Working with ResultS1SDK
import com.servinformacion.smart1sdk.android.core.ResultS1SDK
import com.servinformacion.smart1sdk.android.core.error.ErrorS1SDK
suspend fun fetchData(): ResultS1SDK<String, ErrorS1SDK> {
return try {
val data = performOperation()
ResultS1SDK.Success(data)
} catch (e: Exception) {
ResultS1SDK.Error(ErrorS1SDK.UnknownError(e.message))
}
}
fun handleResult(result: ResultS1SDK<String, ErrorS1SDK>) {
when (result) {
is ResultS1SDK.Success -> {
println("Success: ${result.data}")
}
is ResultS1SDK.Error -> {
when (val error = result.error) {
is ApiError -> println("API Error")
is CommonError -> println("Common Error")
is DbError -> println("Database Error")
is SdkInitConfigError -> println("SDK Init Error")
is ApiListError -> println("API List Error")
else -> println("Unknown Error")
}
}
}
}Using CoordinatesData
import com.servinformacion.smart1sdk.android.core.model.CoordinatesData
fun createLocation(lat: Double, lon: Double): CoordinatesData {
return CoordinatesData(
latitude = lat,
longitude = lon
)
}
fun validateCoordinates(coords: CoordinatesData): Boolean {
return coords.latitude in -90.0..90.0 &&
coords.longitude in -180.0..180.0
}
// Example usage
val location = createLocation(40.7128, -74.0060) // New York
if (validateCoordinates(location)) {
println("Valid coordinates: ${location.latitude}, ${location.longitude}")
}Working with Paginated Data
import com.servinformacion.smart1sdk.android.core.model.DataSet
import com.servinformacion.smart1sdk.android.core.model.PaginationInfo
fun displayPaginatedData(dataSet: DataSet<String>) {
println("Page ${dataSet.paginationInfo.currentPage} of ${dataSet.paginationInfo.totalPages}")
println("Total records: ${dataSet.paginationInfo.totalRecords}")
println("Items on this page: ${dataSet.data.size}")
dataSet.data.forEachIndexed { index, item ->
println("${index + 1}. $item")
}
val hasNextPage = dataSet.paginationInfo.currentPage < dataSet.paginationInfo.totalPages
val hasPreviousPage = dataSet.paginationInfo.currentPage 1
println("Has next page: $hasNextPage")
println("Has previous page: $hasPreviousPage")
}Using API Search Types
import com.servinformacion.smart1sdk.android.core.types.ApiSearchType
import com.servinformacion.smart1sdk.android.core.types.ApiLogicalOperator
fun buildSearchQuery(
searchTerm: String,
searchType: ApiSearchType,
operator: ApiLogicalOperator
) {
when (searchType) {
ApiSearchType.EXACT -> println("Searching for exact match: $searchTerm")
ApiSearchType.CONTAINS -> println("Searching for contains: $searchTerm")
ApiSearchType.STARTS_WITH -> println("Searching for starts with: $searchTerm")
ApiSearchType.ENDS_WITH -> println("Searching for ends with: $searchTerm")
}
when (operator) {
ApiLogicalOperator.AND -> println("Using AND operator")
ApiLogicalOperator.OR -> println("Using OR operator")
}
}Using Sort Types
import com.servinformacion.smart1sdk.android.core.types.ApiSortType
data class SortConfig(
val field: String,
val sortType: ApiSortType
)
fun applySorting(items: List<Int>, sortType: ApiSortType): List<Int> {
return when (sortType) {
ApiSortType.ASC -> items.sorted()
ApiSortType.DESC -> items.sortedDescending()
}
}
// Example usage
val numbers = listOf(5, 2, 8, 1, 9)
val ascending = applySorting(numbers, ApiSortType.ASC)
val descending = applySorting(numbers, ApiSortType.DESC)
println("Ascending: $ascending") // [1, 2, 5, 8, 9]
println("Descending: $descending") // [9, 8, 5, 2, 1]Working with Capacity Info
import com.servinformacion.smart1sdk.android.core.model.CapacityInfo
fun checkCapacity(
current: CapacityInfo,
limit: Double
): Boolean {
return current.value limit
}
// Example usage
val weightCapacity = CapacityInfo(
name = "Weight",
value = 500.0,
unit = "kg"
)
val isOverLimit = checkCapacity(
current = weightCapacity,
limit = 450.0
)
println("Capacity: ${weightCapacity.value} ${weightCapacity.unit}")
println("Over limit: $isOverLimit") // trueUsing Constants
import com.servinformacion.smart1sdk.android.core.Constants
fun initializeDefaults() {
val pageSize = Constants.DEFAULT_RECORD_QUANTITY_PER_PAGE
val emptyString = Constants.EMPTY_STR
val invalidId = Constants.INT_INVALID
println("Default page size: $pageSize")
println("Empty string: '$emptyString'")
println("Invalid ID marker: $invalidId")
}
fun isValidId(id: Int): Boolean {
return id != Constants.INT_INVALID && id 0
}Error Handling Pattern
import com.servinformacion.smart1sdk.android.core.ResultS1SDK
import com.servinformacion.smart1sdk.android.core.error.ErrorS1SDK
class DataRepository {
suspend fun fetchData(): ResultS1SDK<List<String>, ErrorS1SDK> {
return try {
// Simulate API call
val data = performApiCall()
ResultS1SDK.Success(data)
} catch (e: Exception) {
ResultS1SDK.Error(
CommonError.UnknownError
)
}
}
private suspend fun performApiCall(): List<String> {
// API call implementation
return listOf("Item 1", "Item 2", "Item 3")
}
}
class DataViewModel : ViewModel() {
private val repository = DataRepository()
fun loadData() {
viewModelScope.launch {
val result = repository.fetchData()
when (result) {
is ResultS1SDK.Success -> {
// Update UI with data
updateUI(result.data)
}
is ResultS1SDK.Error -> {
// Show error message
showError(result.error)
}
}
}
}
private fun updateUI(data: List<String>) {
println("Loaded ${data.size} items")
}
private fun showError(error: ErrorS1SDK) {
println("Error: $error")
}
}Session Data Management
import com.servinformacion.smart1sdk.android.core.model.SessionData
class SessionManager {
private var currentSession: SessionData? = null
fun setSession(sessionData: SessionData) {
currentSession = sessionData
println("Session set for user: ${sessionData.email}")
println("User ID: ${sessionData.userId}")
println("Companies: ${sessionData.companyIds}")
println("Role: ${sessionData.roleName}")
}
fun isSessionValid(): Boolean {
val session = currentSession ?: return false
// Check if session is expired
// Implementation depends on date parsing
return session.accessToken.isNotEmpty()
}
fun getUserId(): Long? {
return currentSession?.userId
}
fun getCompanyIds(): List<Long> {
return currentSession?.companyIds ?: emptyList()
}
fun clearSession() {
currentSession = null
println("Session cleared")
}
}Important Notes
Result Type: All SDK operations return
ResultS1SDKfor consistent error handling.Error Hierarchy: Errors are categorized for easier handling and debugging.
Pagination: Use
DataSetandPaginationInfofor paginated responses.Coordinates: Latitude must be between -90 and 90, longitude between -180 and 180.
Constants: Use provided constants instead of hardcoding values.
Type Safety: All types are strongly typed for compile-time safety.
Immutability: Models are immutable data classes.
Best Practices
Error Handling: Always handle both success and error cases
Null Safety: Use nullable types appropriately
Constants: Use SDK constants for consistency
Type Usage: Use appropriate types for search, sort, and filter operations
Validation: Validate coordinates and other data before use
Pagination: Handle pagination properly in UI
Session Management: Keep session data secure and up to date
Use Cases
Result Handling: Consistent success/error handling across all operations
Pagination: Display large datasets with pagination
Location Services: Work with geographic coordinates
Search & Filter: Build complex search queries
Capacity Management: Track and validate capacities
Session Management: Handle user sessions
Error Reporting: Categorize and report errors