package de.fau.cs.mad.fablab.android.model;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import java.io.IOException;
import de.fau.cs.mad.fablab.rest.core.PlatformType;
import de.fau.cs.mad.fablab.rest.core.PushToken;
import de.fau.cs.mad.fablab.rest.myapi.PushApi;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class PushModel {
private static final String TAG = "PushModel";
private static final String KEY_PREF_ENABLE_PUSH = "enable_push";
private static final String PROPERTY_REG_ID = "reg_id";
private static final String PROPERTY_APP_VERSION = "app_version";
private static final String SENDER_ID = "605066933";
private Context mContext;
private PushApi mPushApi;
private String mPushId = "0";
public PushModel(Context context, PushApi pushApi) {
mContext = context;
mPushApi = pushApi;
if (getPreferences().getBoolean(KEY_PREF_ENABLE_PUSH, true)) {
registerDeviceToGcm();
}
}
public String getPushId() {
return mPushId;
}
public void registerDeviceToGcm() {
if (!checkPlayServices()) {
return;
}
if (isRegisteredToGcm()) {
mPushId = getPreferences().getString(PROPERTY_REG_ID, "");
} else {
registerInBackground();
}
}
private boolean checkPlayServices() {
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext);
if (resultCode != ConnectionResult.SUCCESS) {
if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
Log.i(TAG, "Service is not available");
} else {
Log.i(TAG, "This device is not supported");
}
return false;
}
return true;
}
private boolean isRegisteredToGcm() {
SharedPreferences prefs = getPreferences();
String registrationId = prefs.getString(PROPERTY_REG_ID, "");
if (registrationId.isEmpty()) {
Log.i(TAG, "Registration not found.");
return false;
}
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, -1);
int currentVersion = getAppVersion();
if (registeredVersion != currentVersion) {
Log.i(TAG, "App version changed.");
return false;
}
return true;
}
private SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(mContext);
}
private int getAppVersion() {
try {
PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(
mContext.getPackageName(), 0);
return packageInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException("Could not get package name: " + e);
}
}
private void registerInBackground() {
new AsyncTask<Context, Void, String>() {
@Override
protected String doInBackground(Context... params) {
String regId = null;
try {
GoogleCloudMessaging mGoogleCloudMessaging = GoogleCloudMessaging.getInstance(
params[0]);
regId = mGoogleCloudMessaging.register(SENDER_ID);
Log.i(TAG, "Device registered, registration ID=" + regId);
} catch (IOException e) {
Log.i(TAG, "Error while registering", e);
}
return regId;
}
@Override
protected void onPostExecute(String regId) {
super.onPostExecute(regId);
if (regId != null) {
sendRegistrationIdToBackend(regId);
storeRegistrationId(regId);
mPushId = regId;
}
}
}.execute(mContext);
}
private void sendRegistrationIdToBackend(String regId) {
PushToken pushToken = new PushToken();
pushToken.setToken(regId);
pushToken.setPlatformType(PlatformType.ANDROID);
mPushApi.subscribeDoorOpensNextTime(pushToken, new Callback<Boolean>() {
@Override
public void success(Boolean status, Response response) {
Log.i(TAG, "Success: " + status);
}
@Override
public void failure(RetrofitError error) {
Log.i(TAG, "Failure: " + error.getMessage());
}
});
}
private void storeRegistrationId(String regId) {
int appVersion = getAppVersion();
Log.i(TAG, "Saving regId on app version " + appVersion);
SharedPreferences.Editor editor = getPreferences().edit();
editor.putString(PROPERTY_REG_ID, regId);
editor.putInt(PROPERTY_APP_VERSION, appVersion);
editor.apply();
}
public void unregisterDeviceFromGcm() {
if (!mPushId.equals("0")) {
unregisterInBackground();
}
}
private void unregisterInBackground() {
new AsyncTask<Context, Void, Void>() {
@Override
protected Void doInBackground(Context... params) {
try {
GoogleCloudMessaging mGoogleCloudMessaging = GoogleCloudMessaging.getInstance(
params[0]);
mGoogleCloudMessaging.unregister();
Log.i(TAG, "Device unregistered");
} catch (IOException e) {
Log.i(TAG, "Error", e);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
deleteRegistrationIdFromBackend();
deleteRegistrationId();
mPushId = "0";
}
}.execute(mContext);
}
private void deleteRegistrationIdFromBackend() {
PushToken pushToken = new PushToken();
pushToken.setToken(mPushId);
pushToken.setPlatformType(PlatformType.ANDROID);
mPushApi.unsubscribeDoorOpensNextTime(pushToken, new Callback<Boolean>() {
@Override
public void success(Boolean status, Response response) {
Log.i(TAG, "Success: " + status);
}
@Override
public void failure(RetrofitError error) {
Log.i(TAG, "Failure: " + error.getMessage());
}
});
}
private void deleteRegistrationId() {
SharedPreferences.Editor editor = getPreferences().edit();
editor.remove(PROPERTY_REG_ID);
editor.remove(PROPERTY_APP_VERSION);
editor.apply();
}
}