| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.content.browser; | 5 package org.chromium.content.browser; |
| 6 | 6 |
| 7 import android.annotation.TargetApi; | 7 import android.annotation.TargetApi; |
| 8 import android.app.Activity; | 8 import android.app.Activity; |
| 9 import android.app.SearchManager; | 9 import android.app.SearchManager; |
| 10 import android.content.ClipData; | 10 import android.content.ClipData; |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 /** | 226 /** |
| 227 * Show (activate) android action mode by starting it. | 227 * Show (activate) android action mode by starting it. |
| 228 * | 228 * |
| 229 * <p>Action mode in floating mode is tried first, and then falls back to | 229 * <p>Action mode in floating mode is tried first, and then falls back to |
| 230 * a normal one. | 230 * a normal one. |
| 231 * <p> If the action mode cannot be created the selection is cleared. | 231 * <p> If the action mode cannot be created the selection is cleared. |
| 232 */ | 232 */ |
| 233 public void showActionModeOrClearOnFailure() { | 233 public void showActionModeOrClearOnFailure() { |
| 234 mPendingShowActionMode = false; | 234 mPendingShowActionMode = false; |
| 235 | 235 |
| 236 if (!isActionModeSupported() || !mHasSelection) return; | 236 if (!isActionModeSupported() || !hasSelection()) return; |
| 237 | 237 |
| 238 // Just refresh the view if action mode already exists. | 238 // Just refresh the view if action mode already exists. |
| 239 if (isActionModeValid()) { | 239 if (isActionModeValid()) { |
| 240 // Try/catch necessary for framework bug, crbug.com/446717. | 240 // Try/catch necessary for framework bug, crbug.com/446717. |
| 241 try { | 241 try { |
| 242 mActionMode.invalidate(); | 242 mActionMode.invalidate(); |
| 243 } catch (NullPointerException e) { | 243 } catch (NullPointerException e) { |
| 244 Log.w(TAG, "Ignoring NPE from ActionMode.invalidate() as workaro
und for L", e); | 244 Log.w(TAG, "Ignoring NPE from ActionMode.invalidate() as workaro
und for L", e); |
| 245 } | 245 } |
| 246 hideActionMode(false); | 246 hideActionMode(false); |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 return isAllowedByClient && isShareAvailable(); | 902 return isAllowedByClient && isShareAvailable(); |
| 903 } | 903 } |
| 904 return isAllowedByClient; | 904 return isAllowedByClient; |
| 905 } | 905 } |
| 906 | 906 |
| 907 @Override | 907 @Override |
| 908 public void onReceivedProcessTextResult(int resultCode, Intent data) { | 908 public void onReceivedProcessTextResult(int resultCode, Intent data) { |
| 909 if (mWebContents == null || resultCode != Activity.RESULT_OK || data ==
null) return; | 909 if (mWebContents == null || resultCode != Activity.RESULT_OK || data ==
null) return; |
| 910 | 910 |
| 911 // Do not handle the result if no text is selected or current selection
is not editable. | 911 // Do not handle the result if no text is selected or current selection
is not editable. |
| 912 if (!mHasSelection || !isSelectionEditable()) return; | 912 if (!hasSelection() || !isSelectionEditable()) return; |
| 913 | 913 |
| 914 CharSequence result = data.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEX
T); | 914 CharSequence result = data.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEX
T); |
| 915 if (result != null) { | 915 if (result != null) { |
| 916 // TODO(hush): Use a variant of replace that re-selects the replaced
text. | 916 // TODO(hush): Use a variant of replace that re-selects the replaced
text. |
| 917 // crbug.com/546710 | 917 // crbug.com/546710 |
| 918 mWebContents.replace(result.toString()); | 918 mWebContents.replace(result.toString()); |
| 919 } | 919 } |
| 920 } | 920 } |
| 921 | 921 |
| 922 void restoreSelectionPopupsIfNecessary() { | 922 void restoreSelectionPopupsIfNecessary() { |
| 923 if (mHasSelection && !isActionModeValid()) { | 923 if (hasSelection() && !isActionModeValid()) { |
| 924 showActionModeOrClearOnFailure(); | 924 showActionModeOrClearOnFailure(); |
| 925 } | 925 } |
| 926 } | 926 } |
| 927 | 927 |
| 928 // All coordinates are in DIP. | 928 // All coordinates are in DIP. |
| 929 @CalledByNative | 929 @CalledByNative |
| 930 private void onSelectionEvent(int eventType, int left, int top, int right, i
nt bottom) { | 930 private void onSelectionEvent(int eventType, int left, int top, int right, i
nt bottom) { |
| 931 // Ensure the provided selection coordinates form a non-empty rect, as r
equired by | 931 // Ensure the provided selection coordinates form a non-empty rect, as r
equired by |
| 932 // the selection action mode. | 932 // the selection action mode. |
| 933 if (left == right) ++right; | 933 if (left == right) ++right; |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1093 /** | 1093 /** |
| 1094 * @return Whether the page has an active, touch-controlled selection region
. | 1094 * @return Whether the page has an active, touch-controlled selection region
. |
| 1095 */ | 1095 */ |
| 1096 @VisibleForTesting | 1096 @VisibleForTesting |
| 1097 public boolean hasSelection() { | 1097 public boolean hasSelection() { |
| 1098 return mHasSelection; | 1098 return mHasSelection; |
| 1099 } | 1099 } |
| 1100 | 1100 |
| 1101 @Override | 1101 @Override |
| 1102 public String getSelectedText() { | 1102 public String getSelectedText() { |
| 1103 return mHasSelection ? mLastSelectedText : ""; | 1103 return hasSelection() ? mLastSelectedText : ""; |
| 1104 } | 1104 } |
| 1105 | 1105 |
| 1106 private boolean isShareAvailable() { | 1106 private boolean isShareAvailable() { |
| 1107 Intent intent = new Intent(Intent.ACTION_SEND); | 1107 Intent intent = new Intent(Intent.ACTION_SEND); |
| 1108 intent.setType("text/plain"); | 1108 intent.setType("text/plain"); |
| 1109 return mContext.getPackageManager().queryIntentActivities(intent, | 1109 return mContext.getPackageManager().queryIntentActivities(intent, |
| 1110 PackageManager.MATCH_DEFAULT_ONLY).size() > 0; | 1110 PackageManager.MATCH_DEFAULT_ONLY).size() > 0; |
| 1111 } | 1111 } |
| 1112 | 1112 |
| 1113 // TODO(timav): Use |TextClassifier| instead of |Object| after we switch to
Android SDK 26. | 1113 // TODO(timav): Use |TextClassifier| instead of |Object| after we switch to
Android SDK 26. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1134 */ | 1134 */ |
| 1135 public Object getCustomTextClassifier() { | 1135 public Object getCustomTextClassifier() { |
| 1136 return mSelectionClient == null ? null : mSelectionClient.getCustomTextC
lassifier(); | 1136 return mSelectionClient == null ? null : mSelectionClient.getCustomTextC
lassifier(); |
| 1137 } | 1137 } |
| 1138 | 1138 |
| 1139 // The callback class that delivers result from a SmartSelectionClient. | 1139 // The callback class that delivers result from a SmartSelectionClient. |
| 1140 private class SmartSelectionCallback implements SmartSelectionProvider.Resul
tCallback { | 1140 private class SmartSelectionCallback implements SmartSelectionProvider.Resul
tCallback { |
| 1141 @Override | 1141 @Override |
| 1142 public void onClassified(SmartSelectionProvider.Result result) { | 1142 public void onClassified(SmartSelectionProvider.Result result) { |
| 1143 // If the selection does not exist any more, discard |result|. | 1143 // If the selection does not exist any more, discard |result|. |
| 1144 if (!mHasSelection) { | 1144 if (!hasSelection()) { |
| 1145 assert !mHidden; | 1145 assert !mHidden; |
| 1146 assert mClassificationResult == null; | 1146 assert mClassificationResult == null; |
| 1147 mPendingShowActionMode = false; | 1147 mPendingShowActionMode = false; |
| 1148 return; | 1148 return; |
| 1149 } | 1149 } |
| 1150 | 1150 |
| 1151 // Do not allow classifier to shorten the selection. If the suggeste
d selection is | 1151 // Do not allow classifier to shorten the selection. If the suggeste
d selection is |
| 1152 // smaller than the original we throw away classification result and
show the menu. | 1152 // smaller than the original we throw away classification result and
show the menu. |
| 1153 // TODO(amaralp): This was added to fix the SelectAll problem in | 1153 // TODO(amaralp): This was added to fix the SelectAll problem in |
| 1154 // http://crbug.com/714106. Once we know the cause of the original s
election we can | 1154 // http://crbug.com/714106. Once we know the cause of the original s
election we can |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1180 if (mPendingShowActionMode) return; | 1180 if (mPendingShowActionMode) return; |
| 1181 } | 1181 } |
| 1182 | 1182 |
| 1183 // Rely on this method to clear |mHidden| and unhide the action mode
. | 1183 // Rely on this method to clear |mHidden| and unhide the action mode
. |
| 1184 showActionModeOrClearOnFailure(); | 1184 showActionModeOrClearOnFailure(); |
| 1185 } | 1185 } |
| 1186 }; | 1186 }; |
| 1187 | 1187 |
| 1188 private native void nativeInit(WebContents webContents); | 1188 private native void nativeInit(WebContents webContents); |
| 1189 } | 1189 } |
| OLD | NEW |