Added fake dark

This commit is contained in:
M66B 2022-07-04 08:11:26 +02:00
parent 7d2f1f3cc8
commit 92e8732d6c
6 changed files with 74 additions and 28 deletions

View File

@ -300,6 +300,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private static boolean debug;
private int level;
private boolean canDarken;
private boolean fake_dark;
private boolean webview_legacy;
private boolean show_recent;
@ -2170,7 +2171,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibSearch.setVisibility(tools && !outbox && button_search && (froms > 0 || tos > 0) ? View.VISIBLE : View.GONE);
ibTranslate.setVisibility(tools && !outbox && button_translate && DeepL.isAvailable(context) && message.content ? View.VISIBLE : View.GONE);
ibForceLight.setVisibility(tools && full && dark && button_force_light && message.content ? View.VISIBLE : View.GONE);
ibForceLight.setImageLevel(!canDarken || force_light ? 1 : 0);
ibForceLight.setImageLevel(!(canDarken || fake_dark) || force_light ? 1 : 0);
ibImportance.setVisibility(tools && button_importance && !outbox && seen ? View.VISIBLE : View.GONE);
ibHide.setVisibility(tools && button_hide && !outbox ? View.VISIBLE : View.GONE);
ibSeen.setVisibility(tools && button_seen && !outbox && seen ? View.VISIBLE : View.GONE);
@ -2663,6 +2664,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
float scale = (size == 0 || textSize == 0 ? 1.0f : size / (textSize * message_zoom / 100f));
args.putFloat("scale", scale);
boolean dark = Helper.isDarkTheme(context);
args.putBoolean("fake_dark", !canDarken && fake_dark && dark && !force_light);
new SimpleTask<Object>() {
@Override
protected void onPreExecute(Bundle args) {
@ -2820,6 +2824,10 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
HtmlHelper.restorePre(document);
}
boolean fake_dark = args.getBoolean("fake_dark");
if (fake_dark)
HtmlHelper.fakeDark(document);
boolean browser_zoom = prefs.getBoolean("browser_zoom", false);
int message_zoom = prefs.getInt("message_zoom", 100);
if (browser_zoom && message_zoom != 100) {
@ -4902,7 +4910,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
});
boolean isDark = Helper.isDarkTheme(context);
tvDark.setVisibility(isDark && !canDarken ? View.VISIBLE : View.GONE);
tvDark.setVisibility(isDark && !(canDarken || fake_dark) ? View.VISIBLE : View.GONE);
} else {
boolean disable_tracking = prefs.getBoolean("disable_tracking", true);
@ -6248,35 +6256,34 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
}
private void onActionForceLight(TupleMessageEx message) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
View view = LayoutInflater.from(context).inflate(R.layout.dialog_dark, null);
final Button btnIssue = view.findViewById(R.id.btnIssue);
btnIssue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uri.parse("https://issuetracker.google.com/issues/237785596");
Helper.view(v.getContext(), uri, true);
}
});
new AlertDialog.Builder(context)
.setView(view)
.setNegativeButton(android.R.string.cancel, null)
.show();
return;
}
if (canDarken) {
if (canDarken || fake_dark) {
boolean force_light = !properties.getValue("force_light", message.id);
properties.setValue("force_light", message.id, force_light);
ibForceLight.setImageLevel(force_light ? 1 : 0);
bindBody(message, false);
} else {
Intent update = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse(Helper.PACKAGE_WEBVIEW))
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(update);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
View view = LayoutInflater.from(context).inflate(R.layout.dialog_dark, null);
final Button btnIssue = view.findViewById(R.id.btnIssue);
btnIssue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uri.parse("https://issuetracker.google.com/issues/237785596");
Helper.view(v.getContext(), uri, true);
}
});
new AlertDialog.Builder(context)
.setView(view)
.setNegativeButton(android.R.string.cancel, null)
.show();
} else {
Intent update = new Intent(Intent.ACTION_VIEW)
.setData(Uri.parse(Helper.PACKAGE_WEBVIEW))
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(update);
}
}
}
@ -7113,6 +7120,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
level = prefs.getInt("log_level", Log.getDefaultLogLevel());
this.canDarken = WebViewEx.isFeatureSupported(context, WebViewFeature.ALGORITHMIC_DARKENING);
this.fake_dark = prefs.getBoolean("fake_dark", false);
this.webview_legacy = prefs.getBoolean("webview_legacy", false);
this.show_recent = prefs.getBoolean("show_recent", false);

