Adding chrome custom tabs support for native browsing in Eventyay Organizer App
In Eventyay Organizer App when a user taps a URL, we face a choice: either launch a browser, or build our own in-app browser using WebViews.
Both options present challenges — launching the browser is a heavy context switch that isn’t customizable, while WebViews don’t share state with the browser and add maintenance overhead.
Chrome Custom Tabs give apps more control over their web experience, and make transitions between native and web content more seamless without having to resort to a WebView.
The first step for a Custom Tabs integration is adding the Custom Tabs Support Library to your project. Open your build.gradle file and add the support library to the dependency section. One must remember that Chrome Custom Tabs is not an Open Source library, so we are here including the playStoreImplementation as opposed to implementation, so that our FDroid build doesn’t fail.
Adding the dependency in build.gradle(app-level) in the project:
dependencies { //Other dependencies // Chrome Custom Tabs |
And add this to versions.gradle file:
versions.chromeCustomTabs=‘27.1.0’ |
The UI Customizations are done by using the CustomTabsIntent and the CustomTabsIntent.Builder classes; the performance improvements are achieved by using the CustomTabsClient to connect to the Custom Tabs service, warm-up Chrome and let it know which urls will be opened.
Since we need this to feature to be available for each place in the app that redirects to an external link, we must create it in the utility class of the project. Let’s name this class as BrowserUtils and do it as follows:
public final class BrowserUtils { private BrowserUtils() { } public static void launchUrl(Context context, String url) { CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); CustomTabsIntent customTabsIntent = builder.build(); customTabsIntent.launchUrl(context, Uri.parse(url)); } } |
Now all we need to do is replace the old method to create an intent:
findPreference(getString(R.string.privacy_policy_key)).setOnPreferenceClickListener(preference -> { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(PRIVACY_POLICY_URL)); startActivity(intent); return true; }); |
with this call to the utility method:
findPreference(getString(R.string.privacy_policy_key)).setOnPreferenceClickListener(preference -> { BrowserUtils.launchUrl(getContext(), PRIVACY_POLICY_URL); return true; }); |
We can also add animation or customize the color of the toolbar, add action buttons or add animations like this:
builder.setToolbarColor(colorInt); builder.setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left); builder.setExitAnimations(this, R.anim.slide_in_left, R.anim.slide_out_right); |
Here’s the result:
Resources
- Chrome Custom Tabs Developer Guide
https://developer.chrome.com/multidevice/android/customtabs - Codepath Guide: Chrome Custom Tabs
https://github.com/codepath/android_guides/wiki/Chrome-Custom-Tabs - Google Chrome Custom Tabs Client: Sample implementation
https://github.com/GoogleChrome/custom-tabs-client