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.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.Resources; | 9 import android.content.res.Resources; |
10 import android.graphics.Bitmap; | 10 import android.graphics.Bitmap; |
11 import android.graphics.BitmapFactory; | 11 import android.graphics.BitmapFactory; |
12 import android.graphics.Canvas; | 12 import android.graphics.Canvas; |
13 import android.graphics.Color; | 13 import android.graphics.Color; |
14 import android.graphics.Rect; | 14 import android.graphics.Rect; |
15 import android.graphics.drawable.BitmapDrawable; | 15 import android.graphics.drawable.BitmapDrawable; |
16 import android.net.Uri; | 16 import android.net.Uri; |
17 import android.os.Build; | 17 import android.os.Build; |
18 import android.support.v4.graphics.drawable.RoundedBitmapDrawable; | 18 import android.support.v4.graphics.drawable.RoundedBitmapDrawable; |
19 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; | 19 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; |
20 import android.support.v7.widget.LinearLayoutManager; | |
21 import android.support.v7.widget.RecyclerView; | 20 import android.support.v7.widget.RecyclerView; |
22 import android.text.Editable; | 21 import android.text.Editable; |
23 import android.text.TextUtils; | 22 import android.text.TextUtils; |
24 import android.text.TextWatcher; | 23 import android.text.TextWatcher; |
25 import android.text.method.LinkMovementMethod; | 24 import android.text.method.LinkMovementMethod; |
26 import android.text.style.ClickableSpan; | 25 import android.text.style.ClickableSpan; |
27 import android.util.AttributeSet; | 26 import android.util.AttributeSet; |
28 import android.view.LayoutInflater; | 27 import android.view.LayoutInflater; |
29 import android.view.MotionEvent; | 28 import android.view.MotionEvent; |
30 import android.view.View; | 29 import android.view.View; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
66 * The native new tab page, represented by some basic data such as title and url , and an Android | 65 * The native new tab page, represented by some basic data such as title and url , and an Android |
67 * View that displays the page. | 66 * View that displays the page. |
68 */ | 67 */ |
69 public class NewTabPageView extends FrameLayout | 68 public class NewTabPageView extends FrameLayout |
70 implements MostVisitedURLsObserver, OnLayoutChangeListener { | 69 implements MostVisitedURLsObserver, OnLayoutChangeListener { |
71 | 70 |
72 private static final int SHADOW_COLOR = 0x11000000; | 71 private static final int SHADOW_COLOR = 0x11000000; |
73 private static final long SNAP_SCROLL_DELAY_MS = 30; | 72 private static final long SNAP_SCROLL_DELAY_MS = 30; |
74 private static final String TAG = "NewTabPageView"; | 73 private static final String TAG = "NewTabPageView"; |
75 | 74 |
76 private ViewGroup mContentView; | 75 // Note: Only one of these will be valid at a time, depending on if we are u sing the old NTP |
76 // (NewTabScrollView) or the new NTP with cards (NewTabRecyclerView). | |
77 private NewTabScrollView mScrollView; | 77 private NewTabScrollView mScrollView; |
dgn
2016/03/25 16:29:20
Would it make sense to use composition or inherita
| |
78 private NewTabRecyclerView mRecyclerView; | |
79 | |
80 private NewTabPageLayout mContentView; | |
78 private LogoView mSearchProviderLogoView; | 81 private LogoView mSearchProviderLogoView; |
79 private View mSearchBoxView; | 82 private View mSearchBoxView; |
80 private TextView mSearchBoxTextView; | 83 private TextView mSearchBoxTextView; |
81 private ImageView mVoiceSearchButton; | 84 private ImageView mVoiceSearchButton; |
82 private MostVisitedLayout mMostVisitedLayout; | 85 private MostVisitedLayout mMostVisitedLayout; |
83 private View mMostVisitedPlaceholder; | 86 private View mMostVisitedPlaceholder; |
84 private View mOptOutView; | 87 private View mOptOutView; |
85 private View mNoSearchLogoSpacer; | 88 private View mNoSearchLogoSpacer; |
86 private RecyclerView mSnippetsView; | 89 private NewTabPageCardsManager mCardsManager; |
87 | 90 |
88 private OnSearchBoxScrollListener mSearchBoxScrollListener; | 91 private OnSearchBoxScrollListener mSearchBoxScrollListener; |
89 | 92 |
90 private NewTabPageManager mManager; | 93 private NewTabPageManager mManager; |
91 private MostVisitedDesign mMostVisitedDesign; | 94 private MostVisitedDesign mMostVisitedDesign; |
92 private MostVisitedItem[] mMostVisitedItems; | 95 private MostVisitedItem[] mMostVisitedItems; |
93 private boolean mFirstShow = true; | 96 private boolean mFirstShow = true; |
94 private boolean mSearchProviderHasLogo = true; | 97 private boolean mSearchProviderHasLogo = true; |
95 private boolean mHasReceivedMostVisitedSites; | 98 private boolean mHasReceivedMostVisitedSites; |
96 private boolean mPendingSnapScroll; | 99 private boolean mPendingSnapScroll; |
100 private boolean mAreSnippetsEnabled; | |
97 | 101 |
98 /** | 102 /** |
99 * The number of asynchronous tasks that need to complete before the page is done loading. | 103 * The number of asynchronous tasks that need to complete before the page is done loading. |
100 * This starts at one to track when the view is finished attaching to the wi ndow. | 104 * This starts at one to track when the view is finished attaching to the wi ndow. |
101 */ | 105 */ |
102 private int mPendingLoadTasks = 1; | 106 private int mPendingLoadTasks = 1; |
103 private boolean mLoadHasCompleted; | 107 private boolean mLoadHasCompleted; |
104 | 108 |
105 private float mUrlFocusChangePercent; | 109 private float mUrlFocusChangePercent; |
106 private boolean mDisableUrlFocusChangeAnimations; | 110 private boolean mDisableUrlFocusChangeAnimations; |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
250 * used in any other way. | 254 * used in any other way. |
251 * | 255 * |
252 * @param manager NewTabPageManager used to perform various actions when the user interacts | 256 * @param manager NewTabPageManager used to perform various actions when the user interacts |
253 * with the page. | 257 * with the page. |
254 * @param isSingleUrlBarMode Whether the NTP is in single URL bar mode. | 258 * @param isSingleUrlBarMode Whether the NTP is in single URL bar mode. |
255 * @param searchProviderHasLogo Whether the search provider has a logo. | 259 * @param searchProviderHasLogo Whether the search provider has a logo. |
256 */ | 260 */ |
257 public void initialize(NewTabPageManager manager, boolean isSingleUrlBarMode , | 261 public void initialize(NewTabPageManager manager, boolean isSingleUrlBarMode , |
258 boolean searchProviderHasLogo, SnippetsManager snippetsManager) { | 262 boolean searchProviderHasLogo, SnippetsManager snippetsManager) { |
259 mManager = manager; | 263 mManager = manager; |
264 ViewStub stub = (ViewStub) findViewById(R.id.new_tab_page_layout_stub); | |
260 | 265 |
261 mScrollView = (NewTabScrollView) findViewById(R.id.ntp_scrollview); | 266 mAreSnippetsEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_ SNIPPETS); |
262 mScrollView.enableBottomShadow(SHADOW_COLOR); | 267 |
263 mContentView = (ViewGroup) findViewById(R.id.ntp_content); | 268 if (mAreSnippetsEnabled) { |
269 stub.setLayoutResource(R.layout.new_tab_page_recyclerview); | |
270 mRecyclerView = (NewTabRecyclerView) stub.inflate(); | |
271 mContentView = (NewTabPageLayout) LayoutInflater.from(getContext()) | |
272 .inflate(R.layout.new_tab_page_layout, null); | |
273 } else { | |
274 stub.setLayoutResource(R.layout.new_tab_page_scrollview); | |
275 mScrollView = (NewTabScrollView) stub.inflate(); | |
276 mScrollView.enableBottomShadow(SHADOW_COLOR); | |
277 mContentView = (NewTabPageLayout) findViewById(R.id.ntp_content); | |
278 } | |
264 | 279 |
265 mMostVisitedDesign = new MostVisitedDesign(getContext()); | 280 mMostVisitedDesign = new MostVisitedDesign(getContext()); |
266 mMostVisitedLayout = (MostVisitedLayout) findViewById(R.id.most_visited_ layout); | 281 mMostVisitedLayout = |
282 (MostVisitedLayout) mContentView.findViewById(R.id.most_visited_ layout); | |
267 mMostVisitedDesign.initMostVisitedLayout(mMostVisitedLayout, searchProvi derHasLogo); | 283 mMostVisitedDesign.initMostVisitedLayout(mMostVisitedLayout, searchProvi derHasLogo); |
268 | 284 |
269 mSearchProviderLogoView = (LogoView) findViewById(R.id.search_provider_l ogo); | 285 mSearchProviderLogoView = (LogoView) mContentView.findViewById(R.id.sear ch_provider_logo); |
270 mSearchBoxView = findViewById(R.id.search_box); | 286 mSearchBoxView = mContentView.findViewById(R.id.search_box); |
271 mNoSearchLogoSpacer = findViewById(R.id.no_search_logo_spacer); | 287 mNoSearchLogoSpacer = mContentView.findViewById(R.id.no_search_logo_spac er); |
272 | 288 |
273 mSearchBoxTextView = (TextView) mSearchBoxView.findViewById(R.id.search_ box_text); | 289 mSearchBoxTextView = (TextView) mSearchBoxView.findViewById(R.id.search_ box_text); |
274 String hintText = getResources().getString(R.string.search_or_type_url); | 290 String hintText = getResources().getString(R.string.search_or_type_url); |
275 if (isSingleUrlBarMode) { | 291 if (isSingleUrlBarMode) { |
276 mSearchBoxTextView.setHint(hintText); | 292 mSearchBoxTextView.setHint(hintText); |
277 } else { | 293 } else { |
278 mSearchBoxTextView.setContentDescription(hintText); | 294 mSearchBoxTextView.setContentDescription(hintText); |
279 } | 295 } |
280 mSearchBoxTextView.setOnClickListener(new View.OnClickListener() { | 296 mSearchBoxTextView.setOnClickListener(new View.OnClickListener() { |
281 @Override | 297 @Override |
(...skipping 11 matching lines...) Expand all Loading... | |
293 } | 309 } |
294 | 310 |
295 @Override | 311 @Override |
296 public void afterTextChanged(Editable s) { | 312 public void afterTextChanged(Editable s) { |
297 if (s.length() == 0) return; | 313 if (s.length() == 0) return; |
298 mManager.focusSearchBox(false, s.toString()); | 314 mManager.focusSearchBox(false, s.toString()); |
299 mSearchBoxTextView.setText(""); | 315 mSearchBoxTextView.setText(""); |
300 } | 316 } |
301 }); | 317 }); |
302 | 318 |
303 mVoiceSearchButton = (ImageView) findViewById(R.id.voice_search_button); | 319 mVoiceSearchButton = (ImageView) mContentView.findViewById(R.id.voice_se arch_button); |
304 mVoiceSearchButton.setOnClickListener(new View.OnClickListener() { | 320 mVoiceSearchButton.setOnClickListener(new View.OnClickListener() { |
305 @Override | 321 @Override |
306 public void onClick(View v) { | 322 public void onClick(View v) { |
307 mManager.focusSearchBox(true, null); | 323 mManager.focusSearchBox(true, null); |
308 } | 324 } |
309 }); | 325 }); |
310 | 326 |
311 // Set up the toolbar | 327 // Set up the toolbar |
312 NewTabPageToolbar toolbar = (NewTabPageToolbar) findViewById(R.id.ntp_to olbar); | 328 NewTabPageToolbar toolbar = (NewTabPageToolbar) findViewById(R.id.ntp_to olbar); |
313 if (manager.isToolbarEnabled()) { | 329 if (manager.isToolbarEnabled()) { |
(...skipping 15 matching lines...) Expand all Loading... | |
329 mManager.navigateToInterests(); | 345 mManager.navigateToInterests(); |
330 } | 346 } |
331 }); | 347 }); |
332 | 348 |
333 // Set up interests | 349 // Set up interests |
334 if (manager.isInterestsEnabled()) { | 350 if (manager.isInterestsEnabled()) { |
335 toolbar.getInterestsButton().setVisibility(View.VISIBLE); | 351 toolbar.getInterestsButton().setVisibility(View.VISIBLE); |
336 } | 352 } |
337 } else { | 353 } else { |
338 ((ViewGroup) toolbar.getParent()).removeView(toolbar); | 354 ((ViewGroup) toolbar.getParent()).removeView(toolbar); |
339 FrameLayout.LayoutParams params = | 355 if (!ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_SNIPPETS)) { |
newt (away)
2016/03/24 19:47:39
better: if (mScrollView != null)
dgn
2016/03/28 21:33:02
We have mAreSnippetsEnabled for that, right? Isn't
| |
340 (FrameLayout.LayoutParams) mScrollView.getLayoutParams(); | 356 // Only remove if we're using the old NTP view, the new one does not use a |
341 params.bottomMargin = 0; | 357 // ScrollView |
342 mScrollView.setLayoutParams(params); | 358 FrameLayout.LayoutParams params = |
359 (FrameLayout.LayoutParams) mScrollView.getLayoutParams() ; | |
360 params.bottomMargin = 0; | |
361 mScrollView.setLayoutParams(params); | |
362 } | |
343 } | 363 } |
344 | 364 |
345 initializeSearchBoxScrollHandling(); | |
346 addOnLayoutChangeListener(this); | 365 addOnLayoutChangeListener(this); |
347 setSearchProviderHasLogo(searchProviderHasLogo); | 366 setSearchProviderHasLogo(searchProviderHasLogo); |
348 | 367 |
349 mPendingLoadTasks++; | 368 mPendingLoadTasks++; |
350 mManager.setMostVisitedURLsObserver(this, | 369 mManager.setMostVisitedURLsObserver(this, |
351 mMostVisitedDesign.getNumberOfTiles(searchProviderHasLogo)); | 370 mMostVisitedDesign.getNumberOfTiles(searchProviderHasLogo)); |
352 | 371 |
353 if (mManager.shouldShowOptOutPromo()) showOptOutPromo(); | 372 if (mManager.shouldShowOptOutPromo()) showOptOutPromo(); |
354 | 373 |
355 // Set up snippets | 374 // Set up snippets |
356 if (ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_SNIPPETS)) { | 375 if (mAreSnippetsEnabled) { |
357 mSnippetsView = (RecyclerView) findViewById(R.id.snippets_card_list) ; | 376 mCardsManager = new NewTabPageCardsManager(snippetsManager, mContent View); |
358 mSnippetsView.setVisibility(View.VISIBLE); | 377 mRecyclerView.setAdapter(mCardsManager); |
378 | |
359 RecordHistogram.recordEnumeratedHistogram(SnippetsManager.SNIPPETS_S TATE_HISTOGRAM, | 379 RecordHistogram.recordEnumeratedHistogram(SnippetsManager.SNIPPETS_S TATE_HISTOGRAM, |
360 SnippetsManager.SNIPPETS_SHOWN, SnippetsManager.NUM_SNIPPETS _ACTIONS); | 380 SnippetsManager.SNIPPETS_SHOWN, SnippetsManager.NUM_SNIPPETS _ACTIONS); |
361 mSnippetsView.setLayoutManager(new LinearLayoutManager(getContext()) ); | 381 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener( ) { |
362 mSnippetsView.addOnScrollListener(new RecyclerView.OnScrollListener( ) { | |
363 private boolean mScrolledOnce = false; | 382 private boolean mScrolledOnce = false; |
364 @Override | 383 @Override |
365 public void onScrollStateChanged(RecyclerView recyclerView, int newState) { | 384 public void onScrollStateChanged(RecyclerView recyclerView, int newState) { |
366 if (newState != RecyclerView.SCROLL_STATE_DRAGGING) return; | 385 if (newState != RecyclerView.SCROLL_STATE_DRAGGING) return; |
367 RecordUserAction.record("MobileNTP.Snippets.Scrolled"); | 386 RecordUserAction.record("MobileNTP.Snippets.Scrolled"); |
368 if (mScrolledOnce) return; | 387 if (mScrolledOnce) return; |
369 mScrolledOnce = true; | 388 mScrolledOnce = true; |
370 RecordHistogram.recordEnumeratedHistogram( | 389 RecordHistogram.recordEnumeratedHistogram( |
371 SnippetsManager.SNIPPETS_STATE_HISTOGRAM, | 390 SnippetsManager.SNIPPETS_STATE_HISTOGRAM, |
372 SnippetsManager.SNIPPETS_SCROLLED, | 391 SnippetsManager.SNIPPETS_SCROLLED, |
373 SnippetsManager.NUM_SNIPPETS_ACTIONS); | 392 SnippetsManager.NUM_SNIPPETS_ACTIONS); |
374 } | 393 } |
375 }); | 394 }); |
376 snippetsManager.setSnippetsView(mSnippetsView); | 395 initializeSearchBoxRecyclerViewScrollHandling(); |
396 } else { | |
397 initializeSearchBoxScrollHandling(); | |
377 } | 398 } |
378 } | 399 } |
379 | 400 |
380 private int getTabsMovedIllustration() { | 401 private int getTabsMovedIllustration() { |
381 switch (Build.MANUFACTURER.toLowerCase(Locale.US)) { | 402 switch (Build.MANUFACTURER.toLowerCase(Locale.US)) { |
382 case "samsung": | 403 case "samsung": |
383 if (DocumentModeManager.isDeviceTabbedModeByDefault()) return 0; | 404 if (DocumentModeManager.isDeviceTabbedModeByDefault()) return 0; |
384 return R.drawable.tabs_moved_samsung; | 405 return R.drawable.tabs_moved_samsung; |
385 case "htc": | 406 case "htc": |
386 return R.drawable.tabs_moved_htc; | 407 return R.drawable.tabs_moved_htc; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
437 }); | 458 }); |
438 mManager.optOutPromoShown(); | 459 mManager.optOutPromoShown(); |
439 } | 460 } |
440 | 461 |
441 private void updateSearchBoxOnScroll() { | 462 private void updateSearchBoxOnScroll() { |
442 if (mDisableUrlFocusChangeAnimations) return; | 463 if (mDisableUrlFocusChangeAnimations) return; |
443 | 464 |
444 float percentage = 0; | 465 float percentage = 0; |
445 // During startup the view may not be fully initialized, so we only calc ulate the current | 466 // During startup the view may not be fully initialized, so we only calc ulate the current |
446 // percentage if some basic view properties are sane. | 467 // percentage if some basic view properties are sane. |
447 if (mScrollView.getHeight() != 0 && mSearchBoxView.getTop() != 0) { | 468 if (mAreSnippetsEnabled) { |
newt (away)
2016/03/24 19:47:39
lines 468-478 need more de-duplication. The only d
dgn
2016/03/28 21:33:02
Done.
| |
448 int scrollY = mScrollView.getScrollY(); | 469 if (mRecyclerView.getHeight() != 0 && mSearchBoxView.getTop() != 0) { |
449 percentage = Math.max( | 470 int scrollY = getVerticalScroll(); |
450 0f, Math.min(1f, scrollY / (float) mSearchBoxView.getTop())) ; | 471 percentage = Math.max(0f, Math.min(1f, scrollY / (float) mSearch BoxView.getTop())); |
472 } | |
473 } else { | |
474 if (mScrollView.getHeight() != 0 && mSearchBoxView.getTop() != 0) { | |
475 int scrollY = getVerticalScroll(); | |
476 percentage = Math.max(0f, Math.min(1f, scrollY / (float) mSearch BoxView.getTop())); | |
477 } | |
451 } | 478 } |
452 | 479 |
453 updateVisualsForToolbarTransition(percentage); | 480 updateVisualsForToolbarTransition(percentage); |
454 | 481 |
455 if (mSearchBoxScrollListener != null) { | 482 if (mSearchBoxScrollListener != null) { |
456 mSearchBoxScrollListener.onNtpScrollChanged(percentage); | 483 mSearchBoxScrollListener.onNtpScrollChanged(percentage); |
457 } | 484 } |
458 } | 485 } |
459 | 486 |
487 private void initializeSearchBoxRecyclerViewScrollHandling() { | |
488 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { | |
489 @Override | |
490 public void onScrolled(RecyclerView recyclerView, int dx, int dy) { | |
491 updateSearchBoxOnScroll(); | |
492 } | |
493 }); | |
494 } | |
495 | |
460 private void initializeSearchBoxScrollHandling() { | 496 private void initializeSearchBoxScrollHandling() { |
461 final Runnable mSnapScrollRunnable = new Runnable() { | 497 final Runnable mSnapScrollRunnable = new Runnable() { |
462 @Override | 498 @Override |
463 public void run() { | 499 public void run() { |
464 if (!mPendingSnapScroll) return; | 500 if (!mPendingSnapScroll) return; |
465 int scrollY = mScrollView.getScrollY(); | 501 int scrollY = mScrollView.getScrollY(); |
466 int dividerTop = mMostVisitedLayout.getTop() - mContentView.getP addingTop(); | 502 int dividerTop = mMostVisitedLayout.getTop() - mContentView.getP addingTop(); |
467 if (scrollY > 0 && scrollY < dividerTop) { | 503 if (scrollY > 0 && scrollY < dividerTop) { |
468 mScrollView.smoothScrollTo(0, scrollY < (dividerTop / 2) ? 0 : dividerTop); | 504 mScrollView.smoothScrollTo(0, scrollY < (dividerTop / 2) ? 0 : dividerTop); |
469 } | 505 } |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
622 float getUrlFocusChangeAnimationPercent() { | 658 float getUrlFocusChangeAnimationPercent() { |
623 return mUrlFocusChangePercent; | 659 return mUrlFocusChangePercent; |
624 } | 660 } |
625 | 661 |
626 /** | 662 /** |
627 * Unconditionally sets the percentage the URL is focused during an animatio n, without updating | 663 * Unconditionally sets the percentage the URL is focused during an animatio n, without updating |
628 * mUrlFocusChangePercent. | 664 * mUrlFocusChangePercent. |
629 * @see #setUrlFocusChangeAnimationPercent | 665 * @see #setUrlFocusChangeAnimationPercent |
630 */ | 666 */ |
631 private void setUrlFocusChangeAnimationPercentInternal(float percent) { | 667 private void setUrlFocusChangeAnimationPercentInternal(float percent) { |
632 mContentView.setTranslationY(percent * (-mMostVisitedLayout.getTop() | 668 int scrollOffset = mAreSnippetsEnabled ? mRecyclerView.computeVerticalSc rollOffset() |
633 + mScrollView.getScrollY() + mContentView.getPaddingTop())); | 669 : mScrollView.getScrollY(); |
670 mContentView.setTranslationY(percent | |
671 * (-mMostVisitedLayout.getTop() + scrollOffset + mContentView.ge tPaddingTop())); | |
634 updateVisualsForToolbarTransition(percent); | 672 updateVisualsForToolbarTransition(percent); |
635 } | 673 } |
636 | 674 |
637 private void updateVisualsForToolbarTransition(float transitionPercentage) { | 675 private void updateVisualsForToolbarTransition(float transitionPercentage) { |
638 // Complete the full alpha transition in the first 40% of the animation. | 676 // Complete the full alpha transition in the first 40% of the animation. |
639 float searchUiAlpha = | 677 float searchUiAlpha = |
640 transitionPercentage >= 0.4f ? 0f : (0.4f - transitionPercentage ) * 2.5f; | 678 transitionPercentage >= 0.4f ? 0f : (0.4f - transitionPercentage ) * 2.5f; |
641 // Ensure there are no rounding issues when the animation percent is 0. | 679 // Ensure there are no rounding issues when the animation percent is 0. |
642 if (transitionPercentage == 0f) searchUiAlpha = 1f; | 680 if (transitionPercentage == 0f) searchUiAlpha = 1f; |
643 | 681 |
(...skipping 15 matching lines...) Expand all Loading... | |
659 void getSearchBoxBounds(Rect originalBounds, Rect transformedBounds) { | 697 void getSearchBoxBounds(Rect originalBounds, Rect transformedBounds) { |
660 int searchBoxX = (int) mSearchBoxView.getX(); | 698 int searchBoxX = (int) mSearchBoxView.getX(); |
661 int searchBoxY = (int) mSearchBoxView.getY(); | 699 int searchBoxY = (int) mSearchBoxView.getY(); |
662 originalBounds.set( | 700 originalBounds.set( |
663 searchBoxX + mSearchBoxView.getPaddingLeft(), | 701 searchBoxX + mSearchBoxView.getPaddingLeft(), |
664 searchBoxY + mSearchBoxView.getPaddingTop(), | 702 searchBoxY + mSearchBoxView.getPaddingTop(), |
665 searchBoxX + mSearchBoxView.getWidth() - mSearchBoxView.getPaddi ngRight(), | 703 searchBoxX + mSearchBoxView.getWidth() - mSearchBoxView.getPaddi ngRight(), |
666 searchBoxY + mSearchBoxView.getHeight() - mSearchBoxView.getPadd ingBottom()); | 704 searchBoxY + mSearchBoxView.getHeight() - mSearchBoxView.getPadd ingBottom()); |
667 | 705 |
668 transformedBounds.set(originalBounds); | 706 transformedBounds.set(originalBounds); |
707 | |
669 View view = (View) mSearchBoxView.getParent(); | 708 View view = (View) mSearchBoxView.getParent(); |
670 while (view != null) { | 709 while (view != null) { |
671 transformedBounds.offset(-view.getScrollX(), -view.getScrollY()); | 710 if (view instanceof RecyclerView) { |
711 transformedBounds.offset(-((RecyclerView) view).computeHorizonta lScrollOffset(), | |
712 -((RecyclerView) view).computeVerticalScrollOffset()); | |
713 } else { | |
714 transformedBounds.offset(-view.getScrollX(), -view.getScrollY()) ; | |
715 } | |
672 if (view == this) break; | 716 if (view == this) break; |
673 transformedBounds.offset((int) view.getX(), (int) view.getY()); | 717 transformedBounds.offset((int) view.getX(), (int) view.getY()); |
674 view = (View) view.getParent(); | 718 view = (View) view.getParent(); |
675 } | 719 } |
676 } | 720 } |
677 | 721 |
678 /** | 722 /** |
679 * Sets the listener for search box scroll changes. | 723 * Sets the listener for search box scroll changes. |
680 * @param listener The listener to be notified on changes. | 724 * @param listener The listener to be notified on changes. |
681 */ | 725 */ |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
716 @Override | 760 @Override |
717 protected void onWindowVisibilityChanged(int visibility) { | 761 protected void onWindowVisibilityChanged(int visibility) { |
718 super.onWindowVisibilityChanged(visibility); | 762 super.onWindowVisibilityChanged(visibility); |
719 | 763 |
720 if (visibility == VISIBLE) { | 764 if (visibility == VISIBLE) { |
721 updateVoiceSearchButtonVisibility(); | 765 updateVoiceSearchButtonVisibility(); |
722 } | 766 } |
723 } | 767 } |
724 | 768 |
725 @Override | 769 @Override |
726 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { | 770 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
newt (away)
2016/03/24 19:47:39
This method should be deleted and the remainder of
dgn
2016/03/28 21:33:02
Done. I'm not familiar with the layout mechanisms
| |
727 super.onMeasure(widthMeasureSpec, heightMeasureSpec); | 771 super.onMeasure(widthMeasureSpec, heightMeasureSpec); |
728 | 772 |
729 // Make the search box and logo the same width as the most visited tiles . | 773 // Make the search box and logo the same width as the most visited tiles . |
730 if (mMostVisitedLayout.getVisibility() != GONE) { | 774 if (mMostVisitedLayout.getVisibility() != GONE) { |
731 int mostVisitedWidth = MeasureSpec.makeMeasureSpec(mMostVisitedLayou t.getMeasuredWidth() | 775 mContentView.setMostVisitedWidth(mMostVisitedLayout.getMeasuredWidth () |
732 - mMostVisitedDesign.getMostVisitedLayoutBleed(), MeasureSpe c.EXACTLY); | 776 - mMostVisitedDesign.getMostVisitedLayoutBleed()); |
733 int searchBoxHeight = MeasureSpec.makeMeasureSpec( | |
734 mSearchBoxView.getMeasuredHeight(), MeasureSpec.EXACTLY); | |
735 int logoHeight = MeasureSpec.makeMeasureSpec( | |
736 mSearchProviderLogoView.getMeasuredHeight(), MeasureSpec.EXA CTLY); | |
737 mSearchBoxView.measure(mostVisitedWidth, searchBoxHeight); | |
738 mSearchProviderLogoView.measure(mostVisitedWidth, logoHeight); | |
739 } | 777 } |
May
2016/03/24 07:21:20
To whoever takes over this CL: This needs an else
dgn
2016/03/25 16:29:20
Done.
| |
740 } | 778 } |
741 | 779 |
742 /** | 780 /** |
743 * @see org.chromium.chrome.browser.compositor.layouts.content. | 781 * @see org.chromium.chrome.browser.compositor.layouts.content. |
744 * InvalidationAwareThumbnailProvider#shouldCaptureThumbnail() | 782 * InvalidationAwareThumbnailProvider#shouldCaptureThumbnail() |
745 */ | 783 */ |
746 boolean shouldCaptureThumbnail() { | 784 boolean shouldCaptureThumbnail() { |
747 if (getWidth() == 0 || getHeight() == 0) return false; | 785 if (getWidth() == 0 || getHeight() == 0) return false; |
748 | 786 |
749 return mSnapshotMostVisitedChanged | 787 return mSnapshotMostVisitedChanged || getWidth() != mSnapshotWidth |
750 || getWidth() != mSnapshotWidth | 788 || getHeight() != mSnapshotHeight || getVerticalScroll() != mSna pshotScrollY; |
751 || getHeight() != mSnapshotHeight | |
752 || mScrollView.getScrollY() != mSnapshotScrollY; | |
753 } | 789 } |
754 | 790 |
755 /** | 791 /** |
756 * @see org.chromium.chrome.browser.compositor.layouts.content. | 792 * @see org.chromium.chrome.browser.compositor.layouts.content. |
757 * InvalidationAwareThumbnailProvider#captureThumbnail(Canvas) | 793 * InvalidationAwareThumbnailProvider#captureThumbnail(Canvas) |
758 */ | 794 */ |
759 void captureThumbnail(Canvas canvas) { | 795 void captureThumbnail(Canvas canvas) { |
760 mSearchProviderLogoView.endFadeAnimation(); | 796 mSearchProviderLogoView.endFadeAnimation(); |
761 ViewUtils.captureBitmap(this, canvas); | 797 ViewUtils.captureBitmap(this, canvas); |
762 mSnapshotWidth = getWidth(); | 798 mSnapshotWidth = getWidth(); |
763 mSnapshotHeight = getHeight(); | 799 mSnapshotHeight = getHeight(); |
764 mSnapshotScrollY = mScrollView.getScrollY(); | 800 mSnapshotScrollY = getVerticalScroll(); |
765 mSnapshotMostVisitedChanged = false; | 801 mSnapshotMostVisitedChanged = false; |
766 } | 802 } |
767 | 803 |
768 // OnLayoutChangeListener overrides | 804 // OnLayoutChangeListener overrides |
769 | 805 |
770 @Override | 806 @Override |
771 public void onLayoutChange(View v, int left, int top, int right, int bottom, | 807 public void onLayoutChange(View v, int left, int top, int right, int bottom, |
772 int oldLeft, int oldTop, int oldRight, int oldBottom) { | 808 int oldLeft, int oldTop, int oldRight, int oldBottom) { |
773 int oldWidth = oldRight - oldLeft; | 809 int oldWidth = oldRight - oldLeft; |
774 int newWidth = right - left; | 810 int newWidth = right - left; |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1018 for (MostVisitedItem item : mMostVisitedItems) { | 1054 for (MostVisitedItem item : mMostVisitedItems) { |
1019 if (item.getUrl().equals(url)) { | 1055 if (item.getUrl().equals(url)) { |
1020 LargeIconCallback iconCallback = new LargeIconCallbackImpl( | 1056 LargeIconCallback iconCallback = new LargeIconCallbackImpl( |
1021 item, (MostVisitedItemView) item.getView(), false); | 1057 item, (MostVisitedItemView) item.getView(), false); |
1022 mManager.getLargeIconForUrl(url, mMinIconSize, iconCallback) ; | 1058 mManager.getLargeIconForUrl(url, mMinIconSize, iconCallback) ; |
1023 break; | 1059 break; |
1024 } | 1060 } |
1025 } | 1061 } |
1026 } | 1062 } |
1027 } | 1063 } |
1064 | |
1065 private int getVerticalScroll() { | |
1066 if (mAreSnippetsEnabled) { | |
1067 return mRecyclerView.computeVerticalScrollOffset(); | |
1068 } else { | |
1069 return mScrollView.getScrollY(); | |
1070 } | |
1071 } | |
1028 } | 1072 } |
OLD | NEW |