diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java index 5aa03c5ed..bb664287a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncService.java @@ -958,7 +958,7 @@ public final class ActFmSyncService { pushAllQueuedUpdates(); } - public void updateUserSubscriptionStatus(Runnable onSuccess, Runnable onError) { + public void updateUserSubscriptionStatus(Runnable onSuccess, Runnable onRecoverableError, Runnable onInvalidToken) { String purchaseToken = Preferences.getStringValue(BillingConstants.PREF_PURCHASE_TOKEN); String productId = Preferences.getStringValue(BillingConstants.PREF_PRODUCT_ID); try { @@ -969,9 +969,21 @@ public final class ActFmSyncService { if (onSuccess != null) onSuccess.run(); } catch (Exception e) { + if (e instanceof ActFmServiceException) { + ActFmServiceException ae = (ActFmServiceException)e; + if (ae.result != null && ae.result.optString("status").equals("error")) { + if (ae.result.optString("code").equals("invalid_purchase_token")) { // Not a valid purchase--expired or duolicate + Preferences.setBoolean(ActFmPreferenceService.PREF_LOCAL_PREMIUM, false); + Preferences.setBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, false); + if (onInvalidToken != null) + onInvalidToken.run(); + return; + } + } + } Preferences.setBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, true); - if (onError != null) - onError.run(); + if (onRecoverableError != null) + onRecoverableError.run(); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java index 7bfa2b083..2a2fce453 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java @@ -176,7 +176,7 @@ public class ActFmSyncV2Provider extends SyncV2Provider { @SuppressWarnings("nls") public void updateUserStatus() { if (Preferences.getBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, false)) { - actFmSyncService.updateUserSubscriptionStatus(null, null); + actFmSyncService.updateUserSubscriptionStatus(null, null, null); } try { diff --git a/astrid/res/values/strings-premium.xml b/astrid/res/values/strings-premium.xml index af6d6fe63..733675834 100644 --- a/astrid/res/values/strings-premium.xml +++ b/astrid/res/values/strings-premium.xml @@ -95,5 +95,6 @@ You need to have an Astrid.com account in order to subscribe to premium. Please log in or sign up. Thanks for subscribing to Astrid Premium! Thanks for subscribing to Astrid Premium! The new features will be unlocked for you on astrid.com soon, and should be available on your phone right away. + The premium subscription for this Google Play account is connected to a different user. To link additional emails to your account, visit astrid.com/users/profile diff --git a/astrid/src/com/todoroo/astrid/billing/AstridPurchaseObserver.java b/astrid/src/com/todoroo/astrid/billing/AstridPurchaseObserver.java index e22c87f34..731719fe7 100644 --- a/astrid/src/com/todoroo/astrid/billing/AstridPurchaseObserver.java +++ b/astrid/src/com/todoroo/astrid/billing/AstridPurchaseObserver.java @@ -76,7 +76,7 @@ public abstract class AstridPurchaseObserver extends PurchaseObserver { if (actFmPreferenceService.isLoggedIn()) { actFmSyncService.updateUserSubscriptionStatus(new Runnable() { @Override - public void run() { + public void run() { // On Success Preferences.setBoolean(ActFmPreferenceService.PREF_PREMIUM, true); mActivity.runOnUiThread(new Runnable() { @Override @@ -91,7 +91,7 @@ public abstract class AstridPurchaseObserver extends PurchaseObserver { } }); } - }, new Runnable() { + }, new Runnable() { // On Recoverable error @Override public void run() { mActivity.runOnUiThread(new Runnable() { @@ -107,6 +107,17 @@ public abstract class AstridPurchaseObserver extends PurchaseObserver { } }); } + }, new Runnable() { // On invalid token + @Override + public void run() { + DialogUtilities.okDialog(mActivity, mActivity.getString(R.string.DLG_information_title), + 0, mActivity.getString(R.string.premium_verification_error), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mActivity.finish(); + } + }); + } }); } else { Preferences.setBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, true); @@ -119,7 +130,7 @@ public abstract class AstridPurchaseObserver extends PurchaseObserver { public void run() { Preferences.setBoolean(ActFmPreferenceService.PREF_LOCAL_PREMIUM, false); if (actFmPreferenceService.isLoggedIn()) - actFmSyncService.updateUserSubscriptionStatus(null, null); + actFmSyncService.updateUserSubscriptionStatus(null, null, null); } }.start(); }