Skip to content

Commit

Permalink
webfeed: Add JNI for unread content observer
Browse files Browse the repository at this point in the history
Bug: 1152592
Change-Id: I1b1454b6fa492d51953226ca165f2eb24d3a7702
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2848182
Reviewed-by: Carlos Knippschild <carlosk@chromium.org>
Commit-Queue: Dan H <harringtond@chromium.org>
Cr-Commit-Position: refs/heads/master@{#875903}
  • Loading branch information
Dan Harrington authored and Chromium LUCI CQ committed Apr 23, 2021
1 parent 4568869 commit 5105d11
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 7 deletions.
52 changes: 45 additions & 7 deletions chrome/browser/android/feed/v2/feed_service_bridge.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/check_op.h"
#include "base/time/time.h"
#include "chrome/browser/android/feed/v2/feed_service_factory.h"
Expand All @@ -32,6 +33,13 @@ FeedService* GetFeedService() {
return FeedServiceFactory::GetForBrowserContext(profile);
}

FeedApi* GetFeedApi() {
FeedService* service = GetFeedService();
if (!service)
return nullptr;
return service->GetStream();
}

} // namespace

static jboolean JNI_FeedServiceBridge_IsEnabled(JNIEnv* env) {
Expand All @@ -55,19 +63,18 @@ static int JNI_FeedServiceBridge_GetLoadMoreTriggerScrollDistanceDp(

static void JNI_FeedServiceBridge_ReportOpenVisitComplete(JNIEnv* env,
jlong visitTimeMs) {
FeedService* service = GetFeedService();
if (!service)
FeedApi* api = GetFeedApi();
if (!api)
return;
service->GetStream()->ReportOpenVisitComplete(
base::TimeDelta::FromMilliseconds(visitTimeMs));
api->ReportOpenVisitComplete(base::TimeDelta::FromMilliseconds(visitTimeMs));
}

static base::android::ScopedJavaLocalRef<jstring>
JNI_FeedServiceBridge_GetClientInstanceId(JNIEnv* env) {
FeedService* service = GetFeedService();
std::string instance_id;
if (service) {
instance_id = service->GetStream()->GetClientInstanceId();
FeedApi* api = GetFeedApi();
if (api) {
instance_id = api->GetClientInstanceId();
}
return base::android::ConvertUTF8ToJavaString(env, instance_id);
}
Expand All @@ -87,6 +94,20 @@ static jlong JNI_FeedServiceBridge_GetReliabilityLoggingId(JNIEnv* env) {
return FeedServiceBridge::GetReliabilityLoggingId();
}

static jlong JNI_FeedServiceBridge_AddUnreadContentObserver(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& j_observer,
jboolean is_web_feed) {
FeedApi* api = GetFeedApi();
if (!api)
return 0;
JavaUnreadContentObserver* observer = new JavaUnreadContentObserver(
base::android::ScopedJavaGlobalRef<jobject>(j_observer));
api->AddUnreadContentObserver(is_web_feed ? kWebFeedStream : kForYouStream,
observer);
return reinterpret_cast<jlong>(observer);
}

std::string FeedServiceBridge::GetLanguageTag() {
JNIEnv* env = base::android::AttachCurrentThread();
return ConvertJavaStringToUTF8(env,
Expand Down Expand Up @@ -134,4 +155,21 @@ uint64_t FeedServiceBridge::GetReliabilityLoggingId() {
g_browser_process->metrics_service()->GetClientId(), profile_prefs);
}

JavaUnreadContentObserver::JavaUnreadContentObserver(
base::android::ScopedJavaGlobalRef<jobject> j_observer)
: obj_(j_observer) {}

feed::JavaUnreadContentObserver::~JavaUnreadContentObserver() = default;

void JavaUnreadContentObserver::HasUnreadContentChanged(
bool has_unread_content) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_UnreadContentObserver_hasUnreadContentChanged(env, obj_,
has_unread_content);
}

void JavaUnreadContentObserver::Destroy(JNIEnv*) {
delete this;
}

} // namespace feed
15 changes: 15 additions & 0 deletions chrome/browser/android/feed/v2/feed_service_bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

#include <string>

#include "base/android/jni_android.h"
#include "components/feed/core/v2/public/feed_api.h"
#include "components/feed/core/v2/public/types.h"

namespace feed {
Expand All @@ -22,6 +24,19 @@ class FeedServiceBridge {
static uint64_t GetReliabilityLoggingId();
};

class JavaUnreadContentObserver : public FeedApi::UnreadContentObserver {
public:
JavaUnreadContentObserver(
base::android::ScopedJavaGlobalRef<jobject> j_observer);
~JavaUnreadContentObserver() override;

void HasUnreadContentChanged(bool has_unread_content) override;
void Destroy(JNIEnv*);

private:
base::android::ScopedJavaGlobalRef<jobject> obj_;
};

} // namespace feed

#endif // CHROME_BROWSER_ANDROID_FEED_V2_FEED_SERVICE_BRIDGE_H_
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeClassQualifiedName;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.xsurface.ImagePrefetcher;
import org.chromium.chrome.browser.xsurface.ProcessScope;
Expand Down Expand Up @@ -126,6 +127,33 @@ public static long getReliabilityLoggingId() {
return FeedServiceBridgeJni.get().getReliabilityLoggingId();
}

/** Observes whether or not the Feed stream contains unread content */
public static class UnreadContentObserver {
private long mNativePtr;

/**
* Begins observing.
*
* @param isWebFeed Whether to observe the Web Feed, or the For-you Feed.
*/
UnreadContentObserver(boolean isWebFeed) {
mNativePtr = FeedServiceBridgeJni.get().addUnreadContentObserver(this, isWebFeed);
}

/** Stops observing. Must be called when this observer is no longer needed */
public void destroy() {
FeedServiceBridgeJni.get().destroy(mNativePtr);
mNativePtr = 0;
}

/**
* Called to signal whether unread content is available. Called once after the observer is
* initialized, and after that, called each time unread content status changes.
*/
@CalledByNative("UnreadContentObserver")
public void hasUnreadContentChanged(boolean hasUnreadContent) {}
}

@NativeMethods
public interface Natives {
boolean isEnabled();
Expand All @@ -137,5 +165,8 @@ public interface Natives {
int getVideoPreviewsTypePreference();
void setVideoPreviewsTypePreference(int videoPreviewsType);
long getReliabilityLoggingId();
long addUnreadContentObserver(Object object, boolean isWebFeed);
@NativeClassQualifiedName("feed::JavaUnreadContentObserver")
void destroy(long nativePtr);
}
}

0 comments on commit 5105d11

Please sign in to comment.