Java tutorial
/* * Copyright 2013 Nytyr [me at nytyr dot me] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.memetro.android.notifications; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.util.Log; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.memetro.android.common.Config; import com.memetro.android.oauth.OAuth; import com.memetro.android.oauth.Utils; import org.json.JSONObject; import java.sql.Timestamp; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; public class NotificationUtils { static final String TAG = "GcmUtils"; public static final String EXTRA_MESSAGE = "message"; public static final String PROPERTY_REG_ID = "127563298891"; private static final String PROPERTY_APP_VERSION = "appVersion"; private static final String PROPERTY_ON_SERVER_EXPIRATION_TIME = "onServerExpirationTimeMs"; /** * Default lifespan (7 days) of a reservation until it is considered * expired. */ public static final long REGISTRATION_EXPIRY_TIME_MS = 1000 * 3600 * 24 * 7; AtomicInteger msgId = new AtomicInteger(); SharedPreferences prefs; /** * Stores the registration id, app versionCode, and expiration time in the * application's {@code SharedPreferences}. * * @param context application's context. * @param regId registration id */ public static void setRegistrationId(Context context, String regId) { final SharedPreferences prefs = getGCMPreferences(context); int appVersion = getAppVersion(context); Log.v(TAG, "Saving regId on app version " + appVersion); SharedPreferences.Editor editor = prefs.edit(); editor.putString(PROPERTY_REG_ID, regId); editor.putInt(PROPERTY_APP_VERSION, appVersion); long expirationTime = System.currentTimeMillis() + REGISTRATION_EXPIRY_TIME_MS; Log.v(TAG, "Setting registration expiry time to " + new Timestamp(expirationTime)); editor.putLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, expirationTime); editor.commit(); } /** * Gets the current registration id for application on GCM service. * <p> * If result is empty, the registration has failed. * * @return registration id, or empty string if the registration is not * complete. */ public static String getRegistrationId(Context context) { final SharedPreferences prefs = getGCMPreferences(context); String registrationId = prefs.getString(PROPERTY_REG_ID, ""); if (registrationId.length() == 0) { Log.v(TAG, "Registration not found."); return ""; } // check if app was updated; if so, it must clear registration id to // avoid a race condition if GCM sends a message int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); int currentVersion = getAppVersion(context); if (registeredVersion != currentVersion || isRegistrationExpired(context)) { Log.v(TAG, "App version changed or registration expired."); return ""; } return registrationId; } /** * @return Application's {@code SharedPreferences}. */ private static SharedPreferences getGCMPreferences(Context context) { return context.getSharedPreferences("GP_GCM", Context.MODE_PRIVATE); } /** * @return Application's version code from the {@code PackageManager}. */ private static int getAppVersion(Context context) { try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { // should never happen throw new RuntimeException("Could not get package name: " + e); } } /** * Checks if the registration has expired. * * <p>To avoid the scenario where the device sends the registration to the * server but the server loses it, the app developer may choose to * re-register after REGISTRATION_EXPIRY_TIME_MS. * * @param context application's context. * * @return true if the registration has expired. */ private static boolean isRegistrationExpired(Context context) { final SharedPreferences prefs = getGCMPreferences(context); // checks if the information is not stale long expirationTime = prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1); return System.currentTimeMillis() > expirationTime; } public void registerDevice(Context context) { new registerBackground(context).execute(); } class registerBackground extends AsyncTask<Void, Void, Void> { private Context context; public registerBackground(Context context) { this.context = context; } private String regid; @Override protected Void doInBackground(Void... params) { try { regid = getRegistrationId(context); if (regid.length() == 0) { //If empty register GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); regid = gcm.register(Config.GCM_SENDER_ID); Log.d(TAG, "Device registered in google. Registration id=" + regid); setRegistrationId(context, regid); OAuth OAuth = new OAuth(context); Utils Utils = new Utils(); Map<String, String> postParams = new HashMap<String, String>(4); postParams.put("access_token", Utils.getToken(context)); postParams.put("type", "AND"); postParams.put("device", regid); JSONObject response = OAuth.call("devices", "register", postParams); Log.d(TAG, "Register in memetro > " + response); } } catch (Exception ex) { ex.printStackTrace(); } return null; } @Override protected void onPostExecute(Void param) { } } }