blob: 21901238d7871c8407e6d249a498c460091ed3cb [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 "base/strings/utf_string_conversions.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/sync_service_factory.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/browsing_data/core/counters/history_counter.h"
#include "components/history/core/browser/history_service.h"
#include "components/history/core/browser/history_types.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::ConvertUTF16ToJavaString;
using base::android::JavaParamRef;
using base::android::JavaRef;
using base::android::ScopedJavaGlobalRef;
namespace {
struct QuickDeleteDomainResult {
std::u16string last_visited_domain;
int domain_count;
};
QuickDeleteDomainResult GetLastVisitedDomainAndUniqueDomainCountFromResult(
const browsing_data::HistoryCounter::HistoryResult* result) {
browsing_data::BrowsingDataCounter::ResultInt unique_domains_count =
result->unique_domains_result();
std::u16string last_visited_domain =
base::UTF8ToUTF16(result->last_visited_domain());
// Subtract one from the unique_domains_count since one of the domains will be
// shown as the last_visited_domain.
if (unique_domains_count > 0) {
CHECK(!last_visited_domain.empty());
unique_domains_count--;
}
return {last_visited_domain, static_cast<int>(unique_domains_count)};
}
} // namespace
QuickDeleteBridge::QuickDeleteBridge(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
Profile* profile)
: jobject_(obj) {
profile_ = profile;
history_counter_ = std::make_unique<browsing_data::HistoryCounter>(
HistoryServiceFactory::GetForProfile(profile_,
ServiceAccessType::EXPLICIT_ACCESS),
browsing_data::HistoryCounter::GetUpdatedWebHistoryServiceCallback(),
SyncServiceFactory::GetForProfile(profile_));
base::Time begin_time =
CalculateBeginDeleteTime(browsing_data::TimePeriod::LAST_15_MINUTES);
history_counter_->InitWithoutPeriodPref(
profile_->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
begin_time,
base::BindRepeating(&QuickDeleteBridge::OnHistoryCounterResult,
weak_ptr_factory_.GetWeakPtr()));
}
QuickDeleteBridge::~QuickDeleteBridge() = default;
void QuickDeleteBridge::Destroy(JNIEnv* env) {
delete this;
}
void QuickDeleteBridge::RestartCounterForTimePeriod(JNIEnv* env,
const jint time_period) {
browsing_data::TimePeriod period =
static_cast<browsing_data::TimePeriod>(time_period);
base::Time begin_time = CalculateBeginDeleteTime(period);
history_counter_->SetBeginTime(begin_time);
}
void QuickDeleteBridge::OnHistoryCounterResult(
std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result) {
JNIEnv* env = AttachCurrentThread();
if (!result->Finished()) {
return;
}
QuickDeleteDomainResult quickDeleteResult =
GetLastVisitedDomainAndUniqueDomainCountFromResult(
static_cast<const browsing_data::HistoryCounter::HistoryResult*>(
result.get()));
Java_QuickDeleteBridge_onLastVisitedDomainAndUniqueDomainCountReady(
env, jobject_,
ConvertUTF16ToJavaString(env, quickDeleteResult.last_visited_domain),
quickDeleteResult.domain_count);
}
static jlong JNI_QuickDeleteBridge_Init(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
Profile* profile) {
QuickDeleteBridge* bridge = new QuickDeleteBridge(env, obj, profile);
return reinterpret_cast<intptr_t>(bridge);
}