Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java

Issue 1800293004: Speculative fix for the NPE in dispatchGetDisplayList (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.chrome.browser; 5 package org.chromium.chrome.browser;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.view.ViewGroup.LayoutParams; 8 import android.view.ViewGroup.LayoutParams;
9 9
10 import org.chromium.base.TraceEvent; 10 import org.chromium.base.TraceEvent;
(...skipping 24 matching lines...) Expand all
35 35
36 // The ContentViewCore with which the handler is associated. The handler 36 // The ContentViewCore with which the handler is associated. The handler
37 // will set/unset itself as the default OverscrollRefreshHandler as the 37 // will set/unset itself as the default OverscrollRefreshHandler as the
38 // association changes. 38 // association changes.
39 private ContentViewCore mContentViewCore; 39 private ContentViewCore mContentViewCore;
40 40
41 // Async runnable for ending the refresh animation after the page first 41 // Async runnable for ending the refresh animation after the page first
42 // loads a frame. This is used to provide a reasonable minimum animation tim e. 42 // loads a frame. This is used to provide a reasonable minimum animation tim e.
43 private Runnable mStopRefreshingRunnable; 43 private Runnable mStopRefreshingRunnable;
44 44
45 // Handles removing the layout from the view hierarchy. This is posted to e nsure it does not
46 // conflict with pending Android draws.
47 private Runnable mDetachLayoutRunnable;
48
45 // Accessibility utterance used to indicate refresh activation. 49 // Accessibility utterance used to indicate refresh activation.
46 private String mAccessibilityRefreshString; 50 private String mAccessibilityRefreshString;
47 51
48 /** 52 /**
49 * Simple constructor to use when creating an OverscrollRefresh instance fro m code. 53 * Simple constructor to use when creating an OverscrollRefresh instance fro m code.
50 * 54 *
51 * @param context The associated context. 55 * @param context The associated context.
52 */ 56 */
53 public SwipeRefreshHandler(Context context) { 57 public SwipeRefreshHandler(Context context) {
54 mSwipeRefreshLayout = new SwipeRefreshLayout(context); 58 mSwipeRefreshLayout = new SwipeRefreshLayout(context);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 } 97 }
94 mSwipeRefreshLayout.announceForAccessibility(mAccessibilityRefre shString); 98 mSwipeRefreshLayout.announceForAccessibility(mAccessibilityRefre shString);
95 contentViewCore.getWebContents().getNavigationController().reloa dToRefreshContent( 99 contentViewCore.getWebContents().getNavigationController().reloa dToRefreshContent(
96 true); 100 true);
97 RecordUserAction.record("MobilePullGestureReload"); 101 RecordUserAction.record("MobilePullGestureReload");
98 } 102 }
99 }); 103 });
100 mSwipeRefreshLayout.setOnResetListener(new SwipeRefreshLayout.OnResetLis tener() { 104 mSwipeRefreshLayout.setOnResetListener(new SwipeRefreshLayout.OnResetLis tener() {
101 @Override 105 @Override
102 public void onReset() { 106 public void onReset() {
103 detachSwipeRefreshLayoutIfNecessary(); 107 if (mDetachLayoutRunnable != null) return;
108 mDetachLayoutRunnable = new Runnable() {
109 @Override
110 public void run() {
111 mDetachLayoutRunnable = null;
112 detachSwipeRefreshLayoutIfNecessary();
113 }
114 };
115 mSwipeRefreshLayout.post(mDetachLayoutRunnable);
104 } 116 }
105 }); 117 });
106 118
107 contentViewCore.setOverscrollRefreshHandler(this); 119 contentViewCore.setOverscrollRefreshHandler(this);
108 } 120 }
109 121
110 /** 122 /**
111 * Notify the SwipeRefreshLayout that a refresh action has completed. 123 * Notify the SwipeRefreshLayout that a refresh action has completed.
112 * Defer the notification by a reasonable minimum to ensure sufficient 124 * Defer the notification by a reasonable minimum to ensure sufficient
113 * visiblity of the animation. 125 * visiblity of the animation.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 mSwipeRefreshLayout.setEnabled(enabled); 162 mSwipeRefreshLayout.setEnabled(enabled);
151 if (!enabled) reset(); 163 if (!enabled) reset();
152 } 164 }
153 165
154 private void cancelStopRefreshingRunnable() { 166 private void cancelStopRefreshingRunnable() {
155 if (mStopRefreshingRunnable != null) { 167 if (mStopRefreshingRunnable != null) {
156 mSwipeRefreshLayout.removeCallbacks(mStopRefreshingRunnable); 168 mSwipeRefreshLayout.removeCallbacks(mStopRefreshingRunnable);
157 } 169 }
158 } 170 }
159 171
172 private void cancelDetachLayoutRunnable() {
173 if (mDetachLayoutRunnable != null) {
174 mSwipeRefreshLayout.removeCallbacks(mDetachLayoutRunnable);
175 mDetachLayoutRunnable = null;
176 }
177 }
178
160 private Runnable getStopRefreshingRunnable() { 179 private Runnable getStopRefreshingRunnable() {
161 if (mStopRefreshingRunnable == null) { 180 if (mStopRefreshingRunnable == null) {
162 mStopRefreshingRunnable = new Runnable() { 181 mStopRefreshingRunnable = new Runnable() {
163 @Override 182 @Override
164 public void run() { 183 public void run() {
165 mSwipeRefreshLayout.setRefreshing(false); 184 mSwipeRefreshLayout.setRefreshing(false);
166 } 185 }
167 }; 186 };
168 } 187 }
169 return mStopRefreshingRunnable; 188 return mStopRefreshingRunnable;
170 } 189 }
171 190
172 // The animation view is attached/detached on-demand to minimize overlap 191 // The animation view is attached/detached on-demand to minimize overlap
173 // with composited SurfaceView content. 192 // with composited SurfaceView content.
174 private void attachSwipeRefreshLayoutIfNecessary() { 193 private void attachSwipeRefreshLayoutIfNecessary() {
194 cancelDetachLayoutRunnable();
175 if (mContentViewCore == null) return; 195 if (mContentViewCore == null) return;
176 if (mSwipeRefreshLayout.getParent() == null) { 196 if (mSwipeRefreshLayout.getParent() == null) {
177 mContentViewCore.getContainerView().addView(mSwipeRefreshLayout); 197 mContentViewCore.getContainerView().addView(mSwipeRefreshLayout);
178 } 198 }
179 } 199 }
180 200
181 private void detachSwipeRefreshLayoutIfNecessary() { 201 private void detachSwipeRefreshLayoutIfNecessary() {
202 cancelDetachLayoutRunnable();
182 if (mContentViewCore == null) return; 203 if (mContentViewCore == null) return;
183 if (mSwipeRefreshLayout.getParent() != null) { 204 if (mSwipeRefreshLayout.getParent() != null) {
184 mContentViewCore.getContainerView().removeView(mSwipeRefreshLayout); 205 mContentViewCore.getContainerView().removeView(mSwipeRefreshLayout);
185 } 206 }
186 } 207 }
187 } 208 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698