diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/AlertDialog.java | 16 | ||||
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 3 | ||||
| -rw-r--r-- | core/java/android/app/DialogFragment.java | 2 | ||||
| -rwxr-xr-x | core/java/android/content/res/Resources.java | 12 | ||||
| -rw-r--r-- | core/java/android/inputmethodservice/InputMethodService.java | 4 | ||||
| -rw-r--r-- | core/java/android/os/Build.java | 9 | ||||
| -rw-r--r-- | core/java/android/provider/ContactsContract.java | 126 | ||||
| -rw-r--r-- | core/java/android/view/InputChannel.java | 7 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 30 | ||||
| -rw-r--r-- | core/java/android/widget/AbsSeekBar.java | 53 | ||||
| -rw-r--r-- | core/java/android/widget/SeekBar.java | 2 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 41 |
12 files changed, 206 insertions, 99 deletions
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java index 491fcfe..c09e87f 100644 --- a/core/java/android/app/AlertDialog.java +++ b/core/java/android/app/AlertDialog.java @@ -75,6 +75,18 @@ public class AlertDialog extends Dialog implements DialogInterface { * the holographic alert theme with a light background. */ public static final int THEME_HOLO_LIGHT = 3; + + /** + * Special theme constant for {@link #AlertDialog(Context, int)}: use + * the device's default alert theme with a dark background. + */ + public static final int THEME_DEVICE_DEFAULT_DARK = 4; + + /** + * Special theme constant for {@link #AlertDialog(Context, int)}: use + * the device's default alert theme with a dark background. + */ + public static final int THEME_DEVICE_DEFAULT_LIGHT = 5; protected AlertDialog(Context context) { this(context, resolveDialogTheme(context, 0), true); @@ -113,6 +125,10 @@ public class AlertDialog extends Dialog implements DialogInterface { return com.android.internal.R.style.Theme_Holo_Dialog_Alert; } else if (resid == THEME_HOLO_LIGHT) { return com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert; + } else if (resid == THEME_DEVICE_DEFAULT_DARK) { + return com.android.internal.R.style.Theme_DeviceDefault_Dialog_Alert; + } else if (resid == THEME_DEVICE_DEFAULT_LIGHT) { + return com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog_Alert; } else if (resid >= 0x01000000) { // start of real resource IDs. return resid; } else { diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index b4bdb2f..2139704 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -364,7 +364,8 @@ class ContextImpl extends Context { Resources.selectSystemTheme(0, outerContext.getApplicationInfo().targetSdkVersion, com.android.internal.R.style.Theme_Dialog, - com.android.internal.R.style.Theme_Holo_Dialog)), + com.android.internal.R.style.Theme_Holo_Dialog, + com.android.internal.R.style.Theme_DeviceDefault_Dialog)), ctx.mMainThread.getHandler()); }}); diff --git a/core/java/android/app/DialogFragment.java b/core/java/android/app/DialogFragment.java index cce7cd6..8921578 100644 --- a/core/java/android/app/DialogFragment.java +++ b/core/java/android/app/DialogFragment.java @@ -204,7 +204,7 @@ public class DialogFragment extends Fragment public void setStyle(int style, int theme) { mStyle = style; if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) { - mTheme = com.android.internal.R.style.Theme_Holo_Dialog_NoFrame; + mTheme = com.android.internal.R.style.Theme_DeviceDefault_Dialog_NoFrame; } if (theme != 0) { mTheme = theme; diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index f526923..24f8319 100755 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -134,18 +134,24 @@ public class Resources { /** @hide */ public static int selectDefaultTheme(int curTheme, int targetSdkVersion) { return selectSystemTheme(curTheme, targetSdkVersion, - com.android.internal.R.style.Theme, com.android.internal.R.style.Theme_Holo); + com.android.internal.R.style.Theme, + com.android.internal.R.style.Theme_Holo, + com.android.internal.R.style.Theme_DeviceDefault); } /** @hide */ - public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo) { + public static int selectSystemTheme(int curTheme, int targetSdkVersion, + int orig, int holo, int deviceDefault) { if (curTheme != 0) { return curTheme; } if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) { return orig; } - return holo; + if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return holo; + } + return deviceDefault; } /** diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 9481a88..370e22a 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -617,7 +617,9 @@ public class InputMethodService extends AbstractInputMethodService { @Override public void onCreate() { mTheme = Resources.selectSystemTheme(mTheme, getApplicationInfo().targetSdkVersion, - android.R.style.Theme_InputMethod, android.R.style.Theme_Holo_InputMethod); + android.R.style.Theme_InputMethod, + android.R.style.Theme_Holo, + android.R.style.Theme_DeviceDefault_InputMethod); super.setTheme(mTheme); super.onCreate(); mImm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 6c7c58d..1e9ee7c 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -287,6 +287,15 @@ public class Build { * {@link android.R.attr#hardwareAccelerated android:hardwareAccelerated} * to turn it off if needed, although this is strongly discouraged since * it will result in poor performance on larger screen devices. + * <li> The default theme for applications is now the "device default" theme: + * {@link android.R.style#Theme_DeviceDefault}. This may be the + * holo dark theme or a different dark theme defined by the specific device. + * The {@link android.R.style#Theme_Holo} family must not be modified + * for a device to be considered compatible. Applications that explicitly + * request a theme from the Holo family will be guaranteed that these themes + * will not change character within the same platform version. Applications + * that wish to blend in with the device should use a theme from the + * {@link android.R.style#Theme_DeviceDefault} family. * </ul> */ public static final int ICE_CREAM_SANDWICH = CUR_DEVELOPMENT; diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 5765dde..d867e35 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -2890,8 +2890,6 @@ public final class ContactsContract { * values.put(StreamItems.TEXT, "Breakfasted at Tiffanys"); * values.put(StreamItems.TIMESTAMP, timestamp); * values.put(StreamItems.COMMENTS, "3 people reshared this"); - * values.put(StreamItems.ACTION, action); - * values.put(StreamItems.ACTION_URI, actionUri); * Uri streamItemUri = getContentResolver().insert( * Uri.withAppendedPath(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), * RawContacts.StreamItems.CONTENT_DIRECTORY), values); @@ -2905,8 +2903,6 @@ public final class ContactsContract { * values.put(StreamItems.TEXT, "Breakfasted at Tiffanys"); * values.put(StreamItems.TIMESTAMP, timestamp); * values.put(StreamItems.COMMENTS, "3 people reshared this"); - * values.put(StreamItems.ACTION, action); - * values.put(StreamItems.ACTION_URI, actionUri); * Uri streamItemUri = getContentResolver().insert(StreamItems.CONTENT_URI, values); * long streamItemId = ContentUris.parseId(streamItemUri); * </dd> @@ -2924,8 +2920,6 @@ public final class ContactsContract { * values.clear(); * values.put(StreamItemPhotos.SORT_INDEX, 1); * values.put(StreamItemPhotos.PHOTO, photoData); - * values.put(StreamItemPhotos.ACTION, action); - * values.put(StreamItemPhotos.ACTION_URI, actionUri); * getContentResolver().insert(Uri.withAppendedPath( * ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId), * StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), values); @@ -2938,8 +2932,6 @@ public final class ContactsContract { * values.put(StreamItemPhotos.STREAM_ITEM_ID, streamItemId); * values.put(StreamItemPhotos.SORT_INDEX, 1); * values.put(StreamItemPhotos.PHOTO, photoData); - * values.put(StreamItemPhotos.ACTION, action); - * values.put(StreamItemPhotos.ACTION_URI, actionUri); * getContentResolver().insert(StreamItems.CONTENT_PHOTO_URI, values); * </pre> * Note that this latter form allows the insertion of a stream item and its @@ -3081,16 +3073,56 @@ public final class ContactsContract { public static final String RES_PACKAGE = "res_package"; /** - * The resource ID of the icon for the source of the stream item. - * This resource should be scoped by the {@link #RES_PACKAGE}. - * <P>Type: NUMBER</P> + * The account type to which the raw_contact of this item is associated. See + * {@link RawContacts#ACCOUNT_TYPE} + * + * <p>TYPE: text</p> + * <p>read-only</p> + */ + public static final String ACCOUNT_TYPE = "account_type"; + + /** + * The account name to which the raw_contact of this item is associated. See + * {@link RawContacts#ACCOUNT_NAME} + * + * <p>TYPE: text</p> + * <p>read-only</p> + */ + public static final String ACCOUNT_NAME = "account_name"; + + /** + * The data set within the account that the raw_contact of this row belongs to. This allows + * multiple sync adapters for the same account type to distinguish between + * each others' data. + * {@link RawContacts#DATA_SET} + * + * <P>Type: TEXT</P> + * <p>read-only</p> + */ + public static final String DATA_SET = "data_set"; + + /** + * The source_id of the raw_contact that this row belongs to. + * {@link RawContacts#SOURCE_ID} + * + * <P>Type: TEXT</P> + * <p>read-only</p> + */ + public static final String RAW_CONTACT_SOURCE_ID = "raw_contact_source_id"; + + /** + * The resource name of the icon for the source of the stream item. + * This resource should be scoped by the {@link #RES_PACKAGE}. As this can only reference + * drawables, the "@drawable/" prefix must be omitted. + * <P>Type: TEXT</P> */ public static final String RES_ICON = "icon"; /** - * The resource ID of the label describing the source of the status update, e.g. "Google - * Talk". This resource should be scoped by the {@link #RES_PACKAGE}. - * <p>Type: NUMBER</p> + * The resource name of the label describing the source of the status update, e.g. "Google + * Talk". This resource should be scoped by the {@link #RES_PACKAGE}. As this can only + * reference strings, the "@string/" prefix must be omitted. + * <p>Type: TEXT</p> */ public static final String RES_LABEL = "label"; @@ -3136,18 +3168,14 @@ public final class ContactsContract { */ public static final String COMMENTS = "comments"; - /** - * The activity action to execute when the item is tapped. - * <P>Type: TEXT</P> - */ - public static final String ACTION = "action"; - - /** - * The URI that is launched when the item is pressed. May be handled by - * the source app, but could also reference a website (e.g. YouTube). - * <P>Type: TEXT</P> - */ - public static final String ACTION_URI = "action_uri"; + /** Generic column for use by sync adapters. */ + public static final String SYNC1 = "stream_item_sync1"; + /** Generic column for use by sync adapters. */ + public static final String SYNC2 = "stream_item_sync2"; + /** Generic column for use by sync adapters. */ + public static final String SYNC3 = "stream_item_sync3"; + /** Generic column for use by sync adapters. */ + public static final String SYNC4 = "stream_item_sync4"; } /** @@ -3171,8 +3199,6 @@ public final class ContactsContract { * ContentValues values = new ContentValues(); * values.put(StreamItemPhotos.SORT_INDEX, 1); * values.put(StreamItemPhotos.PHOTO, photoData); - * values.put(StreamItemPhotos.ACTION, action); - * values.put(StreamItemPhotos.ACTION_URI, actionUri); * Uri photoUri = getContentResolver().insert(Uri.withAppendedPath( * ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId) * StreamItems.StreamItemPhotos#CONTENT_DIRECTORY), values); @@ -3186,8 +3212,6 @@ public final class ContactsContract { * values.put(StreamItemPhotos.STREAM_ITEM_ID, streamItemId); * values.put(StreamItemPhotos.SORT_INDEX, 1); * values.put(StreamItemPhotos.PHOTO, photoData); - * values.put(StreamItemPhotos.ACTION, action); - * values.put(StreamItemPhotos.ACTION_URI, actionUri); * Uri photoUri = getContentResolver().insert(StreamItems.CONTENT_PHOTO_URI, values); * long photoId = ContentUris.parseId(photoUri); * </pre> @@ -3353,18 +3377,14 @@ public final class ContactsContract { */ public static final String PHOTO_URI = "photo_uri"; - /** - * The activity action to execute when the photo is tapped. - * <P>Type: TEXT</P> - */ - public static final String ACTION = "action"; - - /** - * The URI that is launched when the photo is pressed. May be handled by - * the source app, but could also reference a website (e.g. YouTube). - * <P>Type: TEXT</P> - */ - public static final String ACTION_URI = "action_uri"; + /** Generic column for use by sync adapters. */ + public static final String SYNC1 = "stream_item_photo_sync1"; + /** Generic column for use by sync adapters. */ + public static final String SYNC2 = "stream_item_photo_sync2"; + /** Generic column for use by sync adapters. */ + public static final String SYNC3 = "stream_item_photo_sync3"; + /** Generic column for use by sync adapters. */ + public static final String SYNC4 = "stream_item_photo_sync4"; } /** @@ -6496,28 +6516,6 @@ public final class ContactsContract { public static final String NOTES = "notes"; /** - * The Activity action to open the group in the source app (e.g. - * {@link Intent#ACTION_VIEW}). Can be NULL if the group does not have a dedicated viewer. - * This is used in conjunction with {@link #ACTION_URI}: In order to show an "Open in - * (sourceapp)"-button, both of these fields must be set - * <p> - * Type: TEXT - */ - public static final String ACTION = "action"; - - - /** - * Uri to open the group in the source app. - * Can be NULL if the group does not have a dedicated viewer. - * This is used in conjunction with {@link #ACTION}: In order to show an "Open in - * (sourceapp)"-button, both of these fields must be set - * <p> - * Type: TEXT - */ - public static final String ACTION_URI = "action_uri"; - - - /** * The ID of this group if it is a System Group, i.e. a group that has a special meaning * to the sync adapter, null otherwise. * <P>Type: TEXT</P> diff --git a/core/java/android/view/InputChannel.java b/core/java/android/view/InputChannel.java index f2cad2f..523af04 100644 --- a/core/java/android/view/InputChannel.java +++ b/core/java/android/view/InputChannel.java @@ -48,8 +48,6 @@ public final class InputChannel implements Parcelable { @SuppressWarnings("unused") private int mPtr; // used by native code - private boolean mDisposeAfterWriteToParcel; - private static native InputChannel[] nativeOpenInputChannelPair(String name); private native void nativeDispose(boolean finalized); @@ -117,13 +115,12 @@ public final class InputChannel implements Parcelable { * as an out parameter in a binder call. * @param other The other input channel instance. */ - public void transferToBinderOutParameter(InputChannel outParameter) { + public void transferTo(InputChannel outParameter) { if (outParameter == null) { throw new IllegalArgumentException("outParameter must not be null"); } nativeTransferTo(outParameter); - outParameter.mDisposeAfterWriteToParcel = true; } public int describeContents() { @@ -145,7 +142,7 @@ public final class InputChannel implements Parcelable { nativeWriteToParcel(out); - if (mDisposeAfterWriteToParcel) { + if ((flags & PARCELABLE_WRITE_RETURN_VALUE) != 0) { dispose(); } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 5b77cf7..54bd637 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6249,15 +6249,7 @@ public class View implements Drawable.Callback2, KeyEvent.Callback, Accessibilit } // Walk up the hierarchy to determine if we're inside a scrolling container. - boolean isInScrollingContainer = false; - ViewParent p = getParent(); - while (p != null && p instanceof ViewGroup) { - if (((ViewGroup) p).shouldDelayChildPressedState()) { - isInScrollingContainer = true; - break; - } - p = p.getParent(); - } + boolean isInScrollingContainer = isInScrollingContainer(); // For views inside a scrolling container, delay the pressed feedback for // a short period in case this is a scroll. @@ -6307,6 +6299,20 @@ public class View implements Drawable.Callback2, KeyEvent.Callback, Accessibilit } /** + * @hide + */ + public boolean isInScrollingContainer() { + ViewParent p = getParent(); + while (p != null && p instanceof ViewGroup) { + if (((ViewGroup) p).shouldDelayChildPressedState()) { + return true; + } + p = p.getParent(); + } + return false; + } + + /** * Remove the longpress detection timer. */ private void removeLongPressCallback() { @@ -8774,6 +8780,12 @@ public class View implements Drawable.Callback2, KeyEvent.Callback, Accessibilit * @see #SCROLLBARS_OUTSIDE_OVERLAY * @see #SCROLLBARS_OUTSIDE_INSET */ + @ViewDebug.ExportedProperty(mapping = { + @ViewDebug.IntToString(from = SCROLLBARS_INSIDE_OVERLAY, to = "INSIDE_OVERLAY"), + @ViewDebug.IntToString(from = SCROLLBARS_INSIDE_INSET, to = "INSIDE_INSET"), + @ViewDebug.IntToString(from = SCROLLBARS_OUTSIDE_OVERLAY, to = "OUTSIDE_OVERLAY"), + @ViewDebug.IntToString(from = SCROLLBARS_OUTSIDE_INSET, to = "OUTSIDE_INSET") + }) public int getScrollBarStyle() { return mViewFlags & SCROLLBARS_STYLE_MASK; } diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index 2621e64..df8eb05 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -24,6 +24,7 @@ import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; +import android.view.ViewConfiguration; public abstract class AbsSeekBar extends ProgressBar { private Drawable mThumb; @@ -49,6 +50,10 @@ public abstract class AbsSeekBar extends ProgressBar { private static final int NO_ALPHA = 0xFF; private float mDisabledAlpha; + private int mScaledTouchSlop; + private float mTouchDownX; + private boolean mIsDragging; + public AbsSeekBar(Context context) { super(context); } @@ -74,6 +79,8 @@ public abstract class AbsSeekBar extends ProgressBar { com.android.internal.R.styleable.Theme, 0, 0); mDisabledAlpha = a.getFloat(com.android.internal.R.styleable.Theme_disabledAlpha, 0.5f); a.recycle(); + + mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); } /** @@ -324,20 +331,42 @@ public abstract class AbsSeekBar extends ProgressBar { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: - setPressed(true); - onStartTrackingTouch(); - trackTouchEvent(event); + if (isInScrollingContainer()) { + mTouchDownX = event.getX(); + } else { + setPressed(true); + onStartTrackingTouch(); + trackTouchEvent(event); + attemptClaimDrag(); + } break; case MotionEvent.ACTION_MOVE: - trackTouchEvent(event); - attemptClaimDrag(); + if (mIsDragging) { + trackTouchEvent(event); + } else { + final float x = event.getX(); + if (Math.abs(x - mTouchDownX) > mScaledTouchSlop) { + setPressed(true); + onStartTrackingTouch(); + trackTouchEvent(event); + attemptClaimDrag(); + } + } break; case MotionEvent.ACTION_UP: - trackTouchEvent(event); - onStopTrackingTouch(); - setPressed(false); + if (mIsDragging) { + trackTouchEvent(event); + onStopTrackingTouch(); + setPressed(false); + } else { + // Touch up when we never crossed the touch slop threshold should + // be interpreted as a tap-seek to that location. + onStartTrackingTouch(); + trackTouchEvent(event); + onStopTrackingTouch(); + } // ProgressBar doesn't know to repaint the thumb drawable // in its inactive state when the touch stops (because the // value has not apparently changed) @@ -345,8 +374,10 @@ public abstract class AbsSeekBar extends ProgressBar { break; case MotionEvent.ACTION_CANCEL: - onStopTrackingTouch(); - setPressed(false); + if (mIsDragging) { + onStopTrackingTouch(); + setPressed(false); + } invalidate(); // see above explanation break; } @@ -388,6 +419,7 @@ public abstract class AbsSeekBar extends ProgressBar { * This is called when the user has started touching this widget. */ void onStartTrackingTouch() { + mIsDragging = true; } /** @@ -395,6 +427,7 @@ public abstract class AbsSeekBar extends ProgressBar { * canceled. */ void onStopTrackingTouch() { + mIsDragging = false; } /** diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java index dfee29b..c76728f 100644 --- a/core/java/android/widget/SeekBar.java +++ b/core/java/android/widget/SeekBar.java @@ -104,6 +104,7 @@ public class SeekBar extends AbsSeekBar { @Override void onStartTrackingTouch() { + super.onStartTrackingTouch(); if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStartTrackingTouch(this); } @@ -111,6 +112,7 @@ public class SeekBar extends AbsSeekBar { @Override void onStopTrackingTouch() { + super.onStopTrackingTouch(); if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStopTrackingTouch(this); } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index d78050a..1ab1a87 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -139,6 +139,11 @@ import com.android.internal.widget.EditableInputConnection; import org.xmlpull.v1.XmlPullParserException; +import com.android.internal.util.FastMath; +import com.android.internal.widget.EditableInputConnection; + +import org.xmlpull.v1.XmlPullParserException; + import java.io.IOException; import java.lang.ref.WeakReference; import java.text.BreakIterator; @@ -220,6 +225,7 @@ import java.util.HashMap; * @attr ref android.R.styleable#TextView_imeActionLabel * @attr ref android.R.styleable#TextView_imeActionId * @attr ref android.R.styleable#TextView_editorExtras + * @attr ref android.R.styleable#TextView_suggestionsEnabled */ @RemoteView public class TextView extends View implements ViewTreeObserver.OnPreDrawListener { @@ -9418,7 +9424,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } void showSuggestions() { - if (!mSuggestionsEnabled || !isTextEditable()) return; + if (!isSuggestionsEnabled() || !isTextEditable()) return; if (mSuggestionsPopupWindow == null) { mSuggestionsPopupWindow = new SuggestionsPopupWindow(); @@ -9445,18 +9451,41 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * user double taps on these parts of the text. No suggestions are displayed when this value is * false. Use {@link #setSuggestionsEnabled(boolean)} to change this value. * + * Note that suggestions are only enabled for a subset of input types. In addition to setting + * this flag to <code>true</code> using {@link #setSuggestionsEnabled(boolean)} or the + * <code>android:suggestionsEnabled</code> xml attribute, this method will return + * <code>true</code> only if the class of your input type is {@link InputType#TYPE_CLASS_TEXT}. + * In addition, the type variation must also be one of + * {@link InputType#TYPE_TEXT_VARIATION_NORMAL}, + * {@link InputType#TYPE_TEXT_VARIATION_EMAIL_SUBJECT}, + * {@link InputType#TYPE_TEXT_VARIATION_LONG_MESSAGE}, + * {@link InputType#TYPE_TEXT_VARIATION_SHORT_MESSAGE} or + * {@link InputType#TYPE_TEXT_VARIATION_WEB_EDIT_TEXT}. + * * @return true if the suggestions popup window is enabled. * * @attr ref android.R.styleable#TextView_suggestionsEnabled */ public boolean isSuggestionsEnabled() { - return mSuggestionsEnabled; + if (!mSuggestionsEnabled) return false; + if ((mInputType & InputType.TYPE_MASK_CLASS) != InputType.TYPE_CLASS_TEXT) return false; + final int variation = + mInputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION); + if (variation == EditorInfo.TYPE_TEXT_VARIATION_NORMAL || + variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_SUBJECT || + variation == EditorInfo.TYPE_TEXT_VARIATION_LONG_MESSAGE || + variation == EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE || + variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) return true; + + return false; } /** * Enables or disables the suggestion popup. See {@link #isSuggestionsEnabled()}. * * @param enabled Whether or not suggestions are enabled. + * + * @attr ref android.R.styleable#TextView_suggestionsEnabled */ public void setSuggestionsEnabled(boolean enabled) { mSuggestionsEnabled = enabled; @@ -9728,10 +9757,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override public void show() { - mPasteTextView.setVisibility(canPaste() ? View.VISIBLE : View.GONE); - mReplaceTextView.setVisibility(mSuggestionsEnabled ? View.VISIBLE : View.GONE); + boolean canPaste = canPaste(); + boolean suggestionsEnabled = isSuggestionsEnabled(); + mPasteTextView.setVisibility(canPaste ? View.VISIBLE : View.GONE); + mReplaceTextView.setVisibility(suggestionsEnabled ? View.VISIBLE : View.GONE); - if (!canPaste() && !mSuggestionsEnabled) return; + if (!canPaste && !suggestionsEnabled) return; super.show(); } |
