app: retrieve ArticleDetailWebViewClient from hilt Entrypoint instead of activity
authorDa Risk <da_risk@geekorum.com>
Thu, 06 Jun 2024 13:56:21 -0400
changeset 1274 9e1f3931246f
parent 1273 b7b648dc5a20
child 1275 ea337b3f6bb1
app: retrieve ArticleDetailWebViewClient from hilt Entrypoint instead of activity This prepares us to retrieve it when we don't use ArticleDetailActivity anymore
app/src/main/java/com/geekorum/ttrss/article_details/ArticleDetailActivity.kt
app/src/main/java/com/geekorum/ttrss/article_details/WebviewUtils.kt
--- a/app/src/main/java/com/geekorum/ttrss/article_details/ArticleDetailActivity.kt	Thu Jun 06 12:32:21 2024 -0400
+++ b/app/src/main/java/com/geekorum/ttrss/article_details/ArticleDetailActivity.kt	Thu Jun 06 13:56:21 2024 -0400
@@ -29,6 +29,7 @@
 import androidx.activity.viewModels
 import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
 import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
+import androidx.compose.runtime.remember
 import androidx.core.net.toUri
 import com.geekorum.ttrss.R
 import com.geekorum.ttrss.articles_list.ArticleListActivity
@@ -37,10 +38,11 @@
 import com.geekorum.ttrss.ui.AppTheme3
 import com.geekorum.ttrss.ui.component1
 import com.geekorum.ttrss.ui.component2
-import com.geekorum.ttrss.ui.components.web.AccompanistWebViewClient
+import dagger.hilt.EntryPoint
+import dagger.hilt.InstallIn
 import dagger.hilt.android.AndroidEntryPoint
-import okhttp3.OkHttpClient
-import javax.inject.Inject
+import dagger.hilt.android.EntryPointAccessors
+import dagger.hilt.android.components.ActivityComponent
 
 /**
  * An activity representing a single Article detail screen. This
@@ -52,17 +54,10 @@
 class ArticleDetailActivity : SessionActivity() {
 
     private val articleDetailsViewModel: ArticleDetailsViewModel by viewModels()
-    private lateinit var webViewClient: AccompanistWebViewClient
-    @Inject lateinit var okHttpClient: OkHttpClient
-    @Inject lateinit var webFontProvider: WebFontProvider
 
     @OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
     public override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        webViewClient = ArticleDetailsWebViewClient(okHttpClient, webFontProvider,
-            openUrlInBrowser = articleDetailsViewModel::openUrlInBrowser,
-            onPageFinishedCallback = { _, _ -> }
-        )
 
         enableEdgeToEdge()
         val articleUri = requireNotNull(intent.data)
@@ -72,6 +67,14 @@
             AppTheme3 {
                 val (widthSizeClass, heightSizeClass) = calculateWindowSizeClass(this)
 
+                val webViewClientFactory =  remember {
+                    EntryPointAccessors.fromActivity<ArticleDetailsEntryPoint>(this)
+                        .articleDetailsWebViewClientFactory
+                }
+                val webViewClient = remember(articleDetailsViewModel) {
+                    webViewClientFactory.create(openUrlInBrowser = articleDetailsViewModel::openUrlInBrowser,
+                        onPageFinishedCallback = { _, _ ->})
+                }
                 ArticleDetailsScreen(articleDetailsViewModel,
                     widthSizeClass = widthSizeClass,
                     heightSizeClass = heightSizeClass,
@@ -109,3 +112,9 @@
         outContent.webUri = articleDetailsViewModel.article.value?.link?.toUri()
     }
 }
+
+@EntryPoint
+@InstallIn(ActivityComponent::class)
+interface ArticleDetailsEntryPoint {
+    val articleDetailsWebViewClientFactory: ArticleDetailsWebViewClientFactory
+}
--- a/app/src/main/java/com/geekorum/ttrss/article_details/WebviewUtils.kt	Thu Jun 06 12:32:21 2024 -0400
+++ b/app/src/main/java/com/geekorum/ttrss/article_details/WebviewUtils.kt	Thu Jun 06 13:56:21 2024 -0400
@@ -40,13 +40,14 @@
 import com.geekorum.ttrss.ui.components.web.AccompanistWebViewClient
 import okhttp3.OkHttpClient
 import timber.log.Timber
+import javax.inject.Inject
 
 /**
  * WebViewClient for ArticleDetails webview.
  * It favors opening link in their default application and fallback to a browser if none.
  * It also use  WebFontProvider to load fonts
  */
-class ArticleDetailsWebViewClient constructor(
+class ArticleDetailsWebViewClient(
     okHttpClient: OkHttpClient,
     private val webFontProvider: WebFontProvider,
     private val openUrlInBrowser: (Context, Uri) -> Unit,
@@ -189,3 +190,19 @@
 
     }
 }
+
+class ArticleDetailsWebViewClientFactory @Inject constructor(
+    private val okHttpClient: OkHttpClient,
+    private val webFontProvider: WebFontProvider,
+) {
+    fun create(openUrlInBrowser: (Context, Uri) -> Unit,
+            onPageFinishedCallback: (WebView?, String?) -> Unit
+    ): ArticleDetailsWebViewClient {
+        return ArticleDetailsWebViewClient(
+            okHttpClient = okHttpClient,
+            webFontProvider = webFontProvider,
+            openUrlInBrowser = openUrlInBrowser,
+            onPageFinishedCallback = onPageFinishedCallback
+        )
+    }
+}