From b8052bd8fb09b1c5f5cb38cc1d4716368583368c Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 25 Jul 2018 03:32:54 +0200 Subject: [PATCH] ThemeChangeAwareActivity: reintroduce cache buster This is still needed by certain icons, like the trash icon in the peer editor. Signed-off-by: Jason A. Donenfeld --- .../activity/ThemeChangeAwareActivity.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/app/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.java b/app/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.java index 75b7251b..d85a0170 100644 --- a/app/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.java +++ b/app/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.java @@ -6,14 +6,49 @@ package com.wireguard.android.activity; import android.content.SharedPreferences; +import android.content.res.Resources; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatDelegate; +import android.util.Log; import com.wireguard.android.Application; +import java.lang.reflect.Field; + public abstract class ThemeChangeAwareActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener { + private static final String TAG = "WireGuard/" + ThemeChangeAwareActivity.class.getSimpleName(); + + @Nullable private static Resources lastResources; + private static boolean lastDarkMode; + private static synchronized void invalidateDrawableCache(final Resources resources, final boolean darkMode) { + if (resources == lastResources && darkMode == lastDarkMode) + return; + + try { + Field f; + Object o = resources; + try { + f = o.getClass().getDeclaredField("mResourcesImpl"); + f.setAccessible(true); + o = f.get(o); + } catch (final Exception ignored) { } + f = o.getClass().getDeclaredField("mDrawableCache"); + f.setAccessible(true); + o = f.get(o); + try { + o.getClass().getMethod("onConfigurationChange", int.class).invoke(o, -1); + } catch (final Exception ignored) { + o.getClass().getMethod("clear").invoke(o); + } + } catch (final Exception e) { + Log.e(TAG, "Failed to flush drawable cache", e); + } + + lastResources = resources; + lastDarkMode = darkMode; + } @Override @@ -31,10 +66,12 @@ public abstract class ThemeChangeAwareActivity extends AppCompatActivity impleme @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { if ("dark_theme".equals(key)) { + final boolean darkMode = sharedPreferences.getBoolean(key, false); AppCompatDelegate.setDefaultNightMode( sharedPreferences.getBoolean(key, false) ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO); + invalidateDrawableCache(getResources(), darkMode); recreate(); } }