| 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
|
|
|