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

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

Issue 2862893002: 📰 Add visibility change triggers for bottom sheet content (Closed)
Patch Set: Fix compilation post merge Created 3 years, 7 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 | chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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.suggestions; 5 package org.chromium.chrome.browser.suggestions;
6 6
7 import android.annotation.SuppressLint; 7 import android.annotation.SuppressLint;
8 import android.support.v7.widget.RecyclerView; 8 import android.support.v7.widget.RecyclerView;
9 import android.support.v7.widget.RecyclerView.OnScrollListener; 9 import android.support.v7.widget.RecyclerView.OnScrollListener;
10 import android.view.LayoutInflater; 10 import android.view.LayoutInflater;
(...skipping 15 matching lines...) Expand all
26 import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource; 26 import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
27 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; 27 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
28 import org.chromium.chrome.browser.omnibox.LocationBar; 28 import org.chromium.chrome.browser.omnibox.LocationBar;
29 import org.chromium.chrome.browser.profiles.Profile; 29 import org.chromium.chrome.browser.profiles.Profile;
30 import org.chromium.chrome.browser.snackbar.SnackbarManager; 30 import org.chromium.chrome.browser.snackbar.SnackbarManager;
31 import org.chromium.chrome.browser.tabmodel.TabModelSelector; 31 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
32 import org.chromium.chrome.browser.widget.FadingShadow; 32 import org.chromium.chrome.browser.widget.FadingShadow;
33 import org.chromium.chrome.browser.widget.FadingShadowView; 33 import org.chromium.chrome.browser.widget.FadingShadowView;
34 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; 34 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet;
35 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentControll er; 35 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentControll er;
36 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver;
37 import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver;
38 import org.chromium.chrome.browser.widget.displaystyle.UiConfig; 36 import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
39 import org.chromium.ui.widget.Toast; 37 import org.chromium.ui.widget.Toast;
40 38
41 import java.util.List; 39 import java.util.List;
42 import java.util.Locale; 40 import java.util.Locale;
43 41
44 /** 42 /**
45 * Provides content to be displayed inside of the Home tab of bottom sheet. 43 * Provides content to be displayed inside of the Home tab of bottom sheet.
46 */ 44 */
47 public class SuggestionsBottomSheetContent implements BottomSheet.BottomSheetCon tent { 45 public class SuggestionsBottomSheetContent implements BottomSheet.BottomSheetCon tent {
48 private static SuggestionsSource sSuggestionsSourceForTesting; 46 private static SuggestionsSource sSuggestionsSourceForTesting;
49 private static SuggestionsEventReporter sEventReporterForTesting; 47 private static SuggestionsEventReporter sEventReporterForTesting;
50 48
51 private final View mView; 49 private final View mView;
52 private final FadingShadowView mShadowView; 50 private final FadingShadowView mShadowView;
53 private final SuggestionsRecyclerView mRecyclerView; 51 private final SuggestionsRecyclerView mRecyclerView;
54 private final ContextMenuManager mContextMenuManager; 52 private final ContextMenuManager mContextMenuManager;
55 private final SuggestionsUiDelegateImpl mSuggestionsUiDelegate; 53 private final SuggestionsUiDelegateImpl mSuggestionsUiDelegate;
56 private final TileGroup.Delegate mTileGroupDelegate; 54 private final TileGroup.Delegate mTileGroupDelegate;
57 private final BottomSheet mBottomSheet; 55 private final SuggestionsSheetVisibilityChangeObserver mBottomSheetObserver;
58 private final BottomSheetObserver mBottomSheetObserver;
59 56
60 public SuggestionsBottomSheetContent(final ChromeActivity activity, final Bo ttomSheet sheet, 57 public SuggestionsBottomSheetContent(final ChromeActivity activity, final Bo ttomSheet sheet,
61 TabModelSelector tabModelSelector, SnackbarManager snackbarManager) { 58 TabModelSelector tabModelSelector, SnackbarManager snackbarManager) {
62 Profile profile = Profile.getLastUsedProfile(); 59 Profile profile = Profile.getLastUsedProfile();
63 SuggestionsNavigationDelegate navigationDelegate = 60 SuggestionsNavigationDelegate navigationDelegate =
64 new SuggestionsNavigationDelegateImpl(activity, profile, sheet, tabModelSelector); 61 new SuggestionsNavigationDelegateImpl(activity, profile, sheet, tabModelSelector);
65 mTileGroupDelegate = new TileGroupDelegateImpl( 62 mTileGroupDelegate = new TileGroupDelegateImpl(
66 activity, profile, tabModelSelector, navigationDelegate, snackba rManager); 63 activity, profile, tabModelSelector, navigationDelegate, snackba rManager);
67 mSuggestionsUiDelegate = createSuggestionsDelegate( 64 mSuggestionsUiDelegate = createSuggestionsDelegate(
68 profile, navigationDelegate, sheet, activity.getReferencePool()) ; 65 profile, navigationDelegate, sheet, activity.getReferencePool()) ;
(...skipping 18 matching lines...) Expand all
87 } 84 }
88 }); 85 });
89 86
90 UiConfig uiConfig = new UiConfig(mRecyclerView); 87 UiConfig uiConfig = new UiConfig(mRecyclerView);
91 88
92 final NewTabPageAdapter adapter = new NewTabPageAdapter(mSuggestionsUiDe legate, 89 final NewTabPageAdapter adapter = new NewTabPageAdapter(mSuggestionsUiDe legate,
93 /* aboveTheFoldView = */ null, uiConfig, OfflinePageBridge.getFo rProfile(profile), 90 /* aboveTheFoldView = */ null, uiConfig, OfflinePageBridge.getFo rProfile(profile),
94 mContextMenuManager, mTileGroupDelegate); 91 mContextMenuManager, mTileGroupDelegate);
95 mRecyclerView.init(uiConfig, mContextMenuManager, adapter); 92 mRecyclerView.init(uiConfig, mContextMenuManager, adapter);
96 93
97 mBottomSheetObserver = new EmptyBottomSheetObserver() { 94 mBottomSheetObserver = new SuggestionsSheetVisibilityChangeObserver(this , activity) {
98 @Override 95 @Override
99 public void onSheetOpened() { 96 public void onSheetOpened() {
100 mRecyclerView.scrollToPosition(0); 97 mRecyclerView.scrollToPosition(0);
101 prepareSuggestionsForReveal(adapter); 98 adapter.refreshSuggestions();
102 99 mSuggestionsUiDelegate.getEventReporter().onSurfaceOpened();
103 mRecyclerView.getScrollEventReporter().reset(); 100 mRecyclerView.getScrollEventReporter().reset();
104 101
105 if (ChromeFeatureList.isEnabled( 102 if (ChromeFeatureList.isEnabled(
106 ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_CAROUSEL)) { 103 ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_CAROUSEL)) {
107 updateContextualSuggestions(mBottomSheet.getActiveTab().getU rl()); 104 updateContextualSuggestions(sheet.getActiveTab().getUrl());
108 } 105 }
106
107 super.onSheetOpened();
109 } 108 }
110 109
111 @Override 110 @Override
112 public void onSheetClosed() { 111 public void onContentShown() {
112 SuggestionsMetrics.recordSurfaceVisible();
113 }
114
115 @Override
116 public void onContentHidden() {
113 SuggestionsMetrics.recordSurfaceHidden(); 117 SuggestionsMetrics.recordSurfaceHidden();
114 } 118 }
115 119
120 @Override
121 public void onContentStateChanged(@BottomSheet.SheetState int conten tState) {
122 if (contentState == BottomSheet.SHEET_STATE_HALF) {
123 SuggestionsMetrics.recordSurfaceHalfVisible();
124 } else if (contentState == BottomSheet.SHEET_STATE_FULL) {
125 SuggestionsMetrics.recordSurfaceFullyVisible();
126 }
127 }
116 }; 128 };
117 mBottomSheet = activity.getBottomSheet();
118 mBottomSheet.addObserver(mBottomSheetObserver);
119
120 if (mBottomSheet.isSheetOpen()) prepareSuggestionsForReveal(adapter);
121 129
122 mShadowView = (FadingShadowView) mView.findViewById(R.id.shadow); 130 mShadowView = (FadingShadowView) mView.findViewById(R.id.shadow);
123 mShadowView.init( 131 mShadowView.init(
124 ApiCompatibilityUtils.getColor(mView.getResources(), R.color.too lbar_shadow_color), 132 ApiCompatibilityUtils.getColor(mView.getResources(), R.color.too lbar_shadow_color),
125 FadingShadow.POSITION_TOP); 133 FadingShadow.POSITION_TOP);
126 134
127 mRecyclerView.addOnScrollListener(new OnScrollListener() { 135 mRecyclerView.addOnScrollListener(new OnScrollListener() {
128 @Override 136 @Override
129 public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 137 public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
130 boolean shadowVisible = mRecyclerView.canScrollVertically(-1); 138 boolean shadowVisible = mRecyclerView.canScrollVertically(-1);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 return false; 170 return false;
163 } 171 }
164 172
165 @Override 173 @Override
166 public int getVerticalScrollOffset() { 174 public int getVerticalScrollOffset() {
167 return mRecyclerView.computeVerticalScrollOffset(); 175 return mRecyclerView.computeVerticalScrollOffset();
168 } 176 }
169 177
170 @Override 178 @Override
171 public void destroy() { 179 public void destroy() {
172 mBottomSheet.removeObserver(mBottomSheetObserver); 180 mBottomSheetObserver.onDestroy();
173 mSuggestionsUiDelegate.onDestroy(); 181 mSuggestionsUiDelegate.onDestroy();
174 mTileGroupDelegate.destroy(); 182 mTileGroupDelegate.destroy();
175 } 183 }
176 184
177 @Override 185 @Override
178 public int getType() { 186 public int getType() {
179 return BottomSheetContentController.TYPE_SUGGESTIONS; 187 return BottomSheetContentController.TYPE_SUGGESTIONS;
180 } 188 }
181 189
182 /** Called when the UI is revlealed, prepares the list of suggestions. */
183 private void prepareSuggestionsForReveal(NewTabPageAdapter adapter) {
184 adapter.refreshSuggestions();
185 mSuggestionsUiDelegate.getEventReporter().onSurfaceOpened();
186 SuggestionsMetrics.recordSurfaceVisible();
187 }
188
189 private void updateContextualSuggestions(String url) { 190 private void updateContextualSuggestions(String url) {
190 mSuggestionsUiDelegate.getSuggestionsSource().fetchContextualSuggestions ( 191 mSuggestionsUiDelegate.getSuggestionsSource().fetchContextualSuggestions (
191 url, new Callback<List<SnippetArticle>>() { 192 url, new Callback<List<SnippetArticle>>() {
192 @Override 193 @Override
193 public void onResult(List<SnippetArticle> result) { 194 public void onResult(List<SnippetArticle> result) {
194 String text = String.format( 195 String text = String.format(
195 Locale.US, "Received %d contextual suggestions", result.size()); 196 Locale.US, "Received %d contextual suggestions", result.size());
196 Toast.makeText(mRecyclerView.getContext(), text, Toast.L ENGTH_SHORT).show(); 197 Toast.makeText(mRecyclerView.getContext(), text, Toast.L ENGTH_SHORT).show();
197 } 198 }
198 }); 199 });
(...skipping 27 matching lines...) Expand all
226 eventReporter = sEventReporterForTesting; 227 eventReporter = sEventReporterForTesting;
227 } 228 }
228 229
229 SuggestionsUiDelegateImpl delegate = new SuggestionsUiDelegateImpl( 230 SuggestionsUiDelegateImpl delegate = new SuggestionsUiDelegateImpl(
230 suggestionsSource, eventReporter, navigationDelegate, profile, h ost, referencePool); 231 suggestionsSource, eventReporter, navigationDelegate, profile, h ost, referencePool);
231 if (snippetsBridge != null) delegate.addDestructionObserver(snippetsBrid ge); 232 if (snippetsBridge != null) delegate.addDestructionObserver(snippetsBrid ge);
232 233
233 return delegate; 234 return delegate;
234 } 235 }
235 } 236 }
OLDNEW
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetrics.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698