blob: 7fd2f537900f805c5a17eedbc0f357906f6200ac [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/quick_delete/quick_delete_bridge.h"
#include "base/android/jni_string.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/hats/hats_service.h"
#include "chrome/browser/ui/hats/hats_service_factory.h"
#include "chrome/browser/ui/hats/survey_config.h"
#include "chrome/grit/generated_resources.h"
#include "components/browsing_data/core/browsing_data_utils.h"
#include "components/history/core/browser/history_service.h"
#include "components/keyed_service/core/service_access_type.h"
#include "content/public/browser/web_contents.h"
#include "ui/base/l10n/l10n_util.h"
// Must come after all headers that specialize FromJniType() / ToJniType().
#include "chrome/browser/quick_delete/jni_headers/QuickDeleteBridge_jni.h"
using base::android::AttachCurrentThread;
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using base::android::JavaRef;
using base::android::ScopedJavaGlobalRef;
namespace {
struct QuickDeleteDomainResult {
std::string last_visited_domain;
size_t domain_count;
};
QuickDeleteDomainResult GetLastVisitedDomainAndUniqueDomainCountFromResult(
const history::DomainsVisitedResult& result) {
if (result.all_visited_domains.empty()) {
return {"", 0};
}
return {result.all_visited_domains.front(),
result.all_visited_domains.size()};
}
} // namespace
QuickDeleteBridge::QuickDeleteBridge(Profile* profile) {
profile_ = profile;
history_service_ = HistoryServiceFactory::GetForProfile(
profile_, ServiceAccessType::EXPLICIT_ACCESS);
}
QuickDeleteBridge::~QuickDeleteBridge() = default;
void QuickDeleteBridge::Destroy(JNIEnv* env) {
delete this;
}
void QuickDeleteBridge::GetLastVisitedDomainAndUniqueDomainCount(
JNIEnv* env,
const jint time_period,
const JavaParamRef<jobject>& j_callback) {
browsing_data::TimePeriod period =
static_cast<browsing_data::TimePeriod>(time_period);
base::Time begin_time = CalculateBeginDeleteTime(period);
base::Time end_time = CalculateEndDeleteTime(period);
history_service_->GetUniqueDomainsVisited(
begin_time, end_time,
base::BindOnce(&QuickDeleteBridge::
OnGetLastVisitedDomainAndUniqueDomainCountComplete,
weak_ptr_factory_.GetWeakPtr(),
ScopedJavaGlobalRef<jobject>(j_callback)),
&task_tracker_);
}
// TODO(crbug.com/40255099) use rvalue reference to pass the result and define
// copy ctor and copy assignment in history::DomainsVisitedResult.
void QuickDeleteBridge::OnGetLastVisitedDomainAndUniqueDomainCountComplete(
const JavaRef<jobject>& j_callback,
history::DomainsVisitedResult result) {
JNIEnv* env = AttachCurrentThread();
QuickDeleteDomainResult quickDeleteResult =
GetLastVisitedDomainAndUniqueDomainCountFromResult(std::move(result));
Java_QuickDeleteBridge_onLastVisitedDomainAndUniqueDomainCountReady(
env, j_callback,
ConvertUTF8ToJavaString(env, quickDeleteResult.last_visited_domain),
quickDeleteResult.domain_count);
}
static jlong JNI_QuickDeleteBridge_Init(JNIEnv* env,
Profile* profile) {
QuickDeleteBridge* bridge = new QuickDeleteBridge(profile);
return reinterpret_cast<intptr_t>(bridge);
}