content: package im.actor.push;
  
  import android.content.Context;
  
  import com.google.android.gms.gcm.GoogleCloudMessaging;
  
  import java.io.IOException;
  
  import im.actor.runtime.util.ExponentialBackoff;
  import im.actor.runtime.Log;
  import im.actor.sdk.ActorSDK;
  import im.actor.sdk.core.ActorPushManager;
  
  public class PushManager implements ActorPushManager {
      private static final String TAG = "im.actor.push.PushManager";
      private boolean isRegistered = false;
  
      @Override
      public void registerPush(final Context context) {
  
          if (!isRegistered) {
  
              Log.d(TAG, "Requesting push token...");
              
              new Thread() {
                  @Override
                  public void run() {
                      ExponentialBackoff exponentialBackoff = new ExponentialBackoff();
                      while (true) {
                          try {
                              String regId = tryRegisterPush(context);
                              if (regId != null) {
                                  Log.d(TAG, "Token loaded");
                                  onPushRegistered(regId);
                                  return;
                              } else {
                                  Log.d(TAG, "Unable to load Token");
                                  exponentialBackoff.onFailure();
                              }
                          } catch (Exception e) {
                              e.printStackTrace();
                              exponentialBackoff.onFailure();
                          }
                          long waitTime = exponentialBackoff.exponentialWait();
                          Log.d(TAG, "Next attempt in " + waitTime + " ms");
                          try {
                              Thread.sleep(waitTime);
                          } catch (InterruptedException e1) {
                              e1.printStackTrace();
                              return;
                          }
                      }
                  }
              }.start();
          } else {
              Log.d(TAG, "Already registered token");
          }
      }
  
      private void onPushRegistered(String token) {
          isRegistered = true;
          ActorSDK.sharedActor().getMessenger().getPreferences().putBool("push_registered", true);
          ActorSDK.sharedActor().getMessenger().registerGooglePush(ActorSDK.sharedActor().getPushId(), token);
  
      }
  
      private String tryRegisterPush(Context context) {
          GoogleCloudMessaging cloudMessaging = GoogleCloudMessaging.getInstance(context);
          Log.d(TAG, "Requesting push token iteration...");
          try {
              return cloudMessaging.register("" + ActorSDK.sharedActor().getPushId());
          } catch (IOException e) {
              e.printStackTrace();
              return null;
          }
      }
  
  }
  