I am working on implementing PayPal into my current Android app, and I have been advised to use Chrome Custom Tabs, but I cannot seem to get the Intent to be triggered.
I believe I have set the Intent up correctly in the AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rhiannon.chromecustomtabs">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".CompletePayPalPaymentActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="Test"
android:host="com.Test.TestApp.PayPalReturn"/>
</intent-filter>
</activity>
</application>
</manifest>
I am able to successfully launch the Google Chrome Tabs in my Fragment class (Where I have got 2 buttons:
Please see below the code for this Fragment:
public class MainFragment extends Fragment implements CustomTabsSceneHelper.ConnectionCallback {
public enum CustomTabsAction {
GOOGLE ("Open Google", "http://google.co.uk"),
REDIRECT ("Open Redirect", "http://{mylocalhost_ip}/~Rhiannon/example1/test.html");
private final String mActionDescription;
private final String mActionUrl;
CustomTabsAction (
final String actionDescription,
final String actionUrl) {
mActionDescription = actionDescription;
mActionUrl = actionUrl;
}
public String actionDescription () {
return mActionDescription;
}
public String actionUrl () {
return mActionUrl;
}
}
private CustomTabsSceneHelper mCustomTabsSceneHelper;
private CustomTabsAction mCurrentAction;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCustomTabsSceneHelper = new CustomTabsSceneHelper();
mCustomTabsSceneHelper.setConnectionCallback(this);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_main, container, false);
Button buttonGoogle = (Button) view.findViewById(R.id.button_google);
buttonGoogle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
open(CustomTabsAction.GOOGLE);
}
});
Button buttonRedirect = (Button) view.findViewById(R.id.button_redirect);
buttonRedirect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
open(CustomTabsAction.REDIRECT);
}
});
return view;
}
private void open(CustomTabsAction action) {
final Activity scene = getActivity ();
mCurrentAction = action;
CustomTabsSceneHelper.openCustomTab(
scene,
getCustomTabIntent(scene, mCustomTabsSceneHelper.occupySession()).build(),
Uri.parse(action.actionUrl())
);
}
public static CustomTabsIntent.Builder getCustomTabIntent(
@NonNull Context context,
@Nullable CustomTabsSession session) {
// Construct our intent via builder
final CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder (session);
// Toolbar color
intentBuilder.setToolbarColor(Color.GREEN);
// Show title
intentBuilder.setShowTitle(true);
// Allow hiding for toolbar
intentBuilder.enableUrlBarHiding();
return intentBuilder;
}
@Override
public void onCustomTabsConnected() {
Log.i("MainFragment", "Custom Tabs > CONNECTED");
if(mCurrentAction != null){
mCustomTabsSceneHelper.mayLaunchUrl(Uri.parse(mCurrentAction.actionUrl()), null, null);
}
}
@Override
public void onCustomTabsDisconnected() {
Log.i("MainFragment", "Custom Tabs > DISCONNECTED");
}
@Override
public void onStart() {
super.onStart();
mCustomTabsSceneHelper.bindCustomTabsService(getActivity());
}
@Override
public void onStop() {
mCustomTabsSceneHelper.unbindCustomTabsService(getActivity());
super.onStop();
}
@Override
public void onDestroy() {
mCustomTabsSceneHelper.setConnectionCallback(null);
super.onDestroy();
}
}
I then have my custom webpage:
<!DOCTYPE html>
<html>
<head>
<title>PayPal Test Redirect</title>
<script type="text/javascript">
function RedirectSuccess(){
window.location="Test://com.Test.TestApp.PayPalReturn://return";
}
function RedirectCancel(){
window.location="Test://com.Test.TestApp.PayPalReturn://cancel";
}
</script>
</head>
<body>
<a href="Test://com.Test.TestApp.PayPalReturn://return">Success</a>
<a href="Test://com.Test.TestApp.PayPalReturn://cancel">Cancel</a>
<input type="button" onclick="RedirectSuccess();" name="ok" value="Success" />
<input type="button" onclick="RedirectCancel();" name="ok" value="Cancel" />
</body>
</html>
I would expect that when the user clicks on one of the links/buttons on the webpage in the Chrome Custom Tab that the user would be redirected back to the application, but I cannot seem to get this functionality to work.
public class CompletePayPalPaymentActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_complete_paypal);
List<String> params = getIntent().getData().getPathSegments();
if(params.get(0).equals("return")){
Log.i("CompletePP", "PayPal Payment Success");
}else{
Log.i("CompletePP", "PayPal Payment Cancelled");
}
}
}
Any help at all, would be greatly appreciated!
I think your scheme and host is mixed up. Custom scheme URIs don't have hosts! So try this instead:
AndroidManifest.xml
<activity android:name=".CompletePayPalPaymentActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.Test.TestApp.PayPalReturn"/>
</intent-filter>
</activity>
Then the link your HTML would be:
<a href="com.Test.TestApp.PayPalReturn:/cancel">Cancel</a>
For a working example, checkout AppAuth for Android, it shows a Chrome Custom Tab being used to perform an OAuth flow (to Google's OAuth servers), including parsing data from a return intent. Here's the AndroidManifest.xml from that demo.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With