blob: 96562d37d876dfbe0045a0b2ea1d32a4016b00c5 [file] [log] [blame]
// Copyright 2014 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.dom_distiller;
import android.app.Activity;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.chrome.browser.EmptyTabObserver;
import org.chromium.chrome.browser.Tab;
import org.chromium.chrome.browser.TabObserver;
import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
import org.chromium.content.browser.ContentViewCore;
import org.chromium.content_public.browser.WebContents;
/**
* Java implementation of dom_distiller::android::FeedbackReporterAndroid.
*/
@JNINamespace("dom_distiller::android")
public final class DomDistillerFeedbackReporter implements
DomDistillerFeedbackReportingView.FeedbackObserver {
private static ExternalFeedbackReporter sExternalFeedbackReporter =
new NoOpExternalFeedbackReporter();
public static void setExternalFeedbackReporter(ExternalFeedbackReporter reporter) {
sExternalFeedbackReporter = reporter;
}
private static class NoOpExternalFeedbackReporter implements ExternalFeedbackReporter {
@Override
public void reportFeedback(Activity activity, String url, boolean good) {
}
}
private final long mNativePointer;
private final Tab mTab;
private ContentViewCore mContentViewCore;
private DomDistillerFeedbackReportingView mReportingView;
/**
* @return whether the DOM Distiller feature is enabled.
*/
public static boolean isEnabled() {
return nativeIsEnabled();
}
/**
* Creates the FeedbackReporter, adds itself as a TabObserver, and ensures
* references to ContentView and WebContents are up to date.
*
* @param tab the tab where the overlay should be displayed.
*/
public DomDistillerFeedbackReporter(Tab tab) {
mNativePointer = nativeInit();
mTab = tab;
mTab.addObserver(createTabObserver());
updatePointers();
}
@Override
public void onYesPressed(DomDistillerFeedbackReportingView view) {
if (view != mReportingView) return;
recordQuality(true);
dismissOverlay();
}
@Override
public void onNoPressed(DomDistillerFeedbackReportingView view) {
if (view != mReportingView) return;
recordQuality(false);
dismissOverlay();
}
/**
* Records feedback for the distilled content.
*
* @param good whether the perceived quality of the distillation of a web page was good.
*/
private void recordQuality(boolean good) {
nativeReportQuality(good);
if (!good) {
Activity activity = mTab.getWindowAndroid().getActivity().get();
String url = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(
mContentViewCore.getUrl());
sExternalFeedbackReporter.reportFeedback(activity, url, good);
}
}
/**
* Start showing the overlay.
*/
@CalledByNative
private void showOverlay() {
mReportingView = DomDistillerFeedbackReportingView.create(mContentViewCore, this);
}
/**
* Dismiss the overlay which is currently being displayed.
*/
@CalledByNative
private void dismissOverlay() {
if (mReportingView != null) {
mReportingView.dismiss(true);
mReportingView = null;
}
}
/**
* Updates which ContentViewCore and WebContents the FeedbackReporter is monitoring.
*/
private void updatePointers() {
mContentViewCore = mTab.getContentViewCore();
nativeReplaceWebContents(mNativePointer, mTab.getWebContents());
}
/**
* Creates a TabObserver for monitoring a Tab, used to react to changes in the ContentViewCore
* or to trigger its own destruction.
*
* @return TabObserver that can be used to monitor a Tab.
*/
private TabObserver createTabObserver() {
return new EmptyTabObserver() {
@Override
public void onWebContentsSwapped(Tab tab, boolean didStartLoad,
boolean didFinishLoad) {
updatePointers();
}
@Override
public void onContentChanged(Tab tab) {
updatePointers();
}
@Override
public void onDestroyed(Tab tab) {
nativeDestroy(mNativePointer);
mContentViewCore = null;
}
};
}
private static native boolean nativeIsEnabled();
private static native void nativeReportQuality(boolean good);
private native long nativeInit();
private native void nativeDestroy(long nativeFeedbackReporterAndroid);
private native void nativeReplaceWebContents(
long nativeFeedbackReporterAndroid, WebContents webContents);
}