xref: /aosp_15_r20/external/cronet/base/android/input_hint_checker.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/android/input_hint_checker.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/base_jni/InputHintChecker_jni.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial_params.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace base::android {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker bool g_input_hint_enabled;
18*6777b538SAndroid Build Coastguard Worker base::TimeDelta g_poll_interval;
19*6777b538SAndroid Build Coastguard Worker InputHintChecker* g_test_instance;
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker }  // namespace
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker // Whether to fetch the input hint from the system. When disabled, pretends
24*6777b538SAndroid Build Coastguard Worker // that no input is ever queued.
25*6777b538SAndroid Build Coastguard Worker BASE_EXPORT
26*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kYieldWithInputHint,
27*6777b538SAndroid Build Coastguard Worker              "YieldWithInputHint",
28*6777b538SAndroid Build Coastguard Worker              base::FEATURE_DISABLED_BY_DEFAULT);
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker // Min time delta between checks for the input hint. Must be a smaller than
31*6777b538SAndroid Build Coastguard Worker // time to produce a frame, but a bit longer than the time it takes to retrieve
32*6777b538SAndroid Build Coastguard Worker // the hint.
33*6777b538SAndroid Build Coastguard Worker const base::FeatureParam<int> kPollIntervalMillisParam{&kYieldWithInputHint,
34*6777b538SAndroid Build Coastguard Worker                                                        "poll_interval_ms", 3};
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker // static
InitializeFeatures()37*6777b538SAndroid Build Coastguard Worker void InputHintChecker::InitializeFeatures() {
38*6777b538SAndroid Build Coastguard Worker   bool is_enabled = base::FeatureList::IsEnabled(kYieldWithInputHint);
39*6777b538SAndroid Build Coastguard Worker   g_input_hint_enabled = is_enabled;
40*6777b538SAndroid Build Coastguard Worker   if (is_enabled) {
41*6777b538SAndroid Build Coastguard Worker     g_poll_interval = Milliseconds(kPollIntervalMillisParam.Get());
42*6777b538SAndroid Build Coastguard Worker   }
43*6777b538SAndroid Build Coastguard Worker }
44*6777b538SAndroid Build Coastguard Worker 
HasInputImplWithThrottling()45*6777b538SAndroid Build Coastguard Worker bool InputHintChecker::HasInputImplWithThrottling() {
46*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
47*6777b538SAndroid Build Coastguard Worker   auto now = base::TimeTicks::Now();
48*6777b538SAndroid Build Coastguard Worker   if (last_checked_.is_null() || (now - last_checked_) >= g_poll_interval) {
49*6777b538SAndroid Build Coastguard Worker     last_checked_ = now;
50*6777b538SAndroid Build Coastguard Worker     // TODO(pasko): Implement fetching the hint from the system.
51*6777b538SAndroid Build Coastguard Worker     return false;
52*6777b538SAndroid Build Coastguard Worker   }
53*6777b538SAndroid Build Coastguard Worker   return false;
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker 
SetView(JNIEnv * env,jobject root_view)56*6777b538SAndroid Build Coastguard Worker void InputHintChecker::SetView(JNIEnv* env, jobject root_view) {
57*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
58*6777b538SAndroid Build Coastguard Worker   view_ = JavaObjectWeakGlobalRef(env, root_view);
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker // static
HasInput()62*6777b538SAndroid Build Coastguard Worker bool InputHintChecker::HasInput() {
63*6777b538SAndroid Build Coastguard Worker   if (!g_input_hint_enabled) {
64*6777b538SAndroid Build Coastguard Worker     return false;
65*6777b538SAndroid Build Coastguard Worker   }
66*6777b538SAndroid Build Coastguard Worker   return GetInstance().HasInputImplWithThrottling();
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker 
GetInstance()69*6777b538SAndroid Build Coastguard Worker InputHintChecker& InputHintChecker::GetInstance() {
70*6777b538SAndroid Build Coastguard Worker   static NoDestructor<InputHintChecker> checker;
71*6777b538SAndroid Build Coastguard Worker   if (g_test_instance) {
72*6777b538SAndroid Build Coastguard Worker     return *g_test_instance;
73*6777b538SAndroid Build Coastguard Worker   }
74*6777b538SAndroid Build Coastguard Worker   return *checker.get();
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker 
ScopedOverrideInstance(InputHintChecker * checker)77*6777b538SAndroid Build Coastguard Worker InputHintChecker::ScopedOverrideInstance::ScopedOverrideInstance(
78*6777b538SAndroid Build Coastguard Worker     InputHintChecker* checker) {
79*6777b538SAndroid Build Coastguard Worker   g_test_instance = checker;
80*6777b538SAndroid Build Coastguard Worker }
81*6777b538SAndroid Build Coastguard Worker 
~ScopedOverrideInstance()82*6777b538SAndroid Build Coastguard Worker InputHintChecker::ScopedOverrideInstance::~ScopedOverrideInstance() {
83*6777b538SAndroid Build Coastguard Worker   g_test_instance = nullptr;
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker 
JNI_InputHintChecker_SetView(_JNIEnv * env,const JavaParamRef<jobject> & v)86*6777b538SAndroid Build Coastguard Worker void JNI_InputHintChecker_SetView(_JNIEnv* env,
87*6777b538SAndroid Build Coastguard Worker                                   const JavaParamRef<jobject>& v) {
88*6777b538SAndroid Build Coastguard Worker   InputHintChecker::GetInstance().SetView(env, v.obj());
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker }  // namespace base::android
92