blob: a52f066f2be550b20423fb7528fcc3173c3705ab [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.infobar;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
import org.chromium.chrome.browser.dom_distiller.ReaderModeManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.ui.messages.infobar.InfoBarCompactLayout;
import org.chromium.components.browser_ui.widget.text.AccessibleTextView;
/**
* This is the InfoBar implementation of the Reader Mode UI. This is used in place of the
* {@link OverlayPanel} implementation when Chrome Home is enabled.
*/
public class ReaderModeInfoBar extends InfoBar {
/** If the infobar has started hiding. */
private boolean mIsHiding;
/**
* Navigate to Reader Mode when the icon or the message text is clicked.
*/
private View.OnClickListener mNavigateListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getReaderModeManager() == null || mIsHiding) return;
getReaderModeManager().activateReaderMode();
}
};
/**
* Default constructor.
*/
private ReaderModeInfoBar() {
super(R.drawable.infobar_mobile_friendly, R.color.infobar_icon_drawable_color, null, null);
}
@Override
protected boolean usesCompactLayout() {
return true;
}
@Override
protected void onStartedHiding() {
mIsHiding = true;
}
@Override
protected void createCompactLayoutContent(InfoBarCompactLayout layout) {
TextView prompt = new AccessibleTextView(getContext());
prompt.setText(R.string.reader_view_text_alt);
prompt.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getContext().getResources().getDimension(R.dimen.infobar_text_size));
prompt.setTextColor(
ApiCompatibilityUtils.getColor(layout.getResources(), R.color.default_text_color));
prompt.setGravity(Gravity.CENTER_VERTICAL);
prompt.setOnClickListener(mNavigateListener);
ImageView iconView = layout.findViewById(R.id.infobar_icon);
iconView.setOnClickListener(mNavigateListener);
iconView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
final int messagePadding = getContext().getResources().getDimensionPixelOffset(
R.dimen.infobar_compact_message_vertical_padding);
prompt.setPadding(0, messagePadding, 0, messagePadding);
layout.addContent(prompt, 1f);
}
@Override
protected CharSequence getAccessibilityMessage(CharSequence defaultMessage) {
return getContext().getString(R.string.reader_view_text_alt);
}
@Override
public void onCloseButtonClicked() {
if (getReaderModeManager() != null) {
getReaderModeManager().onClosed(StateChangeReason.CLOSE_BUTTON);
}
super.onCloseButtonClicked();
}
/**
* Create and show the Reader Mode {@link InfoBar}.
* @param tab The tab that the {@link InfoBar} should be shown in.
*/
public static void showReaderModeInfoBar(Tab tab, ReaderModeManager manager) {
ReaderModeInfoBarJni.get().create(tab, manager);
}
/** @return The {@link ReaderModeManager} for this infobar. */
private ReaderModeManager getReaderModeManager() {
if (getNativeInfoBarPtr() == 0) return null;
return ReaderModeInfoBarJni.get().getReaderModeManager(getNativeInfoBarPtr());
}
/**
* @return An instance of the {@link ReaderModeInfoBar}.
*/
@CalledByNative
private static ReaderModeInfoBar create() {
return new ReaderModeInfoBar();
}
@NativeMethods
interface Natives {
void create(Tab tab, ReaderModeManager manager);
ReaderModeManager getReaderModeManager(long nativeReaderModeInfoBar);
}
}