From e9f54bfde27327df4b1c820a97df00546cffe1e9 Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Thu, 12 May 2016 18:18:12 +0900 Subject: [PATCH] Use original theme for SuggestsionsPopupWindow Some application set textColorPrimary as white, as the result the suggestion window draws white text on white background. To avoid this UX, always uses original theme for suggestions popup window. Bug: 28371168 Change-Id: I2ef41d162b63a7e277decc2065609a7d43590afe --- core/java/android/widget/Editor.java | 39 +++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 2813f0c889da4..c877ed2b89995 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -76,6 +76,7 @@ import android.util.SparseArray; import android.view.ActionMode; import android.view.ActionMode.Callback; import android.view.ContextMenu; +import android.view.ContextThemeWrapper; import android.view.DisplayListCanvas; import android.view.DragAndDropPermissions; import android.view.DragEvent; @@ -3004,8 +3005,16 @@ public class Editor { protected abstract int getTextOffset(); protected abstract int getVerticalLocalPosition(int line); protected abstract int clipVertically(int positionY); + protected void setUp() { + } public PinnedPopupWindow() { + // Due to calling subclass methods in base constructor, subclass constructor is not + // called before subclass methods, e.g. createPopupWindow or initContentView. To give + // a chance to initialize subclasses, call setUp() method here. + // TODO: It is good to extract non trivial initialization code from constructor. + setUp(); + createPopupWindow(); mPopupWindow.setWindowLayoutType( @@ -3267,8 +3276,7 @@ public class Editor { private boolean mCursorWasVisibleBeforeSuggestions; private boolean mIsShowingUp = false; private SuggestionAdapter mSuggestionsAdapter; - private final TextAppearanceSpan mHighlightSpan = new TextAppearanceSpan( - mTextView.getContext(), mTextView.mTextEditSuggestionHighlightStyle); + private TextAppearanceSpan mHighlightSpan; // TODO: Make mHighlightSpan final. private TextView mAddToDictionaryButton; private TextView mDeleteButton; private ListView mSuggestionListView; @@ -3276,8 +3284,10 @@ public class Editor { private int mContainerMarginWidth; private int mContainerMarginTop; private LinearLayout mContainerView; + private Context mContext; // TODO: Make mContext final. private class CustomPopupWindow extends PopupWindow { + @Override public void dismiss() { if (!isShowing()) { @@ -3300,6 +3310,23 @@ public class Editor { mCursorWasVisibleBeforeSuggestions = mCursorVisible; } + @Override + protected void setUp() { + mContext = applyDefaultTheme(mTextView.getContext()); + mHighlightSpan = new TextAppearanceSpan(mContext, + mTextView.mTextEditSuggestionHighlightStyle); + } + + private Context applyDefaultTheme(Context originalContext) { + TypedArray a = originalContext.obtainStyledAttributes( + new int[]{com.android.internal.R.attr.isLightTheme}); + boolean isLightTheme = a.getBoolean(0, true); + int themeId = isLightTheme ? R.style.ThemeOverlay_Material_Light + : R.style.ThemeOverlay_Material_Dark; + a.recycle(); + return new ContextThemeWrapper(originalContext, themeId); + } + @Override protected void createPopupWindow() { mPopupWindow = new CustomPopupWindow(); @@ -3311,8 +3338,8 @@ public class Editor { @Override protected void initContentView() { - final LayoutInflater inflater = (LayoutInflater) mTextView.getContext(). - getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( + Context.LAYOUT_INFLATER_SERVICE); mContentView = (ViewGroup) inflater.inflate( mTextView.mTextEditSuggestionContainerLayout, null); @@ -3405,8 +3432,8 @@ public class Editor { } private class SuggestionAdapter extends BaseAdapter { - private LayoutInflater mInflater = (LayoutInflater) mTextView.getContext(). - getSystemService(Context.LAYOUT_INFLATER_SERVICE); + private LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService( + Context.LAYOUT_INFLATER_SERVICE); @Override public int getCount() {