Handle other error cases for in app billing verification

pull/14/head
Sam Bosley 13 years ago
parent bbcf54daac
commit 86692eeebc

@ -958,7 +958,7 @@ public final class ActFmSyncService {
pushAllQueuedUpdates(); 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 purchaseToken = Preferences.getStringValue(BillingConstants.PREF_PURCHASE_TOKEN);
String productId = Preferences.getStringValue(BillingConstants.PREF_PRODUCT_ID); String productId = Preferences.getStringValue(BillingConstants.PREF_PRODUCT_ID);
try { try {
@ -969,9 +969,21 @@ public final class ActFmSyncService {
if (onSuccess != null) if (onSuccess != null)
onSuccess.run(); onSuccess.run();
} catch (Exception e) { } 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); Preferences.setBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, true);
if (onError != null) if (onRecoverableError != null)
onError.run(); onRecoverableError.run();
} }
} }

@ -176,7 +176,7 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
@SuppressWarnings("nls") @SuppressWarnings("nls")
public void updateUserStatus() { public void updateUserStatus() {
if (Preferences.getBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, false)) { if (Preferences.getBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, false)) {
actFmSyncService.updateUserSubscriptionStatus(null, null); actFmSyncService.updateUserSubscriptionStatus(null, null, null);
} }
try { try {

@ -95,5 +95,6 @@
<string name="premium_login_prompt">You need to have an Astrid.com account in order to subscribe to premium. Please log in or sign up.</string> <string name="premium_login_prompt">You need to have an Astrid.com account in order to subscribe to premium. Please log in or sign up.</string>
<string name="premium_success">Thanks for subscribing to Astrid Premium!</string> <string name="premium_success">Thanks for subscribing to Astrid Premium!</string>
<string name="premium_success_with_server_error">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.</string> <string name="premium_success_with_server_error">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.</string>
<string name="premium_verification_error">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</string>
</resources> </resources>

@ -76,7 +76,7 @@ public abstract class AstridPurchaseObserver extends PurchaseObserver {
if (actFmPreferenceService.isLoggedIn()) { if (actFmPreferenceService.isLoggedIn()) {
actFmSyncService.updateUserSubscriptionStatus(new Runnable() { actFmSyncService.updateUserSubscriptionStatus(new Runnable() {
@Override @Override
public void run() { public void run() { // On Success
Preferences.setBoolean(ActFmPreferenceService.PREF_PREMIUM, true); Preferences.setBoolean(ActFmPreferenceService.PREF_PREMIUM, true);
mActivity.runOnUiThread(new Runnable() { mActivity.runOnUiThread(new Runnable() {
@Override @Override
@ -91,7 +91,7 @@ public abstract class AstridPurchaseObserver extends PurchaseObserver {
} }
}); });
} }
}, new Runnable() { }, new Runnable() { // On Recoverable error
@Override @Override
public void run() { public void run() {
mActivity.runOnUiThread(new Runnable() { 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 { } else {
Preferences.setBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, true); Preferences.setBoolean(BillingConstants.PREF_NEEDS_SERVER_UPDATE, true);
@ -119,7 +130,7 @@ public abstract class AstridPurchaseObserver extends PurchaseObserver {
public void run() { public void run() {
Preferences.setBoolean(ActFmPreferenceService.PREF_LOCAL_PREMIUM, false); Preferences.setBoolean(ActFmPreferenceService.PREF_LOCAL_PREMIUM, false);
if (actFmPreferenceService.isLoggedIn()) if (actFmPreferenceService.isLoggedIn())
actFmSyncService.updateUserSubscriptionStatus(null, null); actFmSyncService.updateUserSubscriptionStatus(null, null, null);
} }
}.start(); }.start();
} }

Loading…
Cancel
Save