public static Result parseBrowserSwitchResponse(ContextInspector contextInspector, Request request, Uri uri) { Result result = request.parseBrowserResponse(contextInspector, uri); switch (result.getResultType()) { case Error: request.trackFpti(contextInspector.getContext(), TrackingPoint.Error, null); break; case Cancel: request.trackFpti(contextInspector.getContext(), TrackingPoint.Cancel, null); break; case Success: request.trackFpti(contextInspector.getContext(), TrackingPoint.Return, null); break; } return result; } }
/** * Gets a {@link Result} from an {@link Intent} returned by either the PayPal Wallet app or * the browser. * * @param context * @param request the original {@link Request} that was used to get this {@link Result}. * @param data the {@link Intent} returned by either the PayPal Wallet app or the browser. * @return {@link Result} */ public static Result parseResponse(Context context, Request request, Intent data) { initService(context); if (data != null && data.getData() != null) { return BrowserSwitchHelper.parseBrowserSwitchResponse(sContextInspector, request, data.getData()); } else if (data != null && data.getExtras() != null && !data.getExtras().isEmpty()) { return AppSwitchHelper.parseAppSwitchResponse(sContextInspector, request, data); } else { request.trackFpti(context, TrackingPoint.Cancel, null); return new Result(); } }
public static Result parseAppSwitchResponse(ContextInspector contextInspector, Request request, Intent data) { Bundle bundle = data.getExtras(); if (request.validateV1V2Response(contextInspector, bundle)) { request.trackFpti(contextInspector.getContext(), TrackingPoint.Return, null); return processResponseIntent(bundle); } else { if (bundle.containsKey("error")) { request.trackFpti(contextInspector.getContext(), TrackingPoint.Error, null); return new Result(new WalletSwitchException(bundle.getString("error"))); } else { request.trackFpti(contextInspector.getContext(), TrackingPoint.Error, null); return new Result(new ResponseParsingException("invalid wallet response")); } } }
@Test public void parseAppSwitchResponse_parsesErrorAndReturnsResult() { Request request = mock(AuthorizationRequest.class); when(request.validateV1V2Response(any(ContextInspector.class), any(Bundle.class))) .thenReturn(true); Intent intent = new Intent() .putExtra("error", "there was an error"); Result result = AppSwitchHelper.parseAppSwitchResponse(mContextInspector, request, intent); verify(request).trackFpti(any(Context.class), eq(TrackingPoint.Return), isNull(Protocol.class)); assertTrue(result.getError() instanceof WalletSwitchException); assertEquals("there was an error", result.getError().getMessage()); }
@Test public void parseAppSwitchResponse_returnsErrorWhenResponseCouldNotBeParsed() { Request request = mock(AuthorizationRequest.class); when(request.validateV1V2Response(any(ContextInspector.class), any(Bundle.class))) .thenReturn(false); Intent intent = new Intent() .putExtra("braintree", "nonce"); Result result = AppSwitchHelper.parseAppSwitchResponse(mContextInspector, request, intent); verify(request).trackFpti(any(Context.class), eq(TrackingPoint.Error), isNull(Protocol.class)); assertTrue(result.getError() instanceof ResponseParsingException); assertEquals("invalid wallet response", result.getError().getMessage()); }
@Test public void parseAppSwitchResponse_parsesErrorForErrorResponses() { Request request = mock(AuthorizationRequest.class); when(request.validateV1V2Response(any(ContextInspector.class), any(Bundle.class))) .thenReturn(false); Intent intent = new Intent() .putExtra("error", "there was an error"); Result result = AppSwitchHelper.parseAppSwitchResponse(mContextInspector, request, intent); verify(request).trackFpti(any(Context.class), eq(TrackingPoint.Error), isNull(Protocol.class)); assertTrue(result.getError() instanceof WalletSwitchException); assertEquals("there was an error", result.getError().getMessage()); }
@Test public void parseAppSwitchResponse_parsesWebResponseAndReturnsResult() throws JSONException { Request request = mock(AuthorizationRequest.class); when(request.validateV1V2Response(any(ContextInspector.class), any(Bundle.class))) .thenReturn(true); Intent intent = new Intent() .putExtra("environment", "test") .putExtra("response_type", "web") .putExtra("webURL", "web-url"); Result result = AppSwitchHelper.parseAppSwitchResponse(mContextInspector, request, intent); verify(request).trackFpti(any(Context.class), eq(TrackingPoint.Return), isNull(Protocol.class)); assertEquals(ResultType.Success, result.getResultType()); assertEquals(ResponseType.web.name(), result.getResponse().getString("response_type")); JSONObject client = result.getResponse().getJSONObject("client"); assertEquals("test", client.getString("environment")); assertEquals("web-url", result.getResponse().getJSONObject("response").getString("webURL")); }
@Test public void parseAppSwitchResponse_parsesAuthorizationCodeResponseAndReturnsResult() throws JSONException { Request request = mock(AuthorizationRequest.class); when(request.validateV1V2Response(any(ContextInspector.class), any(Bundle.class))) .thenReturn(true); Intent intent = new Intent() .putExtra("environment", "test") .putExtra("response_type", "code") .putExtra("authorization_code", "auth-code") .putExtra("email", "test@paypal.com"); Result result = AppSwitchHelper.parseAppSwitchResponse(mContextInspector, request, intent); verify(request).trackFpti(any(Context.class), eq(TrackingPoint.Return), isNull(Protocol.class)); assertEquals(ResultType.Success, result.getResultType()); assertEquals(ResponseType.authorization_code.name(), result.getResponse().getString("response_type")); JSONObject client = result.getResponse().getJSONObject("client"); assertEquals("test", client.getString("environment")); assertEquals("auth-code", result.getResponse().getJSONObject("response").getString("code")); assertEquals("test@paypal.com", result.getResponse().getJSONObject("user").getString("display_string")); }
public static Intent getBrowserSwitchIntent(ContextInspector contextInspector, ConfigManager configManager, Request request) { OtcConfiguration configuration = configManager.getConfig(); try { String url = request.getBrowserSwitchUrl(contextInspector.getContext(), configuration); Recipe<?> recipe = request.getBrowserSwitchRecipe(configuration); for (String allowedBrowserPackage : recipe.getTargetPackagesInReversePriorityOrder()) { boolean canIntentBeResolved = Recipe.isValidBrowserTarget(contextInspector.getContext(), url, allowedBrowserPackage); if (canIntentBeResolved) { request.trackFpti(contextInspector.getContext(), TrackingPoint.SwitchToBrowser, recipe.getProtocol()); return Recipe.getBrowserIntent(contextInspector.getContext(), url, allowedBrowserPackage); } } } catch (CertificateException | UnsupportedEncodingException | NoSuchPaddingException | NoSuchAlgorithmException | IllegalBlockSizeException | JSONException | BadPaddingException | InvalidEncryptionDataException | InvalidKeyException ignored) {} return null; }
request.trackFpti(context, TrackingPoint.SwitchToWallet, recipe.getProtocol()); return new PendingRequest(true, RequestTarget.wallet, request.getClientMetadataId(), AppSwitchHelper.getAppSwitchIntent(sContextInspector, sConfigManager, request, recipe));