public static boolean register(
     final Context context, final String regId, /* optional */ final String oldId) {
   Log.i(TAG, "registering device");
   String serverUrl = Secret.SERVER_REG_URL;
   Map<String, String> params = new HashMap<String, String>();
   params.put(P_REGID, regId);
   params.put(P_USER, PrefsHelper.getUser(context));
   params.put(P_PWD, PrefsHelper.getPwd(context));
   if (oldId != "") {
     params.put(P_OLDID, oldId);
   }
   long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000);
   // Once GCM returns a registration id, we need to register it in the
   // app server. As the server might be down, we will retry it a couple
   // times.
   for (int i = 1; i <= MAX_ATTEMPTS; i++) {
     if (GCMRegistrar.isRegisteredOnServer(context)) {
       // AsyncTask finished meanwhile, return
       return false;
     }
     Log.d(TAG, "Attempt #" + i + " to register");
     try {
       String message = post(serverUrl, params);
       if (message.contains("Successfully added") || message.contains("already registered")) {
         GCMRegistrar.setRegisteredOnServer(context, true);
         GCMHelper.displayMessage(context, message);
         return true;
       } else {
         // dont backoff in case of a wrong password
         GCMHelper.displayMessage(context, message);
         return false;
       }
     } catch (IOException e) {
       Log.e(TAG, "Failed to register on attempt " + i, e);
       if (i == MAX_ATTEMPTS) {
         break;
       }
       try {
         Log.d(TAG, "Sleeping for " + backoff + " ms before retry");
         Thread.sleep(backoff);
       } catch (InterruptedException e1) {
         // Activity finished before we complete - exit.
         Log.d(TAG, "Thread interrupted: abort remaining retries!");
         Thread.currentThread().interrupt();
         return false;
       }
       // increase backoff exponentially
       backoff *= 2;
     }
   }
   String message = context.getString(R.string.server_register_error, MAX_ATTEMPTS);
   GCMHelper.displayMessage(context, message);
   return false;
 }
  /** Unregister this account/device pair within the server. */
  public static void unregister(final Context context, final String regId) {
    Log.i(TAG, "unregistering device");
    String serverUrl = Secret.SERVER_UNREG_URL;
    Map<String, String> params = new HashMap<String, String>();
    params.put(P_REGID, regId);
    params.put(P_USER, PrefsHelper.getUser(context));
    params.put(P_PWD, PrefsHelper.getPwd(context));

    try {
      String message = post(serverUrl, params);
      GCMHelper.displayMessage(context, message);
      if (message.contains("Success")) {
        GCMRegistrar.setRegisteredOnServer(context, false);
      }
    } catch (IOException e) {
      String message = context.getString(R.string.server_unregister_error, e.getMessage());
      e.printStackTrace();
      GCMHelper.displayMessage(context, message);
    }
  }