Chromium Code Reviews| 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.ClipboardManager; | 10 import android.content.ClipboardManager; |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 return isActionModeValid(); | 216 return isActionModeValid(); |
| 217 } | 217 } |
| 218 | 218 |
| 219 @TargetApi(Build.VERSION_CODES.M) | 219 @TargetApi(Build.VERSION_CODES.M) |
| 220 private ActionMode startFloatingActionMode() { | 220 private ActionMode startFloatingActionMode() { |
| 221 ActionMode actionMode = mView.startActionMode( | 221 ActionMode actionMode = mView.startActionMode( |
| 222 new FloatingActionModeCallback(this, mCallback), ActionMode.TYPE _FLOATING); | 222 new FloatingActionModeCallback(this, mCallback), ActionMode.TYPE _FLOATING); |
| 223 return actionMode; | 223 return actionMode; |
| 224 } | 224 } |
| 225 | 225 |
| 226 void showPastePopup(int x, int y) { | 226 void createAndShowPastePopup(int x, int y) { |
| 227 if (mView.getParent() == null || mView.getVisibility() != View.VISIBLE) { | 227 if (mView.getParent() == null || mView.getVisibility() != View.VISIBLE) { |
| 228 return; | 228 return; |
| 229 } | 229 } |
| 230 | 230 |
| 231 if (!supportsFloatingActionMode() && !canPaste()) return; | 231 if (!supportsFloatingActionMode() && !canPaste()) return; |
| 232 PastePopupMenuDelegate delegate = new PastePopupMenuDelegate() { | |
|
boliu
2017/03/17 22:54:20
does it matter if mPastePopupMenu already exists h
amaralp
2017/03/21 00:26:24
Addressed in crrev.com/2757313003.
| |
| 233 @Override | |
| 234 public void paste() { | |
| 235 mWebContents.paste(); | |
| 236 mWebContents.dismissTextHandles(); | |
| 237 } | |
| 232 | 238 |
| 233 PastePopupMenu pastePopupMenu = getPastePopup(); | 239 @Override |
| 234 if (pastePopupMenu == null) return; | 240 public boolean canPaste() { |
| 241 return SelectionPopupController.this.canPaste(); | |
| 242 } | |
| 243 }; | |
| 244 Context windowContext = mWindowAndroid.getContext().get(); | |
| 245 if (windowContext == null) return; | |
| 246 if (supportsFloatingActionMode()) { | |
| 247 mPastePopupMenu = new FloatingPastePopupMenu(windowContext, mView, d elegate); | |
| 248 } else { | |
| 249 mPastePopupMenu = new LegacyPastePopupMenu(windowContext, mView, del egate); | |
| 250 } | |
| 251 showPastePopup(x, y); | |
| 252 } | |
| 235 | 253 |
| 254 private void showPastePopup(int x, int y) { | |
| 255 if (mPastePopupMenu == null) return; | |
| 236 // Coordinates are in DIP. | 256 // Coordinates are in DIP. |
| 237 final float deviceScale = mRenderCoordinates.getDeviceScaleFactor(); | 257 final float deviceScale = mRenderCoordinates.getDeviceScaleFactor(); |
| 238 final int xPix = (int) (x * deviceScale); | 258 final int xPix = (int) (x * deviceScale); |
| 239 final int yPix = (int) (y * deviceScale); | 259 final int yPix = (int) (y * deviceScale); |
| 240 final float browserControlsShownPix = mRenderCoordinates.getContentOffse tYPix(); | 260 final float browserControlsShownPix = mRenderCoordinates.getContentOffse tYPix(); |
| 241 try { | 261 try { |
| 242 pastePopupMenu.show(xPix, (int) (yPix + browserControlsShownPix)); | 262 mPastePopupMenu.show(xPix, (int) (yPix + browserControlsShownPix)); |
| 243 } catch (WindowManager.BadTokenException e) { | 263 } catch (WindowManager.BadTokenException e) { |
| 244 } | 264 } |
| 245 } | 265 } |
| 246 | 266 |
| 247 @Override | 267 @Override |
| 248 public boolean supportsFloatingActionMode() { | 268 public boolean supportsFloatingActionMode() { |
| 249 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; | 269 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; |
| 250 } | 270 } |
| 251 | 271 |
| 252 void hidePastePopup() { | 272 void hidePastePopup() { |
| 253 if (mPastePopupMenu != null) mPastePopupMenu.hide(); | 273 if (mPastePopupMenu != null) mPastePopupMenu.hide(); |
| 254 } | 274 } |
| 255 | 275 |
| 256 private PastePopupMenu getPastePopup() { | |
| 257 if (mPastePopupMenu == null) { | |
| 258 PastePopupMenuDelegate delegate = new PastePopupMenuDelegate() { | |
| 259 @Override | |
| 260 public void paste() { | |
| 261 mWebContents.paste(); | |
| 262 mWebContents.dismissTextHandles(); | |
| 263 } | |
| 264 | |
| 265 @Override | |
| 266 public boolean canPaste() { | |
| 267 return SelectionPopupController.this.canPaste(); | |
| 268 } | |
| 269 }; | |
| 270 Context windowContext = mWindowAndroid.getContext().get(); | |
| 271 if (windowContext == null) return null; | |
| 272 if (supportsFloatingActionMode()) { | |
| 273 mPastePopupMenu = new FloatingPastePopupMenu(windowContext, mVie w, delegate); | |
| 274 } else { | |
| 275 mPastePopupMenu = new LegacyPastePopupMenu(windowContext, mView, delegate); | |
| 276 } | |
| 277 } | |
| 278 return mPastePopupMenu; | |
| 279 } | |
| 280 | |
| 281 void destroyPastePopup() { | 276 void destroyPastePopup() { |
| 282 hidePastePopup(); | 277 hidePastePopup(); |
| 283 mPastePopupMenu = null; | 278 mPastePopupMenu = null; |
| 284 } | 279 } |
| 285 | 280 |
| 286 @VisibleForTesting | 281 @VisibleForTesting |
| 287 public boolean isPastePopupShowing() { | 282 public boolean isPastePopupShowing() { |
| 288 return mPastePopupMenu != null && mPastePopupMenu.isShowing(); | 283 return mPastePopupMenu != null && mPastePopupMenu.isShowing(); |
| 289 } | 284 } |
| 290 | 285 |
| (...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 791 break; | 786 break; |
| 792 | 787 |
| 793 case SelectionEventType.INSERTION_HANDLE_SHOWN: | 788 case SelectionEventType.INSERTION_HANDLE_SHOWN: |
| 794 mSelectionRect.set(left, top, right, bottom); | 789 mSelectionRect.set(left, top, right, bottom); |
| 795 setIsInsertion(true); | 790 setIsInsertion(true); |
| 796 break; | 791 break; |
| 797 | 792 |
| 798 case SelectionEventType.INSERTION_HANDLE_MOVED: | 793 case SelectionEventType.INSERTION_HANDLE_MOVED: |
| 799 mSelectionRect.set(left, top, right, bottom); | 794 mSelectionRect.set(left, top, right, bottom); |
| 800 if (!isScrollInProgress && isPastePopupShowing()) { | 795 if (!isScrollInProgress && isPastePopupShowing()) { |
| 801 mWebContents.showContextMenuAtPoint(xAnchor, yAnchor); | 796 showPastePopup(xAnchor, yAnchor); |
| 802 } else { | 797 } else { |
| 803 hidePastePopup(); | 798 hidePastePopup(); |
| 804 } | 799 } |
| 805 break; | 800 break; |
| 806 | 801 |
| 807 case SelectionEventType.INSERTION_HANDLE_TAPPED: | 802 case SelectionEventType.INSERTION_HANDLE_TAPPED: |
| 808 if (mWasPastePopupShowingOnInsertionDragStart) { | 803 if (mWasPastePopupShowingOnInsertionDragStart) { |
| 809 hidePastePopup(); | 804 hidePastePopup(); |
| 810 } else { | 805 } else { |
| 811 mWebContents.showContextMenuAtPoint(xAnchor, yAnchor); | 806 mWebContents.showContextMenuAtPoint(xAnchor, yAnchor); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 910 mIsInsertion = insertion; | 905 mIsInsertion = insertion; |
| 911 } | 906 } |
| 912 | 907 |
| 913 private boolean isShareAvailable() { | 908 private boolean isShareAvailable() { |
| 914 Intent intent = new Intent(Intent.ACTION_SEND); | 909 Intent intent = new Intent(Intent.ACTION_SEND); |
| 915 intent.setType("text/plain"); | 910 intent.setType("text/plain"); |
| 916 return mContext.getPackageManager().queryIntentActivities(intent, | 911 return mContext.getPackageManager().queryIntentActivities(intent, |
| 917 PackageManager.MATCH_DEFAULT_ONLY).size() > 0; | 912 PackageManager.MATCH_DEFAULT_ONLY).size() > 0; |
| 918 } | 913 } |
| 919 } | 914 } |
| OLD | NEW |