package info.justaway.model; import android.content.Context; import android.content.SharedPreferences; import com.google.gson.Gson; import java.util.ArrayList; import info.justaway.JustawayApplication; import twitter4j.auth.AccessToken; public class AccessTokenManager { private static final String TOKENS = "tokens"; private static final String PREF_NAME = "twitter_access_token"; private static AccessToken sAccessToken; private static SharedPreferences getSharedPreferences() { return JustawayApplication.getApplication() .getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); } public static boolean hasAccessToken() { return getAccessToken() != null; } public static ArrayList<AccessToken> getAccessTokens() { String json = getSharedPreferences().getString(TOKENS, null); if (json == null) { return null; } Gson gson = new Gson(); AccountSettings accountSettings = gson.fromJson(json, AccountSettings.class); return accountSettings.accessTokens; } public static AccessToken getAccessToken() { if (sAccessToken != null) { return sAccessToken; } String json = getSharedPreferences().getString(TOKENS, null); if (json == null) { return null; } Gson gson = new Gson(); AccountSettings accountSettings = gson.fromJson(json, AccountSettings.class); if (accountSettings == null || accountSettings.accessTokens == null) { return null; } sAccessToken = accountSettings.accessTokens.get(accountSettings.index); return sAccessToken; } public static void setAccessToken(AccessToken accessToken) { sAccessToken = accessToken; TwitterManager.getTwitter().setOAuthAccessToken(sAccessToken); SharedPreferences preferences = getSharedPreferences(); String json = preferences.getString(TOKENS, null); Gson gson = new Gson(); AccountSettings accountSettings; if (json != null) { accountSettings = gson.fromJson(json, AccountSettings.class); boolean existUser = false; int i = 0; for (AccessToken sharedAccessToken : accountSettings.accessTokens) { if (accessToken.getUserId() == sharedAccessToken.getUserId()) { accountSettings.accessTokens.set(i, accessToken); accountSettings.index = i; existUser = true; } i++; } if (!existUser) { accountSettings.index = accountSettings.accessTokens.size(); accountSettings.accessTokens.add(sAccessToken); } } else { accountSettings = new AccountSettings(); accountSettings.accessTokens = new ArrayList<AccessToken>(); accountSettings.accessTokens.add(sAccessToken); } String exportJson = gson.toJson(accountSettings); SharedPreferences.Editor editor = preferences.edit(); editor.putString(TOKENS, exportJson); editor.apply(); } public static void removeAccessToken(AccessToken removeAccessToken) { SharedPreferences preferences = getSharedPreferences(); String json = preferences.getString(TOKENS, null); Gson gson = new Gson(); AccountSettings accountSettings = gson.fromJson(json, AccountSettings.class); AccessToken currentAccessToken = accountSettings.accessTokens.get(accountSettings.index); /** * 現在設定されているAccessTokenより先に削除すべきAccessTokenがある場合indexをデクリメントする * これをしないと位置がずれる */ for (AccessToken accessToken : accountSettings.accessTokens) { if (accessToken.getUserId() == removeAccessToken.getUserId()) { accountSettings.index--; break; } if (accessToken.getUserId() == currentAccessToken.getUserId()) { break; } } accountSettings.accessTokens.remove(removeAccessToken); String exportJson = gson.toJson(accountSettings); SharedPreferences.Editor editor = preferences.edit(); editor.putString(TOKENS, exportJson); editor.apply(); } public static long getUserId() { if (sAccessToken == null) { return -1L; } return sAccessToken.getUserId(); } public static String getScreenName() { if (sAccessToken == null) { return ""; } return sAccessToken.getScreenName(); } public static class AccountSettings { int index; ArrayList<AccessToken> accessTokens; } }