package org.gdg.frisbee.android.app; import android.content.Context; import android.content.SharedPreferences; import android.text.format.DateUtils; import org.gdg.frisbee.android.api.Callback; import org.gdg.frisbee.android.api.GdgXHub; import org.gdg.frisbee.android.api.model.OrganizerCheckResponse; import org.gdg.frisbee.android.utils.PlusUtils; public class OrganizerChecker { private static final String PREF_ORGANIZER_CHECK_TIME = "pref_organizer_check_time"; private static final String PREF_ORGANIZER_CHECK_ID = "pref_organizer_check_id"; private static final String PREF_ORGANIZER_STATE = "pref_organizer_state"; private static final long ORGANIZER_CHECK_MAX_TIME = DateUtils.WEEK_IN_MILLIS; private final SharedPreferences preferences; private final GdgXHub gdgXHub; private boolean isOrganizer = false; private long lastOrganizerCheckTimeStamp = 0; private String checkedId = null; OrganizerChecker(SharedPreferences preferences, GdgXHub gdgXHub) { this.preferences = preferences; this.gdgXHub = gdgXHub; initOrganizer(); } private void initOrganizer() { lastOrganizerCheckTimeStamp = preferences.getLong(PREF_ORGANIZER_CHECK_TIME, 0); checkedId = preferences.getString(PREF_ORGANIZER_CHECK_ID, null); isOrganizer = preferences.getBoolean(PREF_ORGANIZER_STATE, false); } void resetOrganizer() { preferences.edit() .putBoolean(OrganizerChecker.PREF_ORGANIZER_STATE, false) .putLong(OrganizerChecker.PREF_ORGANIZER_CHECK_TIME, 0) .apply(); } public boolean isOrganizer() { return isOrganizer; } void checkOrganizer(Context context, final Callbacks responseHandler) { final String currentId = PlusUtils.getCurrentPlusId(context); if (currentId == null) { isOrganizer = false; checkedId = null; responseHandler.onOrganizerResponse(false); return; } if (isLastOrganizerCheckValid(currentId)) { responseHandler.onOrganizerResponse(isOrganizer); return; } isOrganizer = false; gdgXHub.checkOrganizer(currentId).enqueue(new Callback<OrganizerCheckResponse>() { @Override public void onSuccess(OrganizerCheckResponse organizerCheckResponse) { lastOrganizerCheckTimeStamp = System.currentTimeMillis(); checkedId = currentId; isOrganizer = organizerCheckResponse.getChapters().size() > 0; responseHandler.onOrganizerResponse(isOrganizer); savePreferences(); } @Override public void onError() { isOrganizer = false; responseHandler.onErrorResponse(); } }); } /** * The latest organizer check value is still valid * when we have the same organizer and we already checked within a valid timeframe. */ private boolean isLastOrganizerCheckValid(String organizerIdToCheck) { return organizerIdToCheck.equals(checkedId) && System.currentTimeMillis() <= lastOrganizerCheckTimeStamp + ORGANIZER_CHECK_MAX_TIME; } private void savePreferences() { preferences.edit() .putLong(PREF_ORGANIZER_CHECK_TIME, lastOrganizerCheckTimeStamp) .putString(PREF_ORGANIZER_CHECK_ID, checkedId) .putBoolean(PREF_ORGANIZER_STATE, isOrganizer()) .apply(); } public interface Callbacks { void onOrganizerResponse(boolean isOrganizer); void onErrorResponse(); } }