Skip to content

Commit

Permalink
Imports cleanup, added FABs, added version check
Browse files Browse the repository at this point in the history
  • Loading branch information
Ixam97 committed Nov 18, 2023
1 parent 24fb112 commit cda79bb
Show file tree
Hide file tree
Showing 25 changed files with 348 additions and 95 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ android {
minSdk = 24
targetSdk = 34
versionCode = 4
versionName = "0.1.3.0002"
versionName = "0.1.4"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
Expand Down
22 changes: 21 additions & 1 deletion app/src/main/java/de/ixam97/carstatswidget/CarStatsWidget.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ import android.content.Context
import android.content.Intent
import android.os.SystemClock
import android.util.Log
import de.ixam97.carstatswidget.repository.CarDataInfo
import de.ixam97.carstatswidget.repository.CarDataRepository
import de.ixam97.carstatswidget.repository.CarDataStatus
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch

class CarStatsWidget: Application() {
Expand All @@ -20,6 +22,23 @@ class CarStatsWidget: Application() {
private const val TAG = "CarStatsWidget"
}

// var gitHubVersion: String? = null
private val _gitHubVersionStateFlow = MutableStateFlow<String?>(null)
val gitHubVersionStateFlow = _gitHubVersionStateFlow.asStateFlow()

fun updateGitHubVersion() {
CoroutineScope(Dispatchers.IO).launch {
_gitHubVersionStateFlow.update {
null
}
val gitHubVersion = CarDataRepository.getGitHubVersion()
_gitHubVersionStateFlow.update {
gitHubVersion
}
// Log.d(TAG, "GitHub version: $gitHubVersion")
}
}

override fun onCreate() {
super.onCreate()
CoroutineScope(Dispatchers.IO).launch {
Expand All @@ -43,6 +62,7 @@ class CarStatsWidget: Application() {
}
}
}
updateGitHubVersion()

val alarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val pendingIntent = PendingIntent.getBroadcast(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.ixam97.carstatswidget

import de.ixam97.carstatswidget.repository.GitHubVersionChecker
import de.ixam97.carstatswidget.repository.TibberApi
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
Expand All @@ -12,4 +13,10 @@ object RetrofitInstance {
.build()
.create(TibberApi::class.java)
}
val gitHubVersionChecker: GitHubVersionChecker by lazy {
Retrofit.Builder()
.baseUrl("https://github.com")
.build()
.create(GitHubVersionChecker::class.java)
}
}
13 changes: 10 additions & 3 deletions app/src/main/java/de/ixam97/carstatswidget/StateOfChargeWidget.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,14 @@ import androidx.compose.ui.unit.sp
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.drawable.toBitmapOrNull
import androidx.glance.*
import androidx.glance.ColorFilter
import androidx.glance.GlanceId
import androidx.glance.GlanceModifier
import androidx.glance.GlanceTheme
import androidx.glance.Image
import androidx.glance.ImageProvider
import androidx.glance.LocalContext
import androidx.glance.LocalSize
import androidx.glance.action.ActionParameters
import androidx.glance.action.clickable
import androidx.glance.appwidget.CircularProgressIndicator
Expand All @@ -36,7 +43,8 @@ import androidx.glance.appwidget.cornerRadius
import androidx.glance.appwidget.provideContent
import androidx.glance.appwidget.state.getAppWidgetState
import androidx.glance.appwidget.state.updateAppWidgetState
import androidx.glance.appwidget.updateAll
import androidx.glance.background
import androidx.glance.currentState
import androidx.glance.layout.Alignment
import androidx.glance.layout.Box
import androidx.glance.layout.Column
Expand All @@ -54,7 +62,6 @@ import androidx.glance.text.Text
import androidx.glance.text.TextAlign
import androidx.glance.text.TextStyle
import androidx.glance.unit.ColorProvider
import androidx.glance.unit.Dimension
import coil.imageLoader
import coil.request.CachePolicy
import coil.request.ErrorResult
Expand Down
18 changes: 2 additions & 16 deletions app/src/main/java/de/ixam97/carstatswidget/repository/CarData.kt
Original file line number Diff line number Diff line change
@@ -1,32 +1,18 @@
package de.ixam97.carstatswidget.repository

import android.content.Context
import android.graphics.Bitmap
import android.util.Log
import androidx.datastore.core.CorruptionException
import androidx.datastore.core.DataStore
import androidx.datastore.core.DataStoreFactory
import androidx.datastore.core.Serializer
import androidx.datastore.dataStore
import androidx.datastore.dataStoreFile
import androidx.glance.GlanceId
import androidx.glance.appwidget.GlanceAppWidgetManager
import androidx.glance.appwidget.state.updateAppWidgetState
import androidx.glance.state.GlanceStateDefinition
import androidx.work.CoroutineWorker
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import de.ixam97.carstatswidget.StateOfChargeWidget
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.Json
import java.io.File
import java.io.InputStream
import java.io.OutputStream
import kotlinx.serialization.Serializable
import java.lang.Exception
import java.util.concurrent.TimeUnit

@Serializable
sealed interface CarDataStatus {
@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@ import de.ixam97.carstatswidget.repository.tibberCredentials.TibberCredentials
import de.ixam97.carstatswidget.repository.tibberData.TibberData
import de.ixam97.carstatswidget.repository.tibberQuery.TibberQuery
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.withContext
Expand All @@ -24,6 +21,27 @@ object CarDataRepository {
private val _carDataInfoState = MutableStateFlow<CarDataInfo>(CarDataInfo(CarDataStatus.Unavailable))
val carDataInfoState: StateFlow<CarDataInfo> = _carDataInfoState.asStateFlow()

suspend fun getGitHubVersion(): String {
var version: String = "0.0.0"
withContext(Dispatchers.IO) {
RetrofitInstance.gitHubVersionChecker.run {
try {
// Log.d(TAG, "URL: ${fetchGitHubVersion().raw().request.url}")
version = fetchGitHubVersion().raw().request.url.toString().split("/v").run {
if (this.size > 1) {
this.last()
} else {
version
}
}
} catch (e: Exception) {
Log.e(TAG, "Query failed: \n$e")
}
}
}
return version
}

suspend fun verifyLoginData(mail: String, password: String): Boolean {
var verifyResponse: Boolean = false
withContext(Dispatchers.IO) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,12 @@ package de.ixam97.carstatswidget.repository

import android.content.Context
import android.util.Log
import androidx.glance.GlanceId
import androidx.glance.appwidget.GlanceAppWidgetManager
import androidx.glance.appwidget.state.getAppWidgetState
import androidx.glance.appwidget.state.updateAppWidgetState
import androidx.work.CoroutineWorker
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import de.ixam97.carstatswidget.StateOfChargeWidget
import de.ixam97.carstatswidget.WidgetData
import java.lang.Exception
import java.util.concurrent.TimeUnit

class CarDataWorker(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package de.ixam97.carstatswidget.repository

import retrofit2.Response
import retrofit2.http.GET

interface GitHubVersionChecker {

@GET("/Ixam97/CarStatsWidget/releases/latest/")
suspend fun fetchGitHubVersion(): Response<Void>
}
7 changes: 7 additions & 0 deletions app/src/main/java/de/ixam97/carstatswidget/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,16 @@ import androidx.core.view.WindowCompat
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import de.ixam97.carstatswidget.CarStatsWidget
import de.ixam97.carstatswidget.ui.components.Navigation
import de.ixam97.carstatswidget.ui.theme.CarStatsWidgetTheme

class MainActivity : ComponentActivity() {

companion object {
private const val TAG = "MainActivity"
}

private var navController: NavController? = null
override fun onResume() {
super.onResume()
Expand All @@ -25,6 +31,7 @@ class MainActivity : ComponentActivity() {
}
anim { }
}
(application as CarStatsWidget).updateGitHubVersion()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
45 changes: 29 additions & 16 deletions app/src/main/java/de/ixam97/carstatswidget/ui/MainViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,34 +1,33 @@
package de.ixam97.carstatswidget.ui

import android.app.Application
import android.content.Context
import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.glance.appwidget.GlanceAppWidgetManager
import androidx.glance.appwidget.state.updateAppWidgetState
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.work.WorkManager
import de.ixam97.carstatswidget.StateOfChargeWidget
import de.ixam97.carstatswidget.WidgetData
import de.ixam97.carstatswidget.BuildConfig
import de.ixam97.carstatswidget.CarStatsWidget
import de.ixam97.carstatswidget.repository.CarDataInfo
import de.ixam97.carstatswidget.repository.CarDataInfoStateDefinition
import de.ixam97.carstatswidget.repository.CarDataRepository
import de.ixam97.carstatswidget.repository.CarDataStatus
import de.ixam97.carstatswidget.repository.CarDataWorker
import kotlinx.coroutines.Dispatchers
import de.ixam97.carstatswidget.util.SemanticVersion
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class MainViewModel(application: Application) : AndroidViewModel(application = application) {

companion object {
private const val TAG = "MainViewModel"
}

val preferencesManager = de.ixam97.carstatswidget.PreferencesManager(context = application)
val workManager = WorkManager.getInstance(application)

Expand All @@ -40,8 +39,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application = a

data class GlobalState(
val isLoggedIn: Boolean? = null,
val showLastSeen: Boolean? = null,
val showVehicleName: Boolean? = null
val updateAvailable: Boolean? = null,
val currentVersion: String = BuildConfig.VERSION_NAME,
val availableVersion: String? = null
)

private val _tibberLoginState = MutableStateFlow(TibberLoginState())
Expand Down Expand Up @@ -85,12 +85,6 @@ class MainViewModel(application: Application) : AndroidViewModel(application = a
it.copy(isLoggedIn = false)
}
}
_globalState.update {
it.copy(
showLastSeen = preferencesManager.getBoolean("showLastSeen", true),
showVehicleName = preferencesManager.getBoolean("showVehicleName", true)
)
}
viewModelScope.launch {
CarDataRepository.carDataInfoState.collect { carDataInfo ->
Log.d("ViewModel", "Car data status: ${carDataInfo.status}")
Expand All @@ -104,6 +98,21 @@ class MainViewModel(application: Application) : AndroidViewModel(application = a
}
}
}
viewModelScope.launch {
getApplication<CarStatsWidget>().gitHubVersionStateFlow.collect {gitHubVersion ->
val currentVersion = BuildConfig.VERSION_NAME
Log.d(TAG, "Current version: $currentVersion, latest Version: $gitHubVersion")
_globalState.update {
it.copy(
updateAvailable = if (gitHubVersion == null) null else SemanticVersion.compareVersions(
v1 = SemanticVersion(currentVersion),
v2 = SemanticVersion(gitHubVersion)
),
availableVersion = gitHubVersion
)
}
}
}
requestCarData()
}

Expand Down Expand Up @@ -139,6 +148,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application = a
CarDataWorker.enqueue(applicationContext, true)
}

fun checkForUpdates() {
(applicationContext as CarStatsWidget).updateGitHubVersion()
}

private fun checkValidInputs() {
val validInputs = tibberMail.isNotEmpty() && tibberPassword.isNotEmpty()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,14 @@ import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.CloudOff
import androidx.compose.material.icons.filled.Error
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Login
import androidx.compose.material.icons.filled.Warning
import androidx.compose.material.icons.outlined.Info
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
Expand All @@ -36,11 +31,11 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
Expand All @@ -55,15 +50,13 @@ import androidx.compose.ui.unit.dp
import androidx.core.view.WindowCompat
import androidx.glance.GlanceId
import androidx.glance.appwidget.GlanceAppWidgetManager
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import de.ixam97.carstatswidget.R
import de.ixam97.carstatswidget.StateOfChargeWidget
import de.ixam97.carstatswidget.repository.CarDataStatus
import de.ixam97.carstatswidget.ui.theme.CarStatsWidgetTheme
import de.ixam97.carstatswidget.util.intentToString
import kotlinx.coroutines.launch

class WidgetConfigActivity: ComponentActivity() {
companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import androidx.glance.appwidget.GlanceAppWidgetManager
import androidx.glance.appwidget.state.getAppWidgetState
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.compose.viewModel
import de.ixam97.carstatswidget.WidgetData
import de.ixam97.carstatswidget.repository.CarDataInfoStateDefinition
import de.ixam97.carstatswidget.repository.CarDataRepository
Expand Down

0 comments on commit cda79bb

Please sign in to comment.