Skip to content

Commit

Permalink
Merge pull request #1261 from ruuvi/issue/1254_web_sharing
Browse files Browse the repository at this point in the history
Issue/1254 web sharing
  • Loading branch information
andreevdenis committed May 16, 2024
2 parents e7888d7 + 7b203dc commit 233db8c
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 2 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ dependencies {
implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2'
implementation("androidx.webkit:webkit:1.11.0")

// Lifecycle
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ object SettingsInjectionModule {

bind<AlertNotificationsSettingsViewModel>() with provider { AlertNotificationsSettingsViewModel(instance()) }

bind<DeveloperSettingsViewModel>() with provider { DeveloperSettingsViewModel(instance(), instance()) }
bind<DeveloperSettingsViewModel>() with provider { DeveloperSettingsViewModel(instance(), instance(), instance()) }
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
package com.ruuvi.station.settings.ui

import android.graphics.Bitmap
import android.view.ViewGroup
import android.webkit.WebResourceRequest
import android.webkit.WebSettings.LOAD_DEFAULT
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.ScaffoldState
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.viewinterop.AndroidView
import com.ruuvi.station.R
import com.ruuvi.station.app.ui.UiEvent
import com.ruuvi.station.app.ui.components.*
import timber.log.Timber

@Composable
fun DeveloperSettings(
scaffoldState: ScaffoldState,
onNavigate: (UiEvent.Navigate) -> Unit,
viewModel: DeveloperSettingsViewModel
) {
val devServerEnabled = viewModel.devServerEnabled.collectAsState()
Expand All @@ -29,6 +41,80 @@ fun DeveloperSettings(
onCheckedChange = viewModel::setDevServerEnabled
)
Paragraph(text = stringResource(id = R.string.use_dev_server_description))
SettingsElement(
name = "Web sharing",
onClick = { onNavigate.invoke(UiEvent.Navigate(SettingsRoutes.SHARINGWEB)) }
)
}
}
}

@Composable
fun SharingWebView(
scaffoldState: ScaffoldState,
viewModel: DeveloperSettingsViewModel
) {
val userToken = viewModel.getWebViewToken()
val script = "window.localStorage.setItem('user','$userToken')"
var webView: WebView? = null
PageSurface {
Column(modifier = Modifier.fillMaxSize()) {
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { context ->
WebView(context).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)
settings.javaScriptEnabled = true
settings.allowContentAccess = true
settings.allowFileAccess = true
settings.domStorageEnabled = true
settings.databaseEnabled = true
settings.cacheMode = LOAD_DEFAULT
setWebViewClient(object: WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
url: String?
): Boolean {
return false
}

override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
return false
}

override fun onPageStarted(
view: WebView?,
url: String?,
favicon: Bitmap?
) {
super.onPageStarted(view, url, favicon)
evaluateJavascript(script) {
Timber.d("evaluateJavascript $script RESULT $it")
}

}

override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
evaluateJavascript(script) {
Timber.d("evaluateJavascript $script RESULT $it")
}
}
})

loadUrl("https://devstation.ruuvi.com/shares")

webView = this
}
}, update = {
webView = it
})
}
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
package com.ruuvi.station.settings.ui

import androidx.lifecycle.ViewModel
import com.google.gson.Gson
import com.ruuvi.station.app.preferences.PreferencesRepository
import com.ruuvi.station.network.data.response.UserVerifyResponseBody
import com.ruuvi.station.network.domain.NetworkTokenRepository
import com.ruuvi.station.network.domain.RuuviNetworkRepository
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow

class DeveloperSettingsViewModel(
val preferencesRepository: PreferencesRepository,
val ruuviNetworkRepository: RuuviNetworkRepository
val ruuviNetworkRepository: RuuviNetworkRepository,
private val networkTokenRepository: NetworkTokenRepository,
): ViewModel() {

private var _devServerEnabled = MutableStateFlow(preferencesRepository.isDevServerEnabled())
Expand All @@ -26,4 +30,15 @@ class DeveloperSettingsViewModel(
preferencesRepository.setNewChartsUI(isEnabled)
_newChartsUiEnabled.value = preferencesRepository.isNewChartsUI()
}

fun getWebViewToken(): String? {
val tokenInfo = networkTokenRepository.getTokenInfo()
if (tokenInfo != null) {
val userRegisterResponse = UserVerifyResponseBody(tokenInfo.email, tokenInfo.token, false)
return Gson().toJson(userRegisterResponse)
} else {
return null
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,17 @@ class SettingsActivity : AppCompatActivity(), KodeinAware {
) {
val developerSettingsViewModel: DeveloperSettingsViewModel by viewModel()
DeveloperSettings(
scaffoldState = scaffoldState,
onNavigate = navController::navigate,
viewModel = developerSettingsViewModel
)
}
composable(SettingsRoutes.SHARINGWEB,
enterTransition = enterTransition,
exitTransition = exitTransition
) {
val developerSettingsViewModel: DeveloperSettingsViewModel by viewModel()
SharingWebView(
scaffoldState = scaffoldState,
viewModel = developerSettingsViewModel
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ object SettingsRoutes {
const val CLOUD = "cloud"
const val DATAFORWARDING = "dataforwarding"
const val DEVELOPER = "developer"
const val SHARINGWEB = "sharingweb"

fun getTitleByRoute(context: Context, route: String): String {
return when (route) {
Expand Down

0 comments on commit 233db8c

Please sign in to comment.