summaryrefslogtreecommitdiffstats
path: root/graphics
diff options
context:
space:
mode:
authorClark Scheff <clark@cyngn.com>2015-01-27 17:19:55 -0800
committerClark Scheff <clark@cyngn.com>2015-10-27 10:39:27 -0700
commitb7108ea9ce7ad2226aa6340046d24e069c6e8e21 (patch)
tree21a8592ad3d63f0e5584cb1efa3008f4ba92d376 /graphics
parentb28503eb9a5d5aaba8798f2c45f277b476f0de10 (diff)
downloadframeworks_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.java51
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,