blob: 20e2e217513135b72355a73a76dd1755ec881115 [file] [log] [blame]
// Copyright 2018 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.
#include "chrome/browser/android/feed/feed_scheduler_bridge.h"
#include <utility>
#include "base/android/callback_android.h"
#include "base/android/jni_android.h"
#include "base/bind.h"
#include "base/time/time.h"
#include "chrome/android/chrome_jni_headers/FeedSchedulerBridge_jni.h"
#include "chrome/browser/android/feed/feed_host_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "components/feed/content/feed_host_service.h"
using base::android::JavaRef;
using base::android::JavaParamRef;
using base::android::ScopedJavaGlobalRef;
namespace feed {
static jlong JNI_FeedSchedulerBridge_Init(
JNIEnv* env,
const JavaParamRef<jobject>& j_this,
const JavaParamRef<jobject>& j_profile) {
Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
FeedHostService* host_service =
FeedHostServiceFactory::GetForBrowserContext(profile);
return reinterpret_cast<intptr_t>(
new FeedSchedulerBridge(j_this, host_service->GetSchedulerHost()));
}
FeedSchedulerBridge::FeedSchedulerBridge(const JavaRef<jobject>& j_this,
FeedSchedulerHost* scheduler_host)
: j_this_(ScopedJavaGlobalRef<jobject>(j_this)),
scheduler_host_(scheduler_host) {
DCHECK(scheduler_host_);
scheduler_host_->Initialize(
base::BindRepeating(&FeedSchedulerBridge::TriggerRefresh,
weak_factory_.GetWeakPtr()),
base::BindRepeating(&FeedSchedulerBridge::ScheduleWakeUp,
weak_factory_.GetWeakPtr()),
base::BindRepeating(&FeedSchedulerBridge::CancelWakeUp,
weak_factory_.GetWeakPtr()));
}
FeedSchedulerBridge::~FeedSchedulerBridge() = default;
void FeedSchedulerBridge::Destroy(JNIEnv* env, const JavaRef<jobject>& j_this) {
delete this;
}
jint FeedSchedulerBridge::ShouldSessionRequestData(
JNIEnv* env,
const JavaRef<jobject>& j_this,
const jboolean j_has_content,
const jlong j_content_creation_date_time_ms,
const jboolean j_has_outstanding_request) {
return static_cast<int>(scheduler_host_->ShouldSessionRequestData(
j_has_content, base::Time::FromJavaTime(j_content_creation_date_time_ms),
j_has_outstanding_request));
}
void FeedSchedulerBridge::OnReceiveNewContent(
JNIEnv* env,
const JavaRef<jobject>& j_this,
const jlong j_content_creation_date_time_ms) {
scheduler_host_->OnReceiveNewContent(
base::Time::FromJavaTime(j_content_creation_date_time_ms));
}
void FeedSchedulerBridge::OnRequestError(JNIEnv* env,
const JavaRef<jobject>& j_this,
const jint j_network_response_code) {
scheduler_host_->OnRequestError(j_network_response_code);
}
void FeedSchedulerBridge::OnForegrounded(JNIEnv* env,
const JavaRef<jobject>& j_this) {
scheduler_host_->OnForegrounded();
}
void FeedSchedulerBridge::OnFixedTimer(
JNIEnv* env,
const JavaRef<jobject>& j_this,
const base::android::JavaRef<jobject>& j_runnable) {
base::OnceClosure callback = base::BindOnce(
&FeedSchedulerBridge::FixedTimerHandlingDone, weak_factory_.GetWeakPtr(),
ScopedJavaGlobalRef<jobject>(j_runnable));
scheduler_host_->OnFixedTimer(std::move(callback));
}
void FeedSchedulerBridge::OnSuggestionConsumed(
JNIEnv* env,
const base::android::JavaRef<jobject>& j_this) {
scheduler_host_->OnSuggestionConsumed();
}
bool FeedSchedulerBridge::OnArticlesCleared(
JNIEnv* env,
const base::android::JavaRef<jobject>& j_this,
jboolean j_suppress_refreshes) {
return scheduler_host_->OnArticlesCleared(j_suppress_refreshes);
}
void FeedSchedulerBridge::TriggerRefresh() {
JNIEnv* env = base::android::AttachCurrentThread();
Java_FeedSchedulerBridge_triggerRefresh(env, j_this_);
}
void FeedSchedulerBridge::ScheduleWakeUp(base::TimeDelta threshold) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_FeedSchedulerBridge_scheduleWakeUp(env, j_this_,
threshold.InMilliseconds());
}
void FeedSchedulerBridge::CancelWakeUp() {
JNIEnv* env = base::android::AttachCurrentThread();
Java_FeedSchedulerBridge_cancelWakeUp(env, j_this_);
}
void FeedSchedulerBridge::FixedTimerHandlingDone(
ScopedJavaGlobalRef<jobject> j_runnable) {
base::android::RunRunnableAndroid(j_runnable);
}
} // namespace feed