// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_ANDROID_INPUT_HINT_CHECKER_H_ #define BASE_ANDROID_INPUT_HINT_CHECKER_H_ #include "base/android/jni_weak_ref.h" #include "base/base_export.h" #include "base/feature_list.h" #include "base/memory/raw_ptr.h" #include "base/no_destructor.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" namespace base::android { BASE_DECLARE_FEATURE(kYieldWithInputHint); // A class to track a single global root View object and ask it for presence of // new unhandled input events. // // This class uses bits specific to Android V and does nothing on earlier // releases. // // Must be constructed on UI thread. All public methods must be called on the UI // thread. class BASE_EXPORT InputHintChecker { public: InputHintChecker() = default; virtual ~InputHintChecker() = default; // Returns the singleton. static InputHintChecker& GetInstance(); // Initializes features for this class. See `base::features::Init()`. static void InitializeFeatures(); // Obtains a weak reference to |root_view| so that the following calls to // HasInput() take the input hint for this View. Requirements for the View // object are described in InputHintChecker.java. void SetView(JNIEnv* env, jobject root_view); // Fetches and returns the input hint from the Android Framework. Throttles // the calls to one every few milliseconds. When a call is made before the // minimal time interval passed since the previous call, returns false. static bool HasInput(); // RAII override of GetInstance() for testing. struct ScopedOverrideInstance { explicit ScopedOverrideInstance(InputHintChecker* checker); ~ScopedOverrideInstance(); }; protected: virtual bool HasInputImplWithThrottling(); private: friend class base::NoDestructor; JavaObjectWeakGlobalRef view_; THREAD_CHECKER(thread_checker_); base::TimeTicks last_checked_; }; } // namespace base::android #endif // BASE_ANDROID_INPUT_HINT_CHECKER_H_