@@ -33,6 +33,7 @@ import androidx.core.content.ContextCompat.startActivity
3333import androidx.webkit.JavaScriptReplyProxy
3434import androidx.webkit.WebMessageCompat
3535import androidx.webkit.WebSettingsCompat
36+ import androidx.webkit.WebSettingsCompat.DARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING
3637import androidx.webkit.WebViewAssetLoader
3738import androidx.webkit.WebViewClientCompat
3839import androidx.webkit.WebViewCompat
@@ -129,9 +130,16 @@ class MainActivity : AppCompatActivity() {
129130 setContentView(binding.root)
130131 val jsObjName = " jsObject"
131132 val allowedOriginRules = setOf<String >(" https://gcoleman799.github.io" )
132-
133- // Check if the system is set to light or dark mode
133+
134+ // Configuring Dark Theme
135+ // *NOTE* : The force dark setting is not persistent. You must call the static
136+ // method every time your app process is started.
137+ // *NOTE* : The change from day<->night mode is a
138+ // configuration change so by default the activity will be restarted
139+ // (and pickup the new values to apply the theme). Take care when overriding this
140+ // default behavior to ensure this method is still called when changes are made.
134141 val nightModeFlag = resources.configuration.uiMode and Configuration .UI_MODE_NIGHT_MASK
142+ // Check if the system is set to light or dark mode
135143 if (nightModeFlag == Configuration .UI_MODE_NIGHT_YES ) {
136144 // Switch WebView to dark mode; uses default dark theme
137145 if (WebViewFeature .isFeatureSupported(WebViewFeature .FORCE_DARK )) {
@@ -140,11 +148,28 @@ class MainActivity : AppCompatActivity() {
140148 WebSettingsCompat .FORCE_DARK_ON
141149 )
142150 }
143- // TODO: set darkening strategy and use custom CSS for dark theme
151+
152+ /* Set how WebView content should be darkened. There are three options for how to darken
153+ * a WebView.
154+ * PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING- checks for the "color-scheme" <meta> tag.
155+ * If present, it uses media queries. If absent, it applies user-agent (automatic) darkening
156+ * DARK_STRATEGY_WEB_THEME_DARKENING_ONLY - uses media queries always, even if there's
157+ * no "color-scheme" <meta> tag present.
158+ * DARK_STRATEGY_USER_AGENT_DARKENING_ONLY - it ignores web page theme and always applies
159+ * user-agent (automatic) darkening.
160+ * More information about Force Dark Strategy can be found here:
161+ * https://developer.android.com/reference/androidx/webkit/WebSettingsCompat#setForceDarkStrategy(android.webkit.WebSettings,%20int)
162+ */
163+ if (WebViewFeature .isFeatureSupported(WebViewFeature .FORCE_DARK_STRATEGY )) {
164+ WebSettingsCompat .setForceDarkStrategy(
165+ binding.webview.settings,
166+ DARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING
167+ )
168+ }
144169 }
145170
146171 // Configure asset loader with custom domain
147- // * NOTE THAT * :
172+ // *NOTE* :
148173 // The assets path handler is set with the sub path /views-widgets-samples/ here because we are tyring to ensure
149174 // that the address loaded with loadUrl("https://raw.githubusercontent.com/views-widgets-samples/assets/index.html") does
150175 // not conflict with a real web address. In this case, if the path were only /assests/ we would need to load
@@ -153,8 +178,14 @@ class MainActivity : AppCompatActivity() {
153178 // Therefore we must let the AssetLoader know to expect the /views-widgets-samples/ sub path as well as the /assets/.
154179 val assetLoader = WebViewAssetLoader .Builder ()
155180 .setDomain(" raw.githubusercontent.com" )
156- .addPathHandler(" /views-widgets-samples/assets/" , WebViewAssetLoader .AssetsPathHandler (this ))
157- .addPathHandler(" /views-widgets-samples/res/" , WebViewAssetLoader .ResourcesPathHandler (this ))
181+ .addPathHandler(
182+ " /views-widgets-samples/assets/" ,
183+ WebViewAssetLoader .AssetsPathHandler (this )
184+ )
185+ .addPathHandler(
186+ " /views-widgets-samples/res/" ,
187+ WebViewAssetLoader .ResourcesPathHandler (this )
188+ )
158189 .build()
159190
160191 // Set clients
@@ -182,6 +213,5 @@ class MainActivity : AppCompatActivity() {
182213 ) { message -> invokeShareIntent(message) }
183214
184215 // Load the content
185- binding.webview.loadUrl(" https://raw.githubusercontent.com/views-widgets-samples/assets/index.html" )
186- }
216+ binding.webview.loadUrl(" https://raw.githubusercontent.com/views-widgets-samples/assets/index.html" ) }
187217}
0 commit comments