Chromium Code Reviews| OLD | NEW |
|---|---|
| 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.infobar; | 5 package org.chromium.chrome.browser.infobar; |
| 6 | 6 |
| 7 import android.util.TypedValue; | 7 import android.util.TypedValue; |
| 8 import android.view.Gravity; | 8 import android.view.Gravity; |
| 9 import android.view.View; | 9 import android.view.View; |
| 10 import android.widget.TextView; | 10 import android.widget.TextView; |
| 11 | 11 |
| 12 import org.chromium.base.ApiCompatibilityUtils; | 12 import org.chromium.base.ApiCompatibilityUtils; |
| 13 import org.chromium.base.annotations.CalledByNative; | 13 import org.chromium.base.annotations.CalledByNative; |
| 14 import org.chromium.chrome.R; | 14 import org.chromium.chrome.R; |
| 15 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; | |
| 16 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChange Reason; | |
| 15 import org.chromium.chrome.browser.dom_distiller.ReaderModeManager; | 17 import org.chromium.chrome.browser.dom_distiller.ReaderModeManager; |
| 16 import org.chromium.chrome.browser.tab.Tab; | 18 import org.chromium.chrome.browser.tab.Tab; |
| 19 import org.chromium.content_public.browser.WebContents; | |
| 20 import org.chromium.content_public.browser.WebContentsObserver; | |
| 17 | 21 |
| 18 /** | 22 /** |
| 19 * This is the InfoBar implementation of the Reader Mode UI. This is used in pla ce of the | 23 * This is the InfoBar implementation of the Reader Mode UI. This is used in pla ce of the |
| 20 * {@link OverlayPanel} implementation when Chrome Home is enabled. | 24 * {@link OverlayPanel} implementation when Chrome Home is enabled. |
| 21 */ | 25 */ |
| 22 public class ReaderModeInfoBar extends InfoBar { | 26 public class ReaderModeInfoBar extends InfoBar { |
| 23 /** A handle to the {@link ReaderModeManager} to trigger page navigations. * / | 27 /** A handle to the {@link ReaderModeManager} to trigger page navigations. * / |
| 24 private static ReaderModeManager sManager; | 28 private static ReaderModeManager sManager; |
| 25 | 29 |
| 30 /** A {@link WebContentsObserver} to watch for page navigations. */ | |
| 31 private WebContentsObserver mWebContentsObserver; | |
| 32 | |
| 33 /** The {@link WebContents} that this infobar is operating on. */ | |
| 34 private WebContents mWebContents; | |
| 35 | |
| 26 /** | 36 /** |
| 27 * Default constructor. | 37 * Default constructor. |
| 28 */ | 38 */ |
| 29 private ReaderModeInfoBar() { | 39 private ReaderModeInfoBar() { |
| 30 super(R.drawable.infobar_mobile_friendly, null, null); | 40 super(R.drawable.infobar_mobile_friendly, null, null); |
| 31 } | 41 } |
| 32 | 42 |
| 33 @Override | 43 @Override |
| 34 protected boolean usesCompactLayout() { | 44 protected boolean usesCompactLayout() { |
| 35 return true; | 45 return true; |
| 36 } | 46 } |
| 37 | 47 |
| 38 @Override | 48 @Override |
| 39 protected void createCompactLayoutContent(InfoBarCompactLayout layout) { | 49 protected void createCompactLayoutContent(InfoBarCompactLayout layout) { |
| 40 TextView prompt = new TextView(getContext()); | 50 TextView prompt = new TextView(getContext()); |
| 41 prompt.setText(R.string.reader_view_text); | 51 prompt.setText(R.string.reader_view_text); |
| 42 prompt.setSingleLine(); | 52 prompt.setSingleLine(); |
| 43 prompt.setTextSize(TypedValue.COMPLEX_UNIT_PX, | 53 prompt.setTextSize(TypedValue.COMPLEX_UNIT_PX, |
| 44 getContext().getResources().getDimension(R.dimen.infobar_text_si ze)); | 54 getContext().getResources().getDimension(R.dimen.infobar_text_si ze)); |
| 45 prompt.setTextColor( | 55 prompt.setTextColor( |
| 46 ApiCompatibilityUtils.getColor(layout.getResources(), R.color.de fault_text_color)); | 56 ApiCompatibilityUtils.getColor(layout.getResources(), R.color.de fault_text_color)); |
| 47 prompt.setGravity(Gravity.CENTER_VERTICAL); | 57 prompt.setGravity(Gravity.CENTER_VERTICAL); |
| 48 | 58 |
| 59 mWebContentsObserver = new WebContentsObserver() { | |
| 60 @Override | |
|
Ted C
2017/05/19 23:19:07
per some offline discussion, infobars "should" del
mdjones
2017/05/22 21:11:02
Done.
| |
| 61 public void didStartNavigation(String url, boolean isInMainFrame, | |
| 62 boolean isSameDocument, boolean isErrorPage) { | |
| 63 if (!isInMainFrame) return; | |
| 64 | |
| 65 // If a navigation was triggered close this infobar. | |
| 66 nativeHide(getNativeInfoBarPtr()); | |
| 67 destroyWebContentsObserver(); | |
| 68 } | |
| 69 }; | |
| 70 | |
| 71 mWebContents = sManager.getBasePageWebContents(); | |
| 72 sManager.getBasePageWebContents().addObserver(mWebContentsObserver); | |
| 73 | |
| 49 prompt.setOnClickListener(new View.OnClickListener() { | 74 prompt.setOnClickListener(new View.OnClickListener() { |
| 50 @Override | 75 @Override |
| 51 public void onClick(View v) { | 76 public void onClick(View v) { |
| 52 // TODO(mdjones): Trigger navigation from manager. | 77 destroyWebContentsObserver(); |
| 78 sManager.navigateToReaderMode(); | |
| 53 } | 79 } |
| 54 }); | 80 }); |
| 55 | 81 |
| 56 layout.addContent(prompt, 1f); | 82 layout.addContent(prompt, 1f); |
| 57 } | 83 } |
| 58 | 84 |
| 85 @Override | |
| 59 public void onCloseButtonClicked() { | 86 public void onCloseButtonClicked() { |
| 60 super.onCloseButtonClicked(); | 87 super.onCloseButtonClicked(); |
| 61 | 88 destroyWebContentsObserver(); |
| 62 // TODO(mdjones): Notifiy the manager that the infobar was closed. | 89 sManager.onClosed(StateChangeReason.CLOSE_BUTTON); |
| 63 } | 90 } |
| 64 | 91 |
| 65 /** | 92 /** |
| 93 * Detach and null the infobar's web contents observer. | |
| 94 */ | |
| 95 private void destroyWebContentsObserver() { | |
| 96 if (mWebContentsObserver == null) return; | |
| 97 | |
| 98 mWebContents.removeObserver(mWebContentsObserver); | |
| 99 mWebContentsObserver = null; | |
| 100 } | |
| 101 | |
| 102 @Override | |
| 103 protected void onNativeDestroyed() { | |
| 104 super.onNativeDestroyed(); | |
| 105 destroyWebContentsObserver(); | |
| 106 } | |
| 107 | |
| 108 /** | |
| 66 * Create and show the Reader Mode {@link InfoBar}. | 109 * Create and show the Reader Mode {@link InfoBar}. |
| 67 * @param tab The tab that the {@link InfoBar} should be shown in. | 110 * @param tab The tab that the {@link InfoBar} should be shown in. |
| 68 * @param manager The {@link ReaderModeManager} for this instance of Chrome. | 111 * @param manager The {@link ReaderModeManager} for this instance of Chrome. |
| 69 */ | 112 */ |
| 70 public static void showReaderModeInfoBar(Tab tab, ReaderModeManager manager) { | 113 public static void showReaderModeInfoBar(Tab tab, ReaderModeManager manager) { |
| 71 sManager = manager; | 114 sManager = manager; |
| 72 nativeCreate(tab); | 115 nativeCreate(tab); |
| 73 } | 116 } |
| 74 | 117 |
| 75 /** | 118 /** |
| 76 * @return An instance of the {@link ReaderModeInfoBar}. | 119 * @return An instance of the {@link ReaderModeInfoBar}. |
| 77 */ | 120 */ |
| 78 @CalledByNative | 121 @CalledByNative |
| 79 private static ReaderModeInfoBar create() { | 122 private static ReaderModeInfoBar create() { |
| 80 return new ReaderModeInfoBar(); | 123 return new ReaderModeInfoBar(); |
| 81 } | 124 } |
| 82 | 125 |
| 83 private static native void nativeCreate(Tab tab); | 126 private static native void nativeCreate(Tab tab); |
| 127 private native void nativeHide(long nativeReaderModeInfoBar); | |
| 84 } | 128 } |
| OLD | NEW |