jni_notification_presenter.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "remoting/client/jni/jni_notification_presenter.h"
  5. #include "base/android/jni_android.h"
  6. #include "base/android/jni_string.h"
  7. #include "base/bind.h"
  8. #include "base/threading/sequenced_task_runner_handle.h"
  9. #include "remoting/android/jni_headers/NotificationPresenter_jni.h"
  10. #include "remoting/client/chromoting_client_runtime.h"
  11. #include "remoting/client/notification/notification_message.h"
  12. using base::android::ConvertJavaStringToUTF8;
  13. using base::android::ConvertUTF8ToJavaString;
  14. namespace remoting {
  15. JniNotificationPresenter::JniNotificationPresenter(
  16. const JavaObjectWeakGlobalRef& java_presenter)
  17. : java_presenter_(java_presenter),
  18. notification_client_(
  19. ChromotingClientRuntime::GetInstance()->network_task_runner()),
  20. sequence_(base::SequencedTaskRunnerHandle::Get()) {}
  21. JniNotificationPresenter::~JniNotificationPresenter() {
  22. DCHECK(sequence_->RunsTasksInCurrentSequence());
  23. }
  24. void JniNotificationPresenter::FetchNotification(
  25. JNIEnv* env,
  26. const base::android::JavaParamRef<jstring>& username) {
  27. DCHECK(sequence_->RunsTasksInCurrentSequence());
  28. std::string username_str = ConvertJavaStringToUTF8(env, username);
  29. // Safe to use unretained: callback is dropped once client is deleted.
  30. notification_client_.GetNotification(
  31. username_str,
  32. base::BindOnce(&JniNotificationPresenter::OnNotificationFetched,
  33. base::Unretained(this)));
  34. }
  35. void JniNotificationPresenter::Destroy(JNIEnv* env) {
  36. if (sequence_->RunsTasksInCurrentSequence()) {
  37. delete this;
  38. } else {
  39. sequence_->DeleteSoon(FROM_HERE, this);
  40. }
  41. }
  42. void JniNotificationPresenter::OnNotificationFetched(
  43. absl::optional<NotificationMessage> notification) {
  44. DCHECK(sequence_->RunsTasksInCurrentSequence());
  45. JNIEnv* env = base::android::AttachCurrentThread();
  46. auto java_presenter = java_presenter_.get(env);
  47. if (!notification) {
  48. Java_NotificationPresenter_onNoNotification(env, java_presenter);
  49. return;
  50. }
  51. auto j_message_id = ConvertUTF8ToJavaString(env, notification->message_id);
  52. auto j_message_text =
  53. ConvertUTF8ToJavaString(env, notification->message_text);
  54. auto j_link_text = ConvertUTF8ToJavaString(env, notification->link_text);
  55. auto j_link_url = ConvertUTF8ToJavaString(env, notification->link_url);
  56. auto j_allow_silence = notification->allow_silence;
  57. Java_NotificationPresenter_onNotificationFetched(
  58. env, java_presenter, j_message_id, j_message_text, j_link_text,
  59. j_link_url, j_allow_silence);
  60. }
  61. static jlong JNI_NotificationPresenter_Init(
  62. JNIEnv* env,
  63. const base::android::JavaParamRef<jobject>& java_presenter) {
  64. return reinterpret_cast<intptr_t>(new JniNotificationPresenter(
  65. JavaObjectWeakGlobalRef(env, java_presenter)));
  66. }
  67. } // namespace remoting