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

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

Issue 2776183002: NTP: Prevent conflict of dismiss animations and scroll position handling. (Closed)
Patch Set: No need to post a delayed task for scroll handling. Created 3 years, 8 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.ntp; 5 package org.chromium.chrome.browser.ntp;
6 6
7 import android.annotation.SuppressLint; 7 import android.annotation.SuppressLint;
8 import android.content.Context; 8 import android.content.Context;
9 import android.content.res.Configuration; 9 import android.content.res.Configuration;
10 import android.graphics.Canvas; 10 import android.graphics.Canvas;
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 94
95 private OnSearchBoxScrollListener mSearchBoxScrollListener; 95 private OnSearchBoxScrollListener mSearchBoxScrollListener;
96 96
97 private ChromeActivity mActivity; 97 private ChromeActivity mActivity;
98 private NewTabPageManager mManager; 98 private NewTabPageManager mManager;
99 private LogoView.Delegate mLogoDelegate; 99 private LogoView.Delegate mLogoDelegate;
100 private TileGroup.Delegate mTileGroupDelegate; 100 private TileGroup.Delegate mTileGroupDelegate;
101 private TileGroup mTileGroup; 101 private TileGroup mTileGroup;
102 private UiConfig mUiConfig; 102 private UiConfig mUiConfig;
103 private Runnable mSnapScrollRunnable; 103 private Runnable mSnapScrollRunnable;
104 private Runnable mUpdateSearchBoxOnScrollRunnable;
104 private boolean mFirstShow = true; 105 private boolean mFirstShow = true;
105 private boolean mSearchProviderHasLogo = true; 106 private boolean mSearchProviderHasLogo = true;
106 private boolean mPendingSnapScroll; 107 private boolean mPendingSnapScroll;
107 private boolean mInitialized; 108 private boolean mInitialized;
108 private int mLastScrollY = -1; 109 private int mLastScrollY = -1;
109 110
110 /** 111 /**
111 * The number of asynchronous tasks that need to complete before the page is done loading. 112 * The number of asynchronous tasks that need to complete before the page is done loading.
112 * This starts at one to track when the view is finished attaching to the wi ndow. 113 * This starts at one to track when the view is finished attaching to the wi ndow.
113 */ 114 */
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 190
190 mRecyclerView = new NewTabPageRecyclerView(getContext()); 191 mRecyclerView = new NewTabPageRecyclerView(getContext());
191 mRecyclerView.setContainsLocationBar(manager.isLocationBarShownInNTP()); 192 mRecyclerView.setContainsLocationBar(manager.isLocationBarShownInNTP());
192 addView(mRecyclerView); 193 addView(mRecyclerView);
193 194
194 // Don't attach now, the recyclerView itself will determine when to do i t. 195 // Don't attach now, the recyclerView itself will determine when to do i t.
195 mNewTabPageLayout = mRecyclerView.getAboveTheFoldView(); 196 mNewTabPageLayout = mRecyclerView.getAboveTheFoldView();
196 197
197 mRecyclerView.setItemAnimator(new DefaultItemAnimator() { 198 mRecyclerView.setItemAnimator(new DefaultItemAnimator() {
198 @Override 199 @Override
200 public boolean animateMove(ViewHolder holder, int fromX, int fromY, int toX, int toY) {
201 // If |mNewTabPageLayout| is animated by the RecyclerView becaus e an item below it
202 // was dismissed, avoid also manipulating its vertical offset in our scroll handling
203 // at the same time. The onScrolled() method is called when an i tem is dismissed and
204 // the item at the top of the viewport is repositioned.
205 if (holder.itemView == mNewTabPageLayout) setUrlFocusAnimationsD isabled(true);
206
207 // Cancel any pending scroll update handling, a new one will be scheduled in
208 // onAnimationFinished().
209 mRecyclerView.removeCallbacks(mUpdateSearchBoxOnScrollRunnable);
210
211 return super.animateMove(holder, fromX, fromY, toX, toY);
212 }
213
214 @Override
199 public void onAnimationFinished(ViewHolder viewHolder) { 215 public void onAnimationFinished(ViewHolder viewHolder) {
200 super.onAnimationFinished(viewHolder); 216 super.onAnimationFinished(viewHolder);
201 // When removing sections, because the animations are all transl ations, the 217
202 // scroll events don't fire and we can get in the situation wher e the toolbar 218 // When an item is dismissed, the items at the top of the viewpo rt might not move,
203 // buttons disappear. 219 // and onScrolled() might not be called. We can get in the situa tion where the
204 updateSearchBoxOnScroll(); 220 // toolbar buttons disappear, so schedule an update for it. This can be cancelled
221 // from animateMove() in case |mNewTabPageLayout| will be moved. We don't know that
222 // from here, as the RecyclerView will animate multiple items wh en one is dismissed,
223 // and some will "finish" synchronously if they are already in t he correct place,
224 // before other moves have even been scheduled.
225 if (viewHolder.itemView == mNewTabPageLayout) setUrlFocusAnimati onsDisabled(false);
226 mRecyclerView.removeCallbacks(mUpdateSearchBoxOnScrollRunnable);
227 mRecyclerView.post(mUpdateSearchBoxOnScrollRunnable);
205 } 228 }
206 }); 229 });
207 230
208 mContextMenuManager = 231 mContextMenuManager =
209 new ContextMenuManager(mActivity, mManager.getNavigationDelegate (), mRecyclerView); 232 new ContextMenuManager(mActivity, mManager.getNavigationDelegate (), mRecyclerView);
210 mActivity.getWindowAndroid().addContextMenuCloseListener(mContextMenuMan ager); 233 mActivity.getWindowAndroid().addContextMenuCloseListener(mContextMenuMan ager);
211 manager.addDestructionObserver(new DestructionObserver() { 234 manager.addDestructionObserver(new DestructionObserver() {
212 @Override 235 @Override
213 public void onDestroy() { 236 public void onDestroy() {
214 mActivity.getWindowAndroid().removeContextMenuCloseListener(mCon textMenuManager); 237 mActivity.getWindowAndroid().removeContextMenuCloseListener(mCon textMenuManager);
215 } 238 }
216 }); 239 });
217 240
218 OfflinePageBridge offlinePageBridge = 241 OfflinePageBridge offlinePageBridge =
219 OfflinePageBridge.getForProfile(Profile.getLastUsedProfile()); 242 OfflinePageBridge.getForProfile(Profile.getLastUsedProfile());
220 243
221 mTileGridLayout = (TileGridLayout) mNewTabPageLayout.findViewById(R.id.t ile_grid_layout); 244 mTileGridLayout = (TileGridLayout) mNewTabPageLayout.findViewById(R.id.t ile_grid_layout);
222 mTileGridLayout.setMaxRows(getMaxTileRows(searchProviderHasLogo)); 245 mTileGridLayout.setMaxRows(getMaxTileRows(searchProviderHasLogo));
223 mTileGridLayout.setMaxColumns(getMaxTileColumns()); 246 mTileGridLayout.setMaxColumns(getMaxTileColumns());
224 mTileGroup = new TileGroup(mActivity, mManager, mContextMenuManager, mTi leGroupDelegate, 247 mTileGroup = new TileGroup(mActivity, mManager, mContextMenuManager, mTi leGroupDelegate,
225 /* observer = */ this, offlinePageBridge, getTileTitleLines()); 248 /* observer = */ this, offlinePageBridge, getTileTitleLines());
226 249
227 mSearchProviderLogoView = 250 mSearchProviderLogoView =
228 (LogoView) mNewTabPageLayout.findViewById(R.id.search_provider_l ogo); 251 (LogoView) mNewTabPageLayout.findViewById(R.id.search_provider_l ogo);
229 mLogoDelegate = new LogoDelegateImpl(tab, mSearchProviderLogoView); 252 mLogoDelegate = new LogoDelegateImpl(tab, mSearchProviderLogoView);
230 mSearchBoxView = mNewTabPageLayout.findViewById(R.id.search_box); 253 mSearchBoxView = mNewTabPageLayout.findViewById(R.id.search_box);
231 mNoSearchLogoSpacer = mNewTabPageLayout.findViewById(R.id.no_search_logo _spacer); 254 mNoSearchLogoSpacer = mNewTabPageLayout.findViewById(R.id.no_search_logo _spacer);
232 255
233 mSnapScrollRunnable = new SnapScrollRunnable(); 256 mSnapScrollRunnable = new SnapScrollRunnable();
257 mUpdateSearchBoxOnScrollRunnable = new UpdateSearchBoxOnScrollRunnable() ;
234 258
235 initializeSearchBoxTextView(); 259 initializeSearchBoxTextView();
236 initializeVoiceSearchButton(); 260 initializeVoiceSearchButton();
237 initializeLayoutChangeListeners(); 261 initializeLayoutChangeListeners();
238 setSearchProviderHasLogo(searchProviderHasLogo); 262 setSearchProviderHasLogo(searchProviderHasLogo);
239 263
240 tab.addObserver(new EmptyTabObserver() { 264 tab.addObserver(new EmptyTabObserver() {
241 @Override 265 @Override
242 public void onShown(Tab tab) { 266 public void onShown(Tab tab) {
243 mTileGroup.onSwitchToForeground(); 267 mTileGroup.onSwitchToForeground();
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 952
929 private class SnapScrollRunnable implements Runnable { 953 private class SnapScrollRunnable implements Runnable {
930 @Override 954 @Override
931 public void run() { 955 public void run() {
932 assert mPendingSnapScroll; 956 assert mPendingSnapScroll;
933 mPendingSnapScroll = false; 957 mPendingSnapScroll = false;
934 958
935 mRecyclerView.snapScroll(mSearchBoxView, getHeight()); 959 mRecyclerView.snapScroll(mSearchBoxView, getHeight());
936 } 960 }
937 } 961 }
962
963 private class UpdateSearchBoxOnScrollRunnable implements Runnable {
964 @Override
965 public void run() {
966 updateSearchBoxOnScroll();
967 }
968 }
938 } 969 }
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