package com.ved.musicmapapp.utils; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HTTP; import android.content.Context; import com.google.android.gcm.GCMRegistrar; public final class ServerUtilities { private static final int MAX_ATTEMPTS = 5; private static final int BACKOFF_MILLI_SECONDS = 2000; private static final Random random = new Random(); /** * Register this account/device pair within the server. * */ public static void register(final Context context, String fbid, final String regId) { String serverUrl = Statics.REGISTER_GCM_URL; List <NameValuePair> nvps = new ArrayList <NameValuePair>(); nvps.add(new BasicNameValuePair("gcm_id", regId)); nvps.add(new BasicNameValuePair("fbid", fbid)); long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000); // Once GCM returns a registration id, we need to register on our server // As the server might be down, we will retry it a couple // times. for (int i = 1; i <= MAX_ATTEMPTS; i++) { try { post(serverUrl, nvps); GCMRegistrar.setRegisteredOnServer(context, true); return; } catch (IOException e) { // Here we are simplifying and retrying on any error; in a real // application, it should retry only on unrecoverable errors // (like HTTP error code 503). if (i == MAX_ATTEMPTS) { break; } try { Thread.sleep(backoff); } catch (InterruptedException e1) { // Activity finished before we complete - exit. Thread.currentThread().interrupt(); return; } // increase backoff exponentially backoff *= 2; } } } /** * Unregister this account/device pair within the server. */ public static void unregister(final Context context, String regId) { String serverUrl = Statics.REGISTER_GCM_URL; List <NameValuePair> nvps = new ArrayList <NameValuePair>(); nvps.add(new BasicNameValuePair("gcm_id", regId)); try { post(serverUrl, nvps); GCMRegistrar.setRegisteredOnServer(context, false); } catch (IOException e) { } } /** * Issue a POST request to the server. * * @param endpoint POST address. * @param params request parameters. * * @throws IOException propagated from POST. */ private static void post(String endpoint, List<NameValuePair> params) throws IOException { HttpParams httpParameters = new BasicHttpParams(); int timeoutConnection = 20000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); int timeoutSocket = 20000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); HttpClient httpclient = new DefaultHttpClient(httpParameters); HttpPost httppost = new HttpPost(endpoint); httppost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); httpclient.execute(httppost); } }