Index: shell/android/intent_receiver_manager_impl.cc |
diff --git a/shell/android/intent_receiver_manager_impl.cc b/shell/android/intent_receiver_manager_impl.cc |
index 2012806235a55a7dbc47a3121c0b858b7448a565..03503a0b38b40f2f5095c01a96a285e272957e8b 100644 |
--- a/shell/android/intent_receiver_manager_impl.cc |
+++ b/shell/android/intent_receiver_manager_impl.cc |
@@ -21,8 +21,10 @@ mojo::Array<uint8_t> BufferToArray(JNIEnv* env, jobject buffer) { |
class IntentDispatcher : public mojo::ErrorHandler { |
public: |
- IntentDispatcher(intent_receiver::IntentReceiverPtr intent_receiver) |
- : intent_receiver_(intent_receiver.Pass()) { |
+ enum LifeCycle { Persistent, OneShot }; |
+ IntentDispatcher(intent_receiver::IntentReceiverPtr intent_receiver, |
+ LifeCycle life_cycle) |
+ : intent_receiver_(intent_receiver.Pass()), life_cycle_(life_cycle) { |
intent_receiver_.set_error_handler(this); |
} |
@@ -34,6 +36,8 @@ class IntentDispatcher : public mojo::ErrorHandler { |
void OnIntentReceived(JNIEnv* env, jobject intent) { |
intent_receiver_->OnIntent(BufferToArray(env, intent)); |
+ if (life_cycle_ == OneShot) |
+ delete this; |
} |
private: |
@@ -44,6 +48,7 @@ class IntentDispatcher : public mojo::ErrorHandler { |
} |
intent_receiver::IntentReceiverPtr intent_receiver_; |
+ LifeCycle life_cycle_; |
}; |
} // namespace |
@@ -53,14 +58,25 @@ void IntentReceiverManagerImpl::Bind( |
bindings_.AddBinding(this, request.Pass()); |
} |
-void IntentReceiverManagerImpl::RegisterReceiver( |
+void IntentReceiverManagerImpl::RegisterIntentReceiver( |
intent_receiver::IntentReceiverPtr receiver, |
- const RegisterReceiverCallback& callback) { |
+ const RegisterIntentReceiverCallback& callback) { |
JNIEnv* env = base::android::AttachCurrentThread(); |
base::android::ScopedJavaLocalRef<jobject> buffer = |
- Java_IntentReceiverRegistry_registerReceiver( |
- env, |
- reinterpret_cast<uintptr_t>(new IntentDispatcher(receiver.Pass()))); |
+ Java_IntentReceiverRegistry_registerIntentReceiver( |
+ env, reinterpret_cast<uintptr_t>(new IntentDispatcher( |
+ receiver.Pass(), IntentDispatcher::Persistent))); |
+ callback.Run(BufferToArray(env, buffer.obj())); |
+} |
+ |
+void IntentReceiverManagerImpl::RegisterActivityResultReceiver( |
+ intent_receiver::IntentReceiverPtr receiver, |
+ const RegisterActivityResultReceiverCallback& callback) { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ base::android::ScopedJavaLocalRef<jobject> buffer = |
+ Java_IntentReceiverRegistry_registerActivityResultReceiver( |
+ env, reinterpret_cast<uintptr_t>(new IntentDispatcher( |
+ receiver.Pass(), IntentDispatcher::Persistent))); |
callback.Run(BufferToArray(env, buffer.obj())); |
} |
@@ -71,10 +87,15 @@ bool RegisterIntentReceiverRegistry(JNIEnv* env) { |
void OnIntentReceived(JNIEnv* env, |
jclass jcaller, |
jlong intent_dispatcher_ptr, |
+ jboolean success, |
jobject intent) { |
IntentDispatcher* intent_dispatcher = |
reinterpret_cast<IntentDispatcher*>(intent_dispatcher_ptr); |
+ if (success) { |
intent_dispatcher->OnIntentReceived(env, intent); |
+ } else { |
+ delete intent_dispatcher; |
+ } |
} |
} // namespace shell |