diff options
author | Clark Scheff <clark@cyngn.com> | 2015-01-27 17:19:55 -0800 |
---|---|---|
committer | Clark Scheff <clark@cyngn.com> | 2015-10-27 10:39:27 -0700 |
commit | b7108ea9ce7ad2226aa6340046d24e069c6e8e21 (patch) | |
tree | 21a8592ad3d63f0e5584cb1efa3008f4ba92d376 /graphics | |
parent | b28503eb9a5d5aaba8798f2c45f277b476f0de10 (diff) | |
download | frameworks_base-b7108ea9ce7ad2226aa6340046d24e069c6e8e21.zip frameworks_base-b7108ea9ce7ad2226aa6340046d24e069c6e8e21.tar.gz frameworks_base-b7108ea9ce7ad2226aa6340046d24e069c6e8e21.tar.bz2 |
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
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/java/android/graphics/Typeface.java | 51 |
1 files changed, 31 insertions, 20 deletions
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, |