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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 * | 189 * |
190 * <p>Action mode in floating mode is tried first, and then falls back to | 190 * <p>Action mode in floating mode is tried first, and then falls back to |
191 * a normal one. | 191 * a normal one. |
192 * @return {@code true} if the action mode started successfully or is alread y on. | 192 * @return {@code true} if the action mode started successfully or is alread y on. |
193 */ | 193 */ |
194 public boolean showActionMode() { | 194 public boolean showActionMode() { |
195 if (isEmpty()) return false; | 195 if (isEmpty()) return false; |
196 | 196 |
197 // Just refreshes the view if it is already showing. | 197 // Just refreshes the view if it is already showing. |
198 if (isActionModeValid()) { | 198 if (isActionModeValid()) { |
199 invalidateActionMode(); | 199 // Try/catch necessary for framework bug, crbug.com/446717. |
200 return true; | 200 try { |
201 } | 201 mActionMode.invalidate(); |
202 | 202 } catch (NullPointerException e) { |
203 if (mView.getParent() != null) { | 203 Log.w(TAG, "Ignoring NPE from ActionMode.invalidate() as workaro und for L", e); |
204 // On ICS, startActionMode throws an NPE when getParent() is null. | 204 } |
205 } else { | |
205 assert mWebContents != null; | 206 assert mWebContents != null; |
206 ActionMode actionMode = supportsFloatingActionMode() | 207 ActionMode actionMode = supportsFloatingActionMode() |
207 ? startFloatingActionMode() | 208 ? startFloatingActionMode() |
208 : mView.startActionMode(mCallback); | 209 : mView.startActionMode(mCallback); |
209 if (actionMode != null) { | 210 if (actionMode != null) { |
210 // This is to work around an LGE email issue. See crbug.com/6517 06 for more details. | 211 // This is to work around an LGE email issue. See crbug.com/6517 06 for more details. |
211 LGEmailActionModeWorkaround.runIfNecessary(mContext, actionMode) ; | 212 LGEmailActionModeWorkaround.runIfNecessary(mContext, actionMode) ; |
212 } | 213 } |
213 mActionMode = actionMode; | 214 mActionMode = actionMode; |
214 } | 215 } |
216 hideActionMode(false); | |
Tima Vaisburd
2017/03/28 02:54:42
Can the action mode be hidden (i.e. mHidden == tru
boliu
2017/03/28 17:09:19
So only SELECTION_HANDLES_SHOWN can fall into inva
Tima Vaisburd
2017/03/28 17:39:52
Action mode can be hidden, but it should exist.
I
boliu
2017/03/28 17:44:12
Oh, ok. Yeah I got confused, old code in invalidat
amaralp
2017/03/28 18:15:08
The only times mHidden is set to true is when a sc
| |
215 mUnselectAllOnDismiss = true; | 217 mUnselectAllOnDismiss = true; |
Jinsuk Kim
2017/03/28 02:19:59
|mUnselectAllOnDismiss| gets turned on but didn't
boliu
2017/03/28 17:09:19
Looks ok, it would have already been false in the
amaralp
2017/03/28 18:15:08
It would have been already false. Also I've change
| |
216 return isActionModeValid(); | 218 return isActionModeValid(); |
217 } | 219 } |
218 | 220 |
219 @TargetApi(Build.VERSION_CODES.M) | 221 @TargetApi(Build.VERSION_CODES.M) |
220 private ActionMode startFloatingActionMode() { | 222 private ActionMode startFloatingActionMode() { |
221 ActionMode actionMode = mView.startActionMode( | 223 ActionMode actionMode = mView.startActionMode( |
222 new FloatingActionModeCallback(this, mCallback), ActionMode.TYPE _FLOATING); | 224 new FloatingActionModeCallback(this, mCallback), ActionMode.TYPE _FLOATING); |
223 return actionMode; | 225 return actionMode; |
224 } | 226 } |
225 | 227 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
290 public void finishActionMode() { | 292 public void finishActionMode() { |
291 if (isActionModeValid()) { | 293 if (isActionModeValid()) { |
292 mActionMode.finish(); | 294 mActionMode.finish(); |
293 | 295 |
294 // Should be nulled out in case #onDestroyActionMode() is not invoke d in response. | 296 // Should be nulled out in case #onDestroyActionMode() is not invoke d in response. |
295 mActionMode = null; | 297 mActionMode = null; |
296 } | 298 } |
297 } | 299 } |
298 | 300 |
299 /** | 301 /** |
300 * @see ActionMode#invalidate() | |
301 * Note that invalidation will also reset visibility state. The caller | |
302 * should account for this when making subsequent visibility updates. | |
303 */ | |
304 private void invalidateActionMode() { | |
305 if (!isActionModeValid()) return; | |
306 if (mHidden) { | |
307 assert canHideActionMode(); | |
308 mHidden = false; | |
309 mView.removeCallbacks(mRepeatingHideRunnable); | |
310 mPendingInvalidateContentRect = false; | |
311 } | |
312 | |
313 // Try/catch necessary for framework bug, crbug.com/446717. | |
314 try { | |
315 mActionMode.invalidate(); | |
316 } catch (NullPointerException e) { | |
317 Log.w(TAG, "Ignoring NPE from ActionMode.invalidate() as workaround for L", e); | |
318 } | |
319 } | |
320 | |
321 /** | |
322 * @see ActionMode#invalidateContentRect() | 302 * @see ActionMode#invalidateContentRect() |
323 */ | 303 */ |
324 public void invalidateContentRect() { | 304 public void invalidateContentRect() { |
325 if (supportsFloatingActionMode()) { | 305 if (supportsFloatingActionMode()) { |
326 if (mHidden) { | 306 if (mHidden) { |
327 mPendingInvalidateContentRect = true; | 307 mPendingInvalidateContentRect = true; |
328 } else { | 308 } else { |
329 mPendingInvalidateContentRect = false; | 309 mPendingInvalidateContentRect = false; |
330 if (isActionModeValid()) mActionMode.invalidateContentRect(); | 310 if (isActionModeValid()) mActionMode.invalidateContentRect(); |
331 } | 311 } |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
903 mIsInsertion = insertion; | 883 mIsInsertion = insertion; |
904 } | 884 } |
905 | 885 |
906 private boolean isShareAvailable() { | 886 private boolean isShareAvailable() { |
907 Intent intent = new Intent(Intent.ACTION_SEND); | 887 Intent intent = new Intent(Intent.ACTION_SEND); |
908 intent.setType("text/plain"); | 888 intent.setType("text/plain"); |
909 return mContext.getPackageManager().queryIntentActivities(intent, | 889 return mContext.getPackageManager().queryIntentActivities(intent, |
910 PackageManager.MATCH_DEFAULT_ONLY).size() > 0; | 890 PackageManager.MATCH_DEFAULT_ONLY).size() > 0; |
911 } | 891 } |
912 } | 892 } |
OLD | NEW |