package com.kickstarter.services.gcm;
import android.app.IntentService;
import android.content.Intent;
import android.support.annotation.NonNull;
import com.google.android.gms.gcm.GcmPubSub;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.google.android.gms.iid.InstanceID;
import com.kickstarter.KSApplication;
import com.kickstarter.R;
import com.kickstarter.libs.CurrentUserType;
import com.kickstarter.libs.rx.transformers.Transformers;
import com.kickstarter.libs.utils.ObjectUtils;
import com.kickstarter.services.ApiClientType;
import java.io.IOException;
import javax.inject.Inject;
import timber.log.Timber;
public class RegisterService extends IntentService {
protected @Inject ApiClientType apiClient;
protected @Inject CurrentUserType currentUser;
public RegisterService() {
super("RegisterService");
}
@Override
public void onCreate() {
super.onCreate();
((KSApplication) getApplicationContext()).component().inject(this);
}
@Override
protected void onHandleIntent(final @NonNull Intent intent) {
Timber.d("onHandleIntent");
try {
// This initially hits the network to retrieve the token, subsequent calls are local
final InstanceID instanceID = InstanceID.getInstance(this);
// R.string.gcm_defaultSenderId is derived from google-services.json
final String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Timber.d("Token: %s", token);
sendTokenToApi(token);
subscribeToGlobalTopic(token);
} catch (final Exception e) {
Timber.e("Failed to complete token refresh: %s", e);
}
}
/**
* Persist token to app servers.
*
* @param token The new token.
*/
private void sendTokenToApi(final @NonNull String token) {
currentUser.observable()
.take(1)
.filter(ObjectUtils::isNotNull)
.subscribe(__ ->
apiClient.registerPushToken(token)
.compose(Transformers.neverError())
.first().toBlocking().single()
);
}
/**
* Subscribe to generic global topic - not using more specific topics.
*
* @throws IOException if unable to reach the GCM PubSub service
*/
private void subscribeToGlobalTopic(final @NonNull String token) throws IOException {
GcmPubSub.getInstance(this).subscribe(token, "/topics/global", null);
}
}