xref: /aosp_15_r20/external/cronet/base/android/input_hint_checker.h (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 #ifndef BASE_ANDROID_INPUT_HINT_CHECKER_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_ANDROID_INPUT_HINT_CHECKER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_weak_ref.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace base::android {
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker BASE_DECLARE_FEATURE(kYieldWithInputHint);
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker // A class to track a single global root View object and ask it for presence of
21*6777b538SAndroid Build Coastguard Worker // new unhandled input events.
22*6777b538SAndroid Build Coastguard Worker //
23*6777b538SAndroid Build Coastguard Worker // This class uses bits specific to Android V and does nothing on earlier
24*6777b538SAndroid Build Coastguard Worker // releases.
25*6777b538SAndroid Build Coastguard Worker //
26*6777b538SAndroid Build Coastguard Worker // Must be constructed on UI thread. All public methods must be called on the UI
27*6777b538SAndroid Build Coastguard Worker // thread.
28*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT InputHintChecker {
29*6777b538SAndroid Build Coastguard Worker  public:
30*6777b538SAndroid Build Coastguard Worker   InputHintChecker() = default;
31*6777b538SAndroid Build Coastguard Worker   virtual ~InputHintChecker() = default;
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   // Returns the singleton.
34*6777b538SAndroid Build Coastguard Worker   static InputHintChecker& GetInstance();
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker   // Initializes features for this class. See `base::features::Init()`.
37*6777b538SAndroid Build Coastguard Worker   static void InitializeFeatures();
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   // Obtains a weak reference to |root_view| so that the following calls to
40*6777b538SAndroid Build Coastguard Worker   // HasInput() take the input hint for this View. Requirements for the View
41*6777b538SAndroid Build Coastguard Worker   // object are described in InputHintChecker.java.
42*6777b538SAndroid Build Coastguard Worker   void SetView(JNIEnv* env, jobject root_view);
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   // Fetches and returns the input hint from the Android Framework. Throttles
45*6777b538SAndroid Build Coastguard Worker   // the calls to one every few milliseconds. When a call is made before the
46*6777b538SAndroid Build Coastguard Worker   // minimal time interval passed since the previous call, returns false.
47*6777b538SAndroid Build Coastguard Worker   static bool HasInput();
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker   // RAII override of GetInstance() for testing.
50*6777b538SAndroid Build Coastguard Worker   struct ScopedOverrideInstance {
51*6777b538SAndroid Build Coastguard Worker     explicit ScopedOverrideInstance(InputHintChecker* checker);
52*6777b538SAndroid Build Coastguard Worker     ~ScopedOverrideInstance();
53*6777b538SAndroid Build Coastguard Worker   };
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker  protected:
56*6777b538SAndroid Build Coastguard Worker   virtual bool HasInputImplWithThrottling();
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker  private:
59*6777b538SAndroid Build Coastguard Worker   friend class base::NoDestructor<InputHintChecker>;
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker   JavaObjectWeakGlobalRef view_;
62*6777b538SAndroid Build Coastguard Worker   THREAD_CHECKER(thread_checker_);
63*6777b538SAndroid Build Coastguard Worker   base::TimeTicks last_checked_;
64*6777b538SAndroid Build Coastguard Worker };
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker }  // namespace base::android
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker #endif  // BASE_ANDROID_INPUT_HINT_CHECKER_H_
69