From bbd31559f32f86a100904fe8a5bc37677b5ba441 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Mon, 11 Jun 2012 12:08:18 -0700 Subject: [PATCH] NPE when iterating by character and word in Launcher widgets. 1. The character and word iterators were use the application context to keep track of locale changes. However, for widgets the context from which the app context is obtained is custom created therefore the app context is null and the iterators code does not expect that. Now we are caching the locale and update it when the configuration changes. bug:6642281 Change-Id: I3fd201ab9e4efd79e3bdc8afd8ee644e4354a7fb --- .../android/view/AccessibilityIterators.java | 26 +++++++++---------- core/java/android/view/View.java | 6 +++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/java/android/view/AccessibilityIterators.java b/core/java/android/view/AccessibilityIterators.java index 2a7dc181def1a..17ce4f639f289 100644 --- a/core/java/android/view/AccessibilityIterators.java +++ b/core/java/android/view/AccessibilityIterators.java @@ -70,20 +70,19 @@ public final class AccessibilityIterators { implements ComponentCallbacks { private static CharacterTextSegmentIterator sInstance; - private final Context mAppContext; + private Locale mLocale; protected BreakIterator mImpl; - public static CharacterTextSegmentIterator getInstance(Context context) { + public static CharacterTextSegmentIterator getInstance(Locale locale) { if (sInstance == null) { - sInstance = new CharacterTextSegmentIterator(context); + sInstance = new CharacterTextSegmentIterator(locale); } return sInstance; } - private CharacterTextSegmentIterator(Context context) { - mAppContext = context.getApplicationContext(); - Locale locale = mAppContext.getResources().getConfiguration().locale; + private CharacterTextSegmentIterator(Locale locale) { + mLocale = locale; onLocaleChanged(locale); ViewRootImpl.addConfigCallback(this); } @@ -148,10 +147,9 @@ public final class AccessibilityIterators { @Override public void onConfigurationChanged(Configuration newConfig) { - Configuration oldConfig = mAppContext.getResources().getConfiguration(); - final int changed = oldConfig.diff(newConfig); - if ((changed & ActivityInfo.CONFIG_LOCALE) != 0) { - Locale locale = newConfig.locale; + Locale locale = newConfig.locale; + if (!mLocale.equals(locale)) { + mLocale = locale; onLocaleChanged(locale); } } @@ -169,15 +167,15 @@ public final class AccessibilityIterators { static class WordTextSegmentIterator extends CharacterTextSegmentIterator { private static WordTextSegmentIterator sInstance; - public static WordTextSegmentIterator getInstance(Context context) { + public static WordTextSegmentIterator getInstance(Locale locale) { if (sInstance == null) { - sInstance = new WordTextSegmentIterator(context); + sInstance = new WordTextSegmentIterator(locale); } return sInstance; } - private WordTextSegmentIterator(Context context) { - super(context); + private WordTextSegmentIterator(Locale locale) { + super(locale); } @Override diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f005eeba151c6..816b631bf987b 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6957,7 +6957,8 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal CharSequence text = getIterableTextForAccessibility(); if (text != null && text.length() > 0) { CharacterTextSegmentIterator iterator = - CharacterTextSegmentIterator.getInstance(mContext); + CharacterTextSegmentIterator.getInstance( + mContext.getResources().getConfiguration().locale); iterator.initialize(text.toString()); return iterator; } @@ -6966,7 +6967,8 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal CharSequence text = getIterableTextForAccessibility(); if (text != null && text.length() > 0) { WordTextSegmentIterator iterator = - WordTextSegmentIterator.getInstance(mContext); + WordTextSegmentIterator.getInstance( + mContext.getResources().getConfiguration().locale); iterator.initialize(text.toString()); return iterator; }