OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.chrome.browser.compositor.layouts; |
| 6 |
| 7 import android.content.Context; |
| 8 import android.text.TextUtils; |
| 9 import android.view.ViewGroup; |
| 10 |
| 11 import com.google.android.apps.chrome.R; |
| 12 |
| 13 import org.chromium.chrome.browser.Tab; |
| 14 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; |
| 15 import org.chromium.chrome.browser.compositor.layouts.eventfilter.AreaGestureEve
ntFilter; |
| 16 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeEvent
Filter.ScrollDirection; |
| 17 import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler
; |
| 18 import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperMa
nager; |
| 19 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDe
legate; |
| 20 import org.chromium.chrome.browser.tabmodel.TabCreatorManager; |
| 21 import org.chromium.chrome.browser.tabmodel.TabModel; |
| 22 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
| 23 import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
| 24 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; |
| 25 import org.chromium.ui.resources.dynamics.DynamicResourceLoader; |
| 26 |
| 27 import java.util.List; |
| 28 |
| 29 /** |
| 30 * {@link LayoutManagerChromeTablet} is the specialization of {@link LayoutManag
erChrome} for |
| 31 * the tablet. |
| 32 */ |
| 33 public class LayoutManagerChromeTablet extends LayoutManagerChrome { |
| 34 // Event Filters |
| 35 private final AreaGestureEventFilter mTabStripFilter; |
| 36 |
| 37 // Internal State |
| 38 private final String mDefaultTitle; |
| 39 |
| 40 private StripLayoutHelperManager mTabStripLayoutHelperManager; |
| 41 private TabModelSelectorTabObserver mTabObserver; |
| 42 |
| 43 /** |
| 44 * Creates an instance of a {@link LayoutManagerChromePhone}. |
| 45 * @param host A {@link LayoutManagerHost} instance. |
| 46 * @param overviewLayoutFactoryDelegate A {@link OverviewLayoutFactoryDelega
te} instance. |
| 47 */ |
| 48 public LayoutManagerChromeTablet( |
| 49 LayoutManagerHost host, OverviewLayoutFactoryDelegate overviewLayout
FactoryDelegate) { |
| 50 super(host, overviewLayoutFactoryDelegate); |
| 51 Context context = host.getContext(); |
| 52 |
| 53 // Build Event Filters |
| 54 mTabStripFilter = new AreaGestureEventFilter( |
| 55 context, this, new TabStripEventHandler(), null, false, false); |
| 56 |
| 57 mTabStripLayoutHelperManager = new StripLayoutHelperManager( |
| 58 context, this, mHost.getLayoutRenderHost(), mTabStripFilter); |
| 59 |
| 60 // Set up state |
| 61 mDefaultTitle = context.getString(R.string.tab_loading_default_title); |
| 62 |
| 63 addGlobalSceneOverlay(mTabStripLayoutHelperManager); |
| 64 |
| 65 setNextLayout(null); |
| 66 } |
| 67 |
| 68 @Override |
| 69 public void destroy() { |
| 70 super.destroy(); |
| 71 |
| 72 if (mTabStripLayoutHelperManager != null) { |
| 73 mTabStripLayoutHelperManager.destroy(); |
| 74 mTabStripLayoutHelperManager = null; |
| 75 } |
| 76 |
| 77 if (mTabObserver != null) { |
| 78 mTabObserver.destroy(); |
| 79 mTabObserver = null; |
| 80 } |
| 81 } |
| 82 |
| 83 @Override |
| 84 protected ToolbarSwipeHandler createToolbarSwipeHandler(LayoutProvider provi
der) { |
| 85 return new TabletToolbarSwipeHandler(provider); |
| 86 } |
| 87 |
| 88 @Override |
| 89 public void tabSelected(int tabId, int prevId, boolean incognito) { |
| 90 if (getActiveLayout() == mStaticLayout || getActiveLayout() == mOverview
ListLayout) { |
| 91 super.tabSelected(tabId, prevId, incognito); |
| 92 } else { |
| 93 startShowing(mStaticLayout, false); |
| 94 // TODO(dtrainor, jscholler): This is hacky because we're relying on
it to set the |
| 95 // internal tab to show and not start hiding until we're done callin
g finalizeShowing(). |
| 96 // This prevents a flicker because we properly build and set the int
ernal |
| 97 // {@link LayoutTab} before actually showing the {@link TabView}. |
| 98 if (getActiveLayout() != null) { |
| 99 getActiveLayout().onTabSelected(time(), tabId, prevId, incognito
); |
| 100 } |
| 101 if (getActiveLayout() != null) getActiveLayout().onTabSelecting(time
(), tabId); |
| 102 } |
| 103 } |
| 104 |
| 105 @Override |
| 106 protected void tabCreated(int id, int sourceId, TabLaunchType launchType, bo
olean incognito, |
| 107 boolean willBeSelected, float originX, float originY) { |
| 108 if (getFullscreenManager() != null) getFullscreenManager().showControlsT
ransient(); |
| 109 super.tabCreated(id, sourceId, launchType, incognito, willBeSelected, or
iginX, originY); |
| 110 } |
| 111 |
| 112 @Override |
| 113 protected void tabClosed(int id, int nextId, boolean incognito) { |
| 114 super.tabClosed(id, nextId, incognito); |
| 115 } |
| 116 |
| 117 @Override |
| 118 protected void tabClosureCommitted(int id, boolean incognito) { |
| 119 super.tabClosureCommitted(id, incognito); |
| 120 if (mTitleCache != null) mTitleCache.remove(id); |
| 121 } |
| 122 |
| 123 @Override |
| 124 public void init(TabModelSelector selector, TabCreatorManager creator, |
| 125 TabContentManager content, ViewGroup androidContentContainer, |
| 126 ContextualSearchManagementDelegate contextualSearchDelegate, |
| 127 DynamicResourceLoader dynamicResourceLoader) { |
| 128 if (mTabStripLayoutHelperManager != null) { |
| 129 mTabStripLayoutHelperManager.setTabModelSelector(selector, creator,
content); |
| 130 } |
| 131 |
| 132 super.init(selector, creator, content, androidContentContainer, contextu
alSearchDelegate, |
| 133 dynamicResourceLoader); |
| 134 |
| 135 mTabObserver = new TabModelSelectorTabObserver(selector) { |
| 136 @Override |
| 137 public void onFaviconUpdated(Tab tab) { |
| 138 updateTitle(tab); |
| 139 } |
| 140 |
| 141 @Override |
| 142 public void onTitleUpdated(Tab tab) { |
| 143 updateTitle(tab); |
| 144 } |
| 145 }; |
| 146 |
| 147 // Make sure any tabs already restored get loaded into the title cache. |
| 148 List<TabModel> models = selector.getModels(); |
| 149 for (int i = 0; i < models.size(); i++) { |
| 150 TabModel model = models.get(i); |
| 151 for (int j = 0; j < model.getCount(); j++) { |
| 152 Tab tab = model.getTabAt(j); |
| 153 if (tab != null && mTitleCache != null) { |
| 154 mTitleCache.put(tab.getId(), getTitleBitmap(tab), getFavicon
Bitmap(tab), |
| 155 tab.isIncognito(), tab.isTitleDirectionRtl()); |
| 156 } |
| 157 } |
| 158 } |
| 159 } |
| 160 |
| 161 @Override |
| 162 protected LayoutManagerTabModelObserver createTabModelObserver() { |
| 163 return new LayoutManagerTabModelObserver() { |
| 164 @Override |
| 165 public void didAddTab(Tab tab, TabLaunchType launchType) { |
| 166 super.didAddTab(tab, launchType); |
| 167 updateTitle(getTabById(tab.getId())); |
| 168 } |
| 169 }; |
| 170 } |
| 171 |
| 172 @Override |
| 173 protected String getTitleForTab(Tab tab) { |
| 174 String title = super.getTitleForTab(tab); |
| 175 if (TextUtils.isEmpty(title)) title = mDefaultTitle; |
| 176 return title; |
| 177 } |
| 178 |
| 179 @Override |
| 180 public StripLayoutHelperManager getStripLayoutHelperManager() { |
| 181 return mTabStripLayoutHelperManager; |
| 182 } |
| 183 |
| 184 private void updateTitle(Tab tab) { |
| 185 if (tab != null && mTitleCache != null) { |
| 186 mTitleCache.put(tab.getId(), getTitleBitmap(tab), getFaviconBitmap(t
ab), |
| 187 tab.isIncognito(), tab.isTitleDirectionRtl()); |
| 188 |
| 189 getActiveLayout().tabTitleChanged(tab.getId(), getTitleForTab(tab)); |
| 190 } |
| 191 } |
| 192 |
| 193 private class TabletToolbarSwipeHandler extends ToolbarSwipeHandler { |
| 194 public TabletToolbarSwipeHandler(LayoutProvider provider) { |
| 195 super(provider); |
| 196 } |
| 197 |
| 198 @Override |
| 199 public boolean isSwipeEnabled(ScrollDirection direction) { |
| 200 if ((direction == ScrollDirection.LEFT || direction == ScrollDirecti
on.RIGHT) |
| 201 && (getTabModelSelector() == null |
| 202 || getTabModelSelector().getCurrentModel().getCou
nt() <= 1)) { |
| 203 return false; |
| 204 } |
| 205 |
| 206 return super.isSwipeEnabled(direction); |
| 207 } |
| 208 } |
| 209 |
| 210 private class TabStripEventHandler implements GestureHandler { |
| 211 @Override |
| 212 public void onDown(float x, float y) { |
| 213 mTabStripLayoutHelperManager.onDown(time(), x, y); |
| 214 } |
| 215 |
| 216 @Override |
| 217 public void onUpOrCancel() { |
| 218 mTabStripLayoutHelperManager.onUpOrCancel(time()); |
| 219 } |
| 220 |
| 221 @Override |
| 222 public void drag(float x, float y, float dx, float dy, float tx, float t
y) { |
| 223 mTabStripLayoutHelperManager.drag(time(), x, y, dx, dy, tx, ty); |
| 224 } |
| 225 |
| 226 @Override |
| 227 public void click(float x, float y) { |
| 228 mTabStripLayoutHelperManager.click(time(), x, y); |
| 229 } |
| 230 |
| 231 @Override |
| 232 public void fling(float x, float y, float velocityX, float velocityY) { |
| 233 mTabStripLayoutHelperManager.fling(time(), x, y, velocityX, velocity
Y); |
| 234 } |
| 235 |
| 236 @Override |
| 237 public void onLongPress(float x, float y) { |
| 238 mTabStripLayoutHelperManager.onLongPress(time(), x, y); |
| 239 } |
| 240 |
| 241 @Override |
| 242 public void onPinch(float x0, float y0, float x1, float y1, boolean firs
tEvent) { |
| 243 // Not implemented. |
| 244 } |
| 245 } |
| 246 } |
OLD | NEW |