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