blob: 65e22e9e597cbec129485b69bc981ad52bac6060 [file] [log] [blame]
// Copyright 2022 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/feedback/android/family_info_feedback_source.h"
#include "base/android/jni_string.h"
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/notreached.h"
#include "chrome/browser/feedback/android/jni_headers/FamilyInfoFeedbackSource_jni.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "components/supervised_user/core/browser/proto/families_common.pb.h"
#include "content/public/browser/storage_partition.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
using base::android::AttachCurrentThread;
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
namespace chrome::android {
namespace {
// Create keys for Listnr/ feedback.
std::string RoleToString(kids_chrome_management::FamilyRole role) {
switch (role) {
case kids_chrome_management::CHILD:
return "child";
case kids_chrome_management::MEMBER:
return "member";
case kids_chrome_management::PARENT:
return "parent";
case kids_chrome_management::HEAD_OF_HOUSEHOLD:
return "family_manager";
default:
// Keep the previous semantics - other values were not allowed.
NOTREACHED_NORETURN();
}
}
} // namespace
void JNI_FamilyInfoFeedbackSource_Start(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobject>& j_profile) {
Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
FamilyInfoFeedbackSource* feedback_source =
new FamilyInfoFeedbackSource(obj, profile);
feedback_source->GetFamilyMembers();
}
FamilyInfoFeedbackSource::FamilyInfoFeedbackSource(
const JavaParamRef<jobject>& obj,
Profile* profile)
: supervised_user_service_(
SupervisedUserServiceFactory::GetForProfile(profile)),
identity_manager_(IdentityManagerFactory::GetForProfile(profile)),
url_loader_factory_(profile->GetDefaultStoragePartition()
->GetURLLoaderFactoryForBrowserProcess()),
java_ref_(obj) {}
FamilyInfoFeedbackSource::~FamilyInfoFeedbackSource() = default;
void FamilyInfoFeedbackSource::GetFamilyMembers() {
list_family_members_fetcher_ = FetchListFamilyMembers(
*identity_manager_, url_loader_factory_,
base::BindOnce(
&FamilyInfoFeedbackSource::OnResponse,
base::Unretained(this))); // Unretained(.) is safe because `this`
// owns `list_family_members_fetcher_`.
}
void FamilyInfoFeedbackSource::OnResponse(
supervised_user::ProtoFetcherStatus status,
std::unique_ptr<kids_chrome_management::ListFamilyMembersResponse>
response) {
if (!status.IsOk()) {
OnFailure(status);
return;
}
OnSuccess(*response);
// Release response.
}
void FamilyInfoFeedbackSource::OnSuccess(
const kids_chrome_management::ListFamilyMembersResponse& response) {
std::string primary_account_gaia =
identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
.gaia;
JNIEnv* env = AttachCurrentThread();
for (const kids_chrome_management::FamilyMember& member :
response.members()) {
// Store the family member role for the primary account of the profile.
if (primary_account_gaia == member.user_id()) {
// If a child is signed-in, report the parental control web filter.
ScopedJavaLocalRef<jstring> child_web_filter_type = nullptr;
if (member.role() == kids_chrome_management::CHILD) {
supervised_user::SupervisedUserURLFilter::WebFilterType
web_filter_type =
supervised_user_service_->GetURLFilter()->GetWebFilterType();
child_web_filter_type = ConvertUTF8ToJavaString(
env, supervised_user::SupervisedUserURLFilter::
WebFilterTypeToDisplayString(web_filter_type));
}
Java_FamilyInfoFeedbackSource_processPrimaryAccountFamilyInfo(
env, java_ref_,
ConvertUTF8ToJavaString(env, RoleToString(member.role())),
child_web_filter_type);
}
}
OnComplete();
}
void FamilyInfoFeedbackSource::OnFailure(
supervised_user::ProtoFetcherStatus status) {
DLOG(WARNING) << "ListFamilyMembers failed with status: "
<< status.ToString();
OnComplete();
}
void FamilyInfoFeedbackSource::OnComplete() {
// Object will delete itself following the fetch to ListFamilyMembers.
delete this;
}
} // namespace chrome::android