/* * Copyright (C) 2014 Open Whisper Systems * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.anhonesteffort.flock.sync.account; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; import org.anhonesteffort.flock.util.guava.Optional; import org.anhonesteffort.flock.registration.model.AugmentedFlockAccount; import org.anhonesteffort.flock.registration.model.FlockCardInformation; import org.anhonesteffort.flock.registration.model.SubscriptionPlan; import org.anhonesteffort.flock.util.TimeUtil; import java.util.Date; /** * rhodey */ public class AccountStore { private static final String KEY_LAST_CHARGE_FAILED = "AccountStore.KEY_LAST_CHARGE_FAILED"; private static final String KEY_AUTO_RENEW = "AccountStore.KEY_AUTO_RENEW"; private static final String KEY_DAYS_REMAINING_TIMESTAMP = "AccountStore.KEY_DAYS_REMAINING_TIMESTAMP"; private static final String KEY_DAYS_REMAINING = "AccountStore.KEY_DAYS_REMAINING"; private static final String KEY_SUBSCRIPTION_PLAN_TYPE = "AccountStore.KEY_SUBSCRIPTION_PLAN_TYPE"; private static final String KEY_SUBSCRIPTION_PLAN = "AccountStore.KEY_SUBSCRIPTION_PLAN"; private static final String KEY_CARD_INFORMATION_ACCOUNT_ID = "AccountStore.KEY_CARD_INFORMATION_ACCOUNT_ID"; private static final String KEY_CARD_INFORMATION_LAST_FOUR = "AccountStore.KEY_CARD_INFORMATION_LAST_FOUR"; private static final String KEY_CARD_INFORMATION_EXPIRATION = "AccountStore.KEY_CARD_INFORMATION_EXPIRATION"; private static SharedPreferences getStore(Context context) { return PreferenceManager.getDefaultSharedPreferences(context); } public static boolean getLastChargeFailed(Context context) { return getStore(context).getBoolean(KEY_LAST_CHARGE_FAILED, false); } public static void setLastChargeFailed(Context context, boolean failed) { getStore(context).edit() .putBoolean(KEY_LAST_CHARGE_FAILED, failed) .apply(); } public static boolean getAutoRenew(Context context) { return getStore(context).getBoolean(KEY_AUTO_RENEW, false); } public static void setAutoRenew(Context context, boolean isEnabled) { getStore(context).edit() .putBoolean(KEY_AUTO_RENEW, isEnabled) .apply(); } public static Optional<Long> getDaysRemaining(Context context) { Long timestamp = getStore(context).getLong(KEY_DAYS_REMAINING_TIMESTAMP, -1L); Long daysRemaining = getStore(context).getLong(KEY_DAYS_REMAINING, Long.MIN_VALUE); if (timestamp <= 0L || daysRemaining == Long.MIN_VALUE) return Optional.absent(); long msSinceStore = (new Date().getTime() - timestamp); long daysSinceStore = TimeUtil.millisecondsToDays(msSinceStore); return Optional.of((daysRemaining - daysSinceStore)); } public static void setDaysRemaining(Context context, long daysRemaining) { getStore(context).edit() .putLong(KEY_DAYS_REMAINING, daysRemaining) .putLong(KEY_DAYS_REMAINING_TIMESTAMP, new Date().getTime()) .apply(); } public static Integer getSubscriptionPlanType(Context context) { return getStore(context).getInt(KEY_SUBSCRIPTION_PLAN_TYPE, SubscriptionPlan.PLAN_TYPE_NONE); } public static SubscriptionPlan getSubscriptionPlan(Context context) throws JsonParseException { Integer planType = getStore(context).getInt(KEY_SUBSCRIPTION_PLAN_TYPE, SubscriptionPlan.PLAN_TYPE_NONE); String serializedPlan = getStore(context).getString(KEY_SUBSCRIPTION_PLAN, null); return SubscriptionPlan.buildFromSerialized(planType, serializedPlan); } public static void setSubscriptionPlan(Context context, SubscriptionPlan plan) throws JsonProcessingException { getStore(context).edit() .putInt(KEY_SUBSCRIPTION_PLAN_TYPE, plan.getPlanType()) .putString(KEY_SUBSCRIPTION_PLAN, plan.serialize()) .apply(); } public static Optional<FlockCardInformation> getCardInformation(Context context) { String accountId = getStore(context).getString(KEY_CARD_INFORMATION_ACCOUNT_ID, null); String lastFour = getStore(context).getString(KEY_CARD_INFORMATION_LAST_FOUR, null); String expiration = getStore(context).getString(KEY_CARD_INFORMATION_EXPIRATION, null); if (accountId == null || lastFour == null || expiration == null) return Optional.absent(); return Optional.of( new FlockCardInformation(accountId, lastFour, expiration) ); } public static void setCardInformation(Context context, Optional<FlockCardInformation> cardInformation) { if (cardInformation.isPresent()) { getStore(context).edit() .putString(KEY_CARD_INFORMATION_ACCOUNT_ID, cardInformation.get().getAccountId()) .putString(KEY_CARD_INFORMATION_LAST_FOUR, cardInformation.get().getCardLastFour()) .putString(KEY_CARD_INFORMATION_EXPIRATION, cardInformation.get().getCardExpiration()) .apply(); } else { getStore(context).edit() .putString(KEY_CARD_INFORMATION_ACCOUNT_ID, null) .putString(KEY_CARD_INFORMATION_LAST_FOUR, null) .putString(KEY_CARD_INFORMATION_EXPIRATION, null) .apply(); } } public static void updateStore(Context context, AugmentedFlockAccount account) throws JsonProcessingException { setLastChargeFailed(context, account.getLastStripeChargeFailed()); setAutoRenew(context, account.getAutoRenewEnabled()); setDaysRemaining(context, account.getDaysRemaining()); setSubscriptionPlan(context, account.getSubscriptionPlan()); } }