| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_MESSAGES_ANDROID_MESSAGE_WRAPPER_H_ |
| #define COMPONENTS_MESSAGES_ANDROID_MESSAGE_WRAPPER_H_ |
| |
| #include <jni.h> |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/android/scoped_java_ref.h" |
| #include "base/functional/callback.h" |
| #include "components/messages/android/message_enums.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| |
| namespace messages { |
| |
| // |MessagesWrapper| represents a message for native feature code. It accepts |
| // callbacks for action and dismiss events and provides methods for setting |
| // message properties. After setting message's properties feature code can |
| // enqueue the message through |MessageDispatcherBridge|. |
| class MessageWrapper { |
| public: |
| using DismissCallback = base::OnceCallback<void(DismissReason)>; |
| using SecondaryMenuItemSelectedCallback = base::RepeatingCallback<void(int)>; |
| |
| // ActionCallback and DismissCallback default to base::NullCallback. |
| // Normally constructor with callbacks should be used, but this one is useful |
| // in situations when dismiss callback needs to be set after MessageWrapper |
| // creation because MessageWrapper instance needs to be bound to the callback. |
| MessageWrapper(MessageIdentifier message_identifier); |
| MessageWrapper(MessageIdentifier message_identifier, |
| base::OnceClosure action_callback, |
| DismissCallback dismiss_callback); |
| ~MessageWrapper(); |
| |
| MessageWrapper(const MessageWrapper&) = delete; |
| MessageWrapper& operator=(const MessageWrapper&) = delete; |
| |
| // Methods to manipulate message properties. On Android the values are |
| // propagated to Java and stored in |PropertyModel|. |
| std::u16string GetTitle(); |
| void SetTitle(const std::u16string& title); |
| std::u16string GetDescription(); |
| void SetDescription(const std::u16string& description); |
| |
| // SetDescriptionMaxLines allows limiting description view to the specified |
| // number of lines. The description will be ellipsized with TruncateAt.END |
| // option. |
| int GetDescriptionMaxLines(); |
| void SetDescriptionMaxLines(int max_lines); |
| std::u16string GetPrimaryButtonText(); |
| void SetPrimaryButtonText(const std::u16string& primary_button_text); |
| int GetPrimaryButtonTextMaxLines(); |
| void SetPrimaryButtonTextMaxLines(int max_lines); |
| std::u16string GetSecondaryButtonMenuText(); |
| void SetSecondaryButtonMenuText( |
| const std::u16string& secondary_button_menu_text); |
| |
| // Methods to manage secondary menu items. |
| void SetSecondaryMenuMaxSize(SecondaryMenuMaxSize max_size); |
| void AddSecondaryMenuItem(int item_id, |
| int resource_id, |
| const std::u16string& item_text); |
| void AddSecondaryMenuItem(int item_id, |
| int resource_id, |
| const std::u16string& item_text, |
| const std::u16string& item_description); |
| void ClearSecondaryMenuItems(); |
| void AddSecondaryMenuItemDivider(); |
| |
| // When setting a message icon use ResourceMapper::MapToJavaDrawableId to |
| // translate from chromium resource_id to Android drawable resource_id. |
| int GetIconResourceId(); |
| void SetIconResourceId(int resource_id); |
| bool IsValidIcon(); |
| void SetIcon(const SkBitmap& icon); |
| void EnableLargeIcon(bool enabled); |
| void SetIconRoundedCornerRadius(int radius); |
| // The icon is tinted to default_icon_color_accent1 by default. |
| // Call this method to display icons of original colors. |
| void DisableIconTint(); |
| int GetSecondaryIconResourceId(); |
| void SetSecondaryIconResourceId(int resource_id); |
| |
| void SetSecondaryActionCallback(base::RepeatingClosure callback); |
| void SetSecondaryMenuItemSelectedCallback( |
| base::RepeatingCallback<void(int)> callback); |
| |
| void SetDuration(long customDuration); |
| |
| // Note that the message will immediately be dismissed after the primary |
| // action callback is run. Making the message remain visible after the primary |
| // action button is clicked is supported in the messages API in Java, but not |
| // currently in here in the messages API in C++. |
| void SetActionClick(base::OnceClosure callback); |
| void SetDismissCallback(DismissCallback callback); |
| |
| // Following methods forward calls from java to provided callbacks. |
| void HandleActionClick(JNIEnv* env); |
| void HandleSecondaryActionClick(JNIEnv* env); |
| void HandleSecondaryMenuItemSelected(JNIEnv* env, int item_id); |
| void HandleDismissCallback(JNIEnv* env, int dismiss_reason); |
| |
| const base::android::JavaRef<jobject>& GetJavaMessageWrapper() const; |
| |
| // Called by the bridge when the message is successfully enqueued. |
| // WindowAndroid reference is retained and used for locating MessageDispatcher |
| // instance when the message is dismissed. |
| void SetMessageEnqueued( |
| const base::android::JavaRef<jobject>& java_window_android); |
| |
| const base::android::JavaRef<jobject>& java_window_android() { |
| return java_window_android_; |
| } |
| |
| const SkBitmap GetIconBitmap(); |
| |
| private: |
| base::android::ScopedJavaGlobalRef<jobject> java_message_wrapper_; |
| base::OnceClosure action_callback_; |
| base::RepeatingClosure secondary_action_callback_; |
| SecondaryMenuItemSelectedCallback secondary_menu_item_selected_callback_; |
| DismissCallback dismiss_callback_; |
| // True if message is in queue. |
| bool message_enqueued_; |
| base::android::ScopedJavaGlobalRef<jobject> java_window_android_; |
| |
| SecondaryMenuMaxSize secondary_menu_max_size_ = SecondaryMenuMaxSize::SMALL; |
| }; |
| |
| } // namespace messages |
| |
| #endif // COMPONENTS_MESSAGES_ANDROID_MESSAGE_WRAPPER_H_ |