From 6a65f2da209bff03cb0eb6da309710ac6ee5026d Mon Sep 17 00:00:00 2001 From: Justin Klaassen Date: Fri, 17 Nov 2017 16:38:15 -0500 Subject: Import Android SDK Platform P [4456821] /google/data/ro/projects/android/fetch_artifact \ --bid 4456821 \ --target sdk_phone_armv7-win_sdk \ sdk-repo-linux-sources-4456821.zip AndroidVersion.ApiLevel has been modified to appear as 28 Change-Id: I2d206b200d7952f899a5d1647ab532638cc8dd43 --- android/widget/AbsListView.java | 9 +++- android/widget/Editor.java | 14 +++---- android/widget/PopupWindow.java | 1 + android/widget/SelectionActionModeHelper.java | 59 ++++++++++++++++++++------- 4 files changed, 57 insertions(+), 26 deletions(-) (limited to 'android/widget') diff --git a/android/widget/AbsListView.java b/android/widget/AbsListView.java index 170582b3..e0c897d3 100644 --- a/android/widget/AbsListView.java +++ b/android/widget/AbsListView.java @@ -3866,6 +3866,7 @@ public abstract class AbsListView extends AdapterView implements Te private void onTouchDown(MotionEvent ev) { mHasPerformedLongPress = false; mActivePointerId = ev.getPointerId(0); + hideSelector(); if (mTouchMode == TOUCH_MODE_OVERFLING) { // Stopped the fling. It is a scroll. @@ -5226,17 +5227,21 @@ public abstract class AbsListView extends AdapterView implements Te } mRecycler.fullyDetachScrapViews(); + boolean selectorOnScreen = false; if (!inTouchMode && mSelectedPosition != INVALID_POSITION) { final int childIndex = mSelectedPosition - mFirstPosition; if (childIndex >= 0 && childIndex < getChildCount()) { positionSelector(mSelectedPosition, getChildAt(childIndex)); + selectorOnScreen = true; } } else if (mSelectorPosition != INVALID_POSITION) { final int childIndex = mSelectorPosition - mFirstPosition; if (childIndex >= 0 && childIndex < getChildCount()) { - positionSelector(INVALID_POSITION, getChildAt(childIndex)); + positionSelector(mSelectorPosition, getChildAt(childIndex)); + selectorOnScreen = true; } - } else { + } + if (!selectorOnScreen) { mSelectorRect.setEmpty(); } diff --git a/android/widget/Editor.java b/android/widget/Editor.java index e6da69dc..d477ffdf 100644 --- a/android/widget/Editor.java +++ b/android/widget/Editor.java @@ -3842,14 +3842,10 @@ public class Editor { mProcessTextIntentActionsHandler.onInitializeMenu(menu); } - if (menu.hasVisibleItems() || mode.getCustomView() != null) { - if (mHasSelection && !mTextView.hasTransientState()) { - mTextView.setHasTransientState(true); - } - return true; - } else { - return false; + if (mHasSelection && !mTextView.hasTransientState()) { + mTextView.setHasTransientState(true); } + return true; } private Callback getCustomCallback() { @@ -6557,12 +6553,12 @@ public class Editor { * Adds "PROCESS_TEXT" menu items to the specified menu. */ public void onInitializeMenu(Menu menu) { - final int size = mSupportedActivities.size(); loadSupportedActivities(); + final int size = mSupportedActivities.size(); for (int i = 0; i < size; i++) { final ResolveInfo resolveInfo = mSupportedActivities.get(i); menu.add(Menu.NONE, Menu.NONE, - Editor.MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START + i++, + Editor.MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START + i, getLabel(resolveInfo)) .setIntent(createProcessTextIntentForResolveInfo(resolveInfo)) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); diff --git a/android/widget/PopupWindow.java b/android/widget/PopupWindow.java index 8dc8cab1..e91db139 100644 --- a/android/widget/PopupWindow.java +++ b/android/widget/PopupWindow.java @@ -1354,6 +1354,7 @@ public class PopupWindow { } mDecorView = createDecorView(mBackgroundView); + mDecorView.setIsRootNamespace(true); // The background owner should be elevated so that it casts a shadow. mBackgroundView.setElevation(mElevation); diff --git a/android/widget/SelectionActionModeHelper.java b/android/widget/SelectionActionModeHelper.java index 5e22650a..d0ad27af 100644 --- a/android/widget/SelectionActionModeHelper.java +++ b/android/widget/SelectionActionModeHelper.java @@ -20,10 +20,12 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UiThread; import android.annotation.WorkerThread; +import android.content.Context; import android.graphics.Canvas; import android.graphics.PointF; import android.graphics.RectF; import android.os.AsyncTask; +import android.os.Build; import android.os.LocaleList; import android.text.Layout; import android.text.Selection; @@ -81,6 +83,7 @@ public final class SelectionActionModeHelper { mEditor = Preconditions.checkNotNull(editor); mTextView = mEditor.getTextView(); mTextClassificationHelper = new TextClassificationHelper( + mTextView.getContext(), mTextView.getTextClassifier(), getText(mTextView), 0, 1, mTextView.getTextLocales()); @@ -385,6 +388,7 @@ public final class SelectionActionModeHelper { private void resetTextClassificationHelper() { mTextClassificationHelper.init( + mTextView.getContext(), mTextView.getTextClassifier(), getText(mTextView), mTextView.getSelectionStart(), mTextView.getSelectionEnd(), @@ -587,7 +591,9 @@ public final class SelectionActionModeHelper { Preconditions.checkNotNull(textView); final @SmartSelectionEventTracker.WidgetType int widgetType = textView.isTextEditable() ? SmartSelectionEventTracker.WidgetType.EDITTEXT - : SmartSelectionEventTracker.WidgetType.TEXTVIEW; + : (textView.isTextSelectable() + ? SmartSelectionEventTracker.WidgetType.TEXTVIEW + : SmartSelectionEventTracker.WidgetType.UNSELECTABLE_TEXTVIEW); mDelegate = new SmartSelectionEventTracker(textView.getContext(), widgetType); mEditTextLogger = textView.isTextEditable(); mWordIterator = BreakIterator.getWordInstance(textView.getTextLocale()); @@ -787,6 +793,7 @@ public final class SelectionActionModeHelper { private static final int TRIM_DELTA = 120; // characters + private Context mContext; private TextClassifier mTextClassifier; /** The original TextView text. **/ @@ -795,7 +802,10 @@ public final class SelectionActionModeHelper { private int mSelectionStart; /** End index relative to mText. */ private int mSelectionEnd; - private LocaleList mLocales; + + private final TextSelection.Options mSelectionOptions = new TextSelection.Options(); + private final TextClassification.Options mClassificationOptions = + new TextClassification.Options(); /** Trimmed text starting from mTrimStart in mText. */ private CharSequence mTrimmedText; @@ -816,21 +826,24 @@ public final class SelectionActionModeHelper { /** Whether the TextClassifier has been initialized. */ private boolean mHot; - TextClassificationHelper(TextClassifier textClassifier, + TextClassificationHelper(Context context, TextClassifier textClassifier, CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) { - init(textClassifier, text, selectionStart, selectionEnd, locales); + init(context, textClassifier, text, selectionStart, selectionEnd, locales); } @UiThread - public void init(TextClassifier textClassifier, + public void init(Context context, TextClassifier textClassifier, CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) { + mContext = Preconditions.checkNotNull(context); mTextClassifier = Preconditions.checkNotNull(textClassifier); mText = Preconditions.checkNotNull(text).toString(); mLastClassificationText = null; // invalidate. Preconditions.checkArgument(selectionEnd > selectionStart); mSelectionStart = selectionStart; mSelectionEnd = selectionEnd; - mLocales = locales; + mClassificationOptions.setDefaultLocales(locales); + mSelectionOptions.setDefaultLocales(locales) + .setDarkLaunchAllowed(true); } @WorkerThread @@ -843,8 +856,16 @@ public final class SelectionActionModeHelper { public SelectionResult suggestSelection() { mHot = true; trimText(); - final TextSelection selection = mTextClassifier.suggestSelection( - mTrimmedText, mRelativeStart, mRelativeEnd, mLocales); + final TextSelection selection; + if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) { + selection = mTextClassifier.suggestSelection( + mTrimmedText, mRelativeStart, mRelativeEnd, mSelectionOptions); + } else { + // Use old APIs. + selection = mTextClassifier.suggestSelection( + mTrimmedText, mRelativeStart, mRelativeEnd, + mSelectionOptions.getDefaultLocales()); + } // Do not classify new selection boundaries if TextClassifier should be dark launched. if (!mTextClassifier.getSettings().isDarkLaunch()) { mSelectionStart = Math.max(0, selection.getSelectionStartIndex() + mTrimStart); @@ -874,20 +895,28 @@ public final class SelectionActionModeHelper { if (!Objects.equals(mText, mLastClassificationText) || mSelectionStart != mLastClassificationSelectionStart || mSelectionEnd != mLastClassificationSelectionEnd - || !Objects.equals(mLocales, mLastClassificationLocales)) { + || !Objects.equals( + mClassificationOptions.getDefaultLocales(), + mLastClassificationLocales)) { mLastClassificationText = mText; mLastClassificationSelectionStart = mSelectionStart; mLastClassificationSelectionEnd = mSelectionEnd; - mLastClassificationLocales = mLocales; + mLastClassificationLocales = mClassificationOptions.getDefaultLocales(); trimText(); + final TextClassification classification; + if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) { + classification = mTextClassifier.classifyText( + mTrimmedText, mRelativeStart, mRelativeEnd, mClassificationOptions); + } else { + // Use old APIs. + classification = mTextClassifier.classifyText( + mTrimmedText, mRelativeStart, mRelativeEnd, + mClassificationOptions.getDefaultLocales()); + } mLastClassificationResult = new SelectionResult( - mSelectionStart, - mSelectionEnd, - mTextClassifier.classifyText( - mTrimmedText, mRelativeStart, mRelativeEnd, mLocales), - selection); + mSelectionStart, mSelectionEnd, classification, selection); } return mLastClassificationResult; -- cgit v1.2.3