package cl.monsoon.s1next.data.api; import android.text.TextUtils; import cl.monsoon.s1next.data.User; import cl.monsoon.s1next.data.api.model.Account; import cl.monsoon.s1next.data.api.model.wrapper.FavouritesWrapper; import cl.monsoon.s1next.data.api.model.wrapper.ForumGroupsWrapper; import cl.monsoon.s1next.data.api.model.wrapper.PostsWrapper; import cl.monsoon.s1next.data.api.model.wrapper.ResultWrapper; import cl.monsoon.s1next.data.api.model.wrapper.ThreadsWrapper; public final class UserValidator { private static final String INVALID_UID = "0"; private final User mUser; public UserValidator(User user) { this.mUser = user; } /** * Intercepts the data in order to check whether current user's login status * has changed and update user's status if needed. * * @param d The data we want to intercept. * @param <D> The data type. * @return Original data. */ public <D> D validateIntercept(D d) { Account account = null; if (d instanceof PostsWrapper) { account = ((PostsWrapper) d).getPosts(); } else if (d instanceof ThreadsWrapper) { account = ((ThreadsWrapper) d).getThreads(); } else if (d instanceof ForumGroupsWrapper) { account = ((ForumGroupsWrapper) d).getForumGroups(); } else if (d instanceof FavouritesWrapper) { account = ((FavouritesWrapper) d).getFavourites(); } else if (d instanceof ResultWrapper) { account = ((ResultWrapper) d).getAccount(); } if (account != null) { validate(account); } return d; } /** * Checks current user's login status and updates {@link User}'s in our app. */ public void validate(Account account) { final boolean logged = mUser.isLogged(); String uid = account.getUid(); if (INVALID_UID.equals(uid) || TextUtils.isEmpty(uid)) { if (logged) { // if account has expired mUser.setUid(null); mUser.setName(null); mUser.setLogged(false); } } else { if (!logged) { // if account has logged mUser.setUid(uid); mUser.setName(account.getUsername()); mUser.setLogged(true); } } mUser.setPermission(account.getPermission()); mUser.setAuthenticityToken(account.getAuthenticityToken()); } }