View File

@ -161,6 +161,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
private SwitchCompat swUndoManager;
private SwitchCompat swWebViewLegacy;
private SwitchCompat swBrowserZoom;
private SwitchCompat swFakeDark;
private SwitchCompat swShowRecent;
private SwitchCompat swModSeq;
private SwitchCompat swUid;
@ -216,7 +217,9 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
"test2", "test3", "test4", "test5",
"work_manager", // "external_storage",
"query_threads", "wal", "sqlite_checkpoints", "sqlite_analyze", "sqlite_cache",
"chunk_size", "thread_range", "undo_manager", "webview_legacy", "browser_zoom", "show_recent",
"chunk_size", "thread_range", "undo_manager",
"webview_legacy", "browser_zoom", "fake_dark",
"show_recent",
"use_modseq", "uid_command", "perform_expunge", "uid_expunge",
"auth_plain", "auth_login", "auth_ntlm", "auth_sasl", "auth_apop",
"keep_alive_poll", "empty_pool", "idle_done", "logarithmic_backoff",
@ -338,6 +341,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swUndoManager = view.findViewById(R.id.swUndoManager);
swWebViewLegacy = view.findViewById(R.id.swWebViewLegacy);
swBrowserZoom = view.findViewById(R.id.swBrowserZoom);
swFakeDark = view.findViewById(R.id.swFakeDark);
swShowRecent = view.findViewById(R.id.swShowRecent);
swModSeq = view.findViewById(R.id.swModSeq);
swUid = view.findViewById(R.id.swUid);
@ -1050,6 +1054,13 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
}
});
swFakeDark.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("fake_dark", checked).apply();
}
});
swShowRecent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@ -1772,6 +1783,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swUndoManager.setChecked(prefs.getBoolean("undo_manager", false));
swWebViewLegacy.setChecked(prefs.getBoolean("webview_legacy", false));
swBrowserZoom.setChecked(prefs.getBoolean("browser_zoom", false));
swFakeDark.setChecked(prefs.getBoolean("fake_dark", false));
swShowRecent.setChecked(prefs.getBoolean("show_recent", false));
swModSeq.setChecked(prefs.getBoolean("use_modseq", true));
swUid.setChecked(prefs.getBoolean("uid_command", false));

View File

@ -2372,6 +2372,14 @@ public class HtmlHelper {
document.select("head").append(sb.toString());
}
static void fakeDark(Document document) {
// https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/invert
// https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/hue-rotate
document.head().appendElement("style").html(
"body { filter: invert(100%) hue-rotate(180deg) !important; background: black !important; }" +
"img { filter: invert(100%) hue-rotate(180deg) !important; }");
}
static String getLanguage(Context context, String subject, String text) {
try {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

View File

@ -369,6 +369,11 @@ public class WebViewEx extends WebView implements DownloadListener, View.OnLongC
public static boolean isFeatureSupported(Context context, String feature) {
if (WebViewFeature.ALGORITHMIC_DARKENING.equals(feature)) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean fake_dark = prefs.getBoolean("fake_dark", false);
if (fake_dark)
return false;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q)
return false;

View File

@ -1030,6 +1030,18 @@
app:layout_constraintTop_toBottomOf="@id/swWebViewLegacy"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swFakeDark"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:checked="true"
android:text="@string/title_advanced_fake_dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swBrowserZoom"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swShowRecent"
android:layout_width="0dp"
@ -1039,7 +1051,7 @@
android:text="@string/title_advanced_show_recent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swBrowserZoom"
app:layout_constraintTop_toBottomOf="@id/swFakeDark"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat

View File

@ -760,6 +760,7 @@
<string name="title_advanced_undo_manager" translatable="false">Use Android\'s undo manager</string>
<string name="title_advanced_webview_legacy" translatable="false">Old WebView behavior</string>
<string name="title_advanced_browser_zoom" translatable="false">Use browser zoom</string>
<string name="title_advanced_fake_dark" translatable="false">Fake dark</string>
<string name="title_advanced_show_recent" translatable="false">Show recent flag</string>
<string name="title_advanced_modseq" translatable="false">MODSEQ</string>
<string name="title_advanced_uid" translatable="false">UID command</string>