Algorithmic darkening

pull/208/head
M66B 3 years ago
parent 46bf44fe03
commit 183196d00f

@ -23,7 +23,7 @@ android {
defaultConfig { defaultConfig {
applicationId "eu.faircode.email" applicationId "eu.faircode.email"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 32 targetSdkVersion 33
versionCode getVersionCode() versionCode getVersionCode()
versionName "1." + getVersionCode() versionName "1." + getVersionCode()
archivesBaseName = "FairEmail-v$versionName" + getRevision() archivesBaseName = "FairEmail-v$versionName" + getRevision()
@ -332,7 +332,7 @@ dependencies {
def activity_version = "1.5.0-rc01" // 1.6.0-alpha03 def activity_version = "1.5.0-rc01" // 1.6.0-alpha03
def fragment_version = "1.5.0-rc01" def fragment_version = "1.5.0-rc01"
def windows_version = "1.0.0" // 1.1.0-alpha01 def windows_version = "1.0.0" // 1.1.0-alpha01
def webkit_version = "1.4.0" def webkit_version = "1.5.0-alpha01"
def recyclerview_version = "1.2.1" // 1.3.0-alpha02 def recyclerview_version = "1.2.1" // 1.3.0-alpha02
def coordinatorlayout_version = "1.2.0" def coordinatorlayout_version = "1.2.0"
def constraintlayout_version = "2.1.4" // 2.2.0-alpha01 def constraintlayout_version = "2.1.4" // 2.2.0-alpha01

@ -19,15 +19,11 @@ package eu.faircode.email;
Copyright 2018-2022 by Marcel Bokhorst (M66B) Copyright 2018-2022 by Marcel Bokhorst (M66B)
*/ */
import static androidx.webkit.WebSettingsCompat.FORCE_DARK_OFF;
import static androidx.webkit.WebSettingsCompat.FORCE_DARK_ON;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
@ -130,11 +126,10 @@ public class ActivityAMP extends ActivityBase {
@Override @Override
public boolean onPrepareOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) {
boolean available = boolean dark = Helper.isDarkTheme(this);
(WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK) && boolean canDarken = WebViewEx.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING);
Helper.isDarkTheme(this));
menu.findItem(R.id.menu_force_light) menu.findItem(R.id.menu_force_light)
.setVisible(available) .setVisible(dark && canDarken)
.getIcon().setLevel(force_light ? 1 : 0); .getIcon().setLevel(force_light ? 1 : 0);
return super.onPrepareOptionsMenu(menu); return super.onPrepareOptionsMenu(menu);
} }
@ -165,12 +160,9 @@ public class ActivityAMP extends ActivityBase {
private void setDarkMode() { private void setDarkMode() {
WebSettings settings = wvAmp.getSettings(); WebSettings settings = wvAmp.getSettings();
boolean dark = (Helper.isDarkTheme(this) && !force_light); boolean dark = (Helper.isDarkTheme(this) && !force_light);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || boolean canDarken = WebViewEx.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING);
Helper.getTargetSdk(this) < Build.VERSION_CODES.TIRAMISU) { if (canDarken)
if (WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK)) WebSettingsCompat.setAlgorithmicDarkeningAllowed(settings, dark);
WebSettingsCompat.setForceDark(settings, dark ? FORCE_DARK_ON : FORCE_DARK_OFF);
} else
settings.setAlgorithmicDarkeningAllowed(dark);
} }
private void load() { private void load() {

@ -4868,8 +4868,8 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
}); });
boolean isDark = Helper.isDarkTheme(context); boolean isDark = Helper.isDarkTheme(context);
boolean canDark = WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK); boolean canDarken = WebViewEx.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING);
tvDark.setVisibility(isDark && !canDark ? View.VISIBLE : View.GONE); tvDark.setVisibility(isDark && !canDarken ? View.VISIBLE : View.GONE);
} else { } else {
boolean disable_tracking = prefs.getBoolean("disable_tracking", true); boolean disable_tracking = prefs.getBoolean("disable_tracking", true);

@ -20,12 +20,9 @@ package eu.faircode.email;
*/ */
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static androidx.webkit.WebSettingsCompat.FORCE_DARK_OFF;
import static androidx.webkit.WebSettingsCompat.FORCE_DARK_ON;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -86,12 +83,9 @@ public class FragmentDialogOpenFull extends FragmentDialogBase {
WebSettingsCompat.setSafeBrowsingEnabled(settings, safe_browsing); WebSettingsCompat.setSafeBrowsingEnabled(settings, safe_browsing);
boolean dark = (Helper.isDarkTheme(context) && !force_light); boolean dark = (Helper.isDarkTheme(context) && !force_light);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || boolean canDarken = WebViewEx.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING);
Helper.getTargetSdk(context) < Build.VERSION_CODES.TIRAMISU) { if (canDarken)
if (WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK)) WebSettingsCompat.setAlgorithmicDarkeningAllowed(settings, dark);
WebSettingsCompat.setForceDark(settings, dark ? FORCE_DARK_ON : FORCE_DARK_OFF);
} else
settings.setAlgorithmicDarkeningAllowed(dark);
settings.setLoadsImagesAutomatically(true); settings.setLoadsImagesAutomatically(true);
settings.setBlockNetworkLoads(false); settings.setBlockNetworkLoads(false);

@ -1985,8 +1985,8 @@ public class Log {
sb.append(String.format("UI type: %s %s\r\n", uiType, sb.append(String.format("UI type: %s %s\r\n", uiType,
"normal".equals(uiType) ? "" : "!!!")); "normal".equals(uiType) ? "" : "!!!"));
sb.append(String.format("Force dark support: %b\r\n", sb.append(String.format("Darken support: %b\r\n",
WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK))); WebViewEx.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)));
sb.append("\r\n"); sb.append("\r\n");

@ -19,9 +19,6 @@ package eu.faircode.email;
Copyright 2018-2022 by Marcel Bokhorst (M66B) Copyright 2018-2022 by Marcel Bokhorst (M66B)
*/ */
import static androidx.webkit.WebSettingsCompat.FORCE_DARK_OFF;
import static androidx.webkit.WebSettingsCompat.FORCE_DARK_ON;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration; import android.content.res.Configuration;
@ -118,18 +115,13 @@ public class WebViewEx extends WebView implements DownloadListener, View.OnLongC
WebSettings settings = getSettings(); WebSettings settings = getSettings();
boolean dark = Helper.isDarkTheme(context); boolean dark = Helper.isDarkTheme(context);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
Helper.getTargetSdk(context) < Build.VERSION_CODES.TIRAMISU) {
boolean canForce = WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK);
if (canForce)
WebSettingsCompat.setForceDark(settings, dark && !force_light ? FORCE_DARK_ON : FORCE_DARK_OFF);
setBackgroundColor(canForce && force_light ? Color.WHITE : Color.TRANSPARENT);
} else {
// https://developer.android.com/reference/android/webkit/WebSettings#setAlgorithmicDarkeningAllowed(boolean) // https://developer.android.com/reference/android/webkit/WebSettings#setAlgorithmicDarkeningAllowed(boolean)
// https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme
settings.setAlgorithmicDarkeningAllowed(dark && !force_light); boolean canDarken = WebViewEx.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING);
setBackgroundColor(force_light ? Color.WHITE : Color.TRANSPARENT); if (canDarken)
} WebSettingsCompat.setAlgorithmicDarkeningAllowed(settings, dark && !force_light);
setBackgroundColor(canDarken && force_light ? Color.WHITE : Color.TRANSPARENT);
float fontSize = 16f /* Default */ * float fontSize = 16f /* Default */ *
(browser_zoom ? 1f : message_zoom / 100f); (browser_zoom ? 1f : message_zoom / 100f);

Loading…
Cancel
Save