From b7108ea9ce7ad2226aa6340046d24e069c6e8e21 Mon Sep 17 00:00:00 2001 From: Clark Scheff Date: Tue, 27 Jan 2015 17:19:55 -0800 Subject: Themes: Let garbage collector free up native instances This patch introduces typefaces which mirror the public ones but are not final so they can be garbage collected and the native instance freed without causing native crashes when we try to unreference them manually during a font change. Change-Id: I488fb8f05e9b2bcaac07fccbea267f93c93f6dd6 --- graphics/java/android/graphics/Typeface.java | 51 +++++++++++++++++----------- 1 file changed, 31 insertions(+), 20 deletions(-) (limited to 'graphics') diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index 2f1a6b1..68c9c0b 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -82,6 +82,13 @@ public class Typeface { private int mStyle = 0; + // Typefaces that we can garbage collect when changing fonts, and so we don't break public APIs + private static Typeface DEFAULT_INTERNAL; + private static Typeface DEFAULT_BOLD_INTERNAL; + private static Typeface SANS_SERIF_INTERNAL; + private static Typeface SERIF_INTERNAL; + private static Typeface MONOSPACE_INTERNAL; + private static void setDefault(Typeface t) { sDefaultTypeface = t; nativeSetDefault(t.native_instance); @@ -439,31 +446,35 @@ public class Typeface { sSystemFontMap.clear(); init(); - long newDefault = create((String) null, 0).native_instance; - long newDefaultBold = create((String) null, Typeface.BOLD).native_instance; - long newSansSerif = create("sans-serif", 0).native_instance; - long newSerif = create("serif", 0).native_instance; - long newMonoSpace = create("monospace", 0).native_instance; - long newItalic = create((String) null, Typeface.ITALIC).native_instance; - long newBoldItalic = create((String) null, Typeface.BOLD_ITALIC).native_instance; - - DEFAULT.native_instance = newDefault; - DEFAULT_BOLD.native_instance = newDefaultBold; - SANS_SERIF.native_instance = newSansSerif; - SERIF.native_instance = newSerif; - MONOSPACE.native_instance = newMonoSpace; - sDefaults[2].native_instance = newItalic; - sDefaults[3].native_instance = newBoldItalic; + DEFAULT_INTERNAL = create((String) null, 0); + DEFAULT_BOLD_INTERNAL = create((String) null, Typeface.BOLD); + SANS_SERIF_INTERNAL = create("sans-serif", 0); + SERIF_INTERNAL = create("serif", 0); + MONOSPACE_INTERNAL = create("monospace", 0); + + DEFAULT.native_instance = DEFAULT_INTERNAL.native_instance; + DEFAULT_BOLD.native_instance = DEFAULT_BOLD_INTERNAL.native_instance; + SANS_SERIF.native_instance = SANS_SERIF_INTERNAL.native_instance; + SERIF.native_instance = SERIF_INTERNAL.native_instance; + MONOSPACE.native_instance = MONOSPACE_INTERNAL.native_instance; + sDefaults[2] = create((String) null, Typeface.ITALIC); + sDefaults[3] = create((String) null, Typeface.BOLD_ITALIC); } static { init(); // Set up defaults and typefaces exposed in public API - DEFAULT = create((String) null, 0); - DEFAULT_BOLD = create((String) null, Typeface.BOLD); - SANS_SERIF = create("sans-serif", 0); - SERIF = create("serif", 0); - MONOSPACE = create("monospace", 0); + DEFAULT_INTERNAL = create((String) null, 0); + DEFAULT_BOLD_INTERNAL = create((String) null, Typeface.BOLD); + SANS_SERIF_INTERNAL = create("sans-serif", 0); + SERIF_INTERNAL = create("serif", 0); + MONOSPACE_INTERNAL = create("monospace", 0); + + DEFAULT = new Typeface(DEFAULT_INTERNAL.native_instance); + DEFAULT_BOLD = new Typeface(DEFAULT_BOLD_INTERNAL.native_instance); + SANS_SERIF = new Typeface(SANS_SERIF_INTERNAL.native_instance); + SERIF = new Typeface(SERIF_INTERNAL.native_instance); + MONOSPACE = new Typeface(MONOSPACE_INTERNAL.native_instance); sDefaults = new Typeface[] { DEFAULT, -- cgit v1.1