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 |