Chromium Code Reviews| Index: components/gcm_driver/instance_id/instance_id_android.cc |
| diff --git a/components/gcm_driver/instance_id/instance_id_android.cc b/components/gcm_driver/instance_id/instance_id_android.cc |
| index 5d8de6dc6cbe695e9a444ea603797a498e60a3dd..82230dbcc8fb8c3d54f8f34dd04d7500c882330a 100644 |
| --- a/components/gcm_driver/instance_id/instance_id_android.cc |
| +++ b/components/gcm_driver/instance_id/instance_id_android.cc |
| @@ -6,6 +6,8 @@ |
| #include <stdint.h> |
| +#include <memory> |
| + |
| #include "base/android/context_utils.h" |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_array.h" |
| @@ -75,29 +77,21 @@ InstanceIDAndroid::~InstanceIDAndroid() { |
| void InstanceIDAndroid::GetID(const GetIDCallback& callback) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + int32_t request_id = get_id_callbacks_.Add(new GetIDCallback(callback)); |
| + |
| JNIEnv* env = AttachCurrentThread(); |
| - std::string id = ConvertJavaStringToUTF8( |
| - Java_InstanceIDBridge_getId(env, java_ref_.obj())); |
| - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| - base::Bind(callback, id)); |
| + Java_InstanceIDBridge_getId(env, java_ref_.obj(), request_id); |
| } |
| void InstanceIDAndroid::GetCreationTime( |
| const GetCreationTimeCallback& callback) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + int32_t request_id = |
| + get_creation_time_callbacks_.Add(new GetCreationTimeCallback(callback)); |
| + |
| JNIEnv* env = AttachCurrentThread(); |
| - int64_t creation_time_unix_ms = |
| - Java_InstanceIDBridge_getCreationTime(env, java_ref_.obj()); |
| - base::Time creation_time; |
| - // If the InstanceID's getId, getToken and deleteToken methods have never been |
| - // called, or deleteInstanceID has cleared it since, creation time will be 0. |
| - if (creation_time_unix_ms) { |
| - creation_time = base::Time::UnixEpoch() + |
| - base::TimeDelta::FromMilliseconds(creation_time_unix_ms); |
| - } |
| - base::ThreadTaskRunnerHandle::Get()->PostTask( |
| - FROM_HERE, base::Bind(callback, creation_time)); |
| + Java_InstanceIDBridge_getCreationTime(env, java_ref_.obj(), request_id); |
| } |
| void InstanceIDAndroid::GetToken( |
| @@ -147,6 +141,41 @@ void InstanceIDAndroid::DeleteID(const DeleteIDCallback& callback) { |
| Java_InstanceIDBridge_deleteInstanceID(env, java_ref_.obj(), request_id); |
| } |
| +void InstanceIDAndroid::DidGetID( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& obj, |
| + jint request_id, |
| + const base::android::JavaParamRef<jstring>& jid) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + GetIDCallback* callback = get_id_callbacks_.Lookup(request_id); |
| + DCHECK(callback); |
| + callback->Run(ConvertJavaStringToUTF8(jid)); |
| + get_id_callbacks_.Remove(request_id); |
| +} |
| + |
| +void InstanceIDAndroid::DidGetCreationTime( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& obj, |
| + jint request_id, |
| + jlong creation_time_unix_ms) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + base::Time creation_time; |
| + // If the InstanceID's getId, getToken and deleteToken methods have never been |
| + // called, or deleteInstanceID has cleared it since, creation time will be 0. |
| + if (creation_time_unix_ms) { |
| + creation_time = base::Time::UnixEpoch() + |
| + base::TimeDelta::FromMilliseconds(creation_time_unix_ms); |
| + } |
| + |
| + GetCreationTimeCallback* callback = |
| + get_creation_time_callbacks_.Lookup(request_id); |
| + DCHECK(callback); |
| + callback->Run(creation_time); |
| + get_creation_time_callbacks_.Remove(request_id); |
| +} |
| + |
| void InstanceIDAndroid::DidGetToken( |
| JNIEnv* env, |
| const base::android::JavaParamRef<jobject>& obj, |
| @@ -182,10 +211,15 @@ void InstanceIDAndroid::DidDeleteID( |
| jboolean success) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - DeleteIDCallback* callback = delete_id_callbacks_.Lookup(request_id); |
| + // Must remove the callback from the IDMap before running it, since running it |
| + // usually deletes this and hence the IDMap (but isn't guaranteed to either). |
| + DeleteTokenCallback* callback = delete_id_callbacks_.Lookup(request_id); |
|
Peter Beverloo
2016/04/26 15:12:23
Where does this happen? The three calls to Instanc
johnme
2016/04/26 17:18:27
The pattern set by the only existing user of IIDs
|
| DCHECK(callback); |
| - callback->Run(success ? InstanceID::SUCCESS : InstanceID::UNKNOWN_ERROR); |
| + DeleteIDCallback callback_copy = *callback; |
| delete_id_callbacks_.Remove(request_id); |
| + // Now |callback| has been deleted. |
| + callback_copy.Run(success ? InstanceID::SUCCESS : InstanceID::UNKNOWN_ERROR); |
| + // Now |this| will likely have been deleted. |
| } |
| } // namespace instance_id |