Opening Custom WebView with "Powered By Chrome" With action menus
It is Chrome Custom Tabs. You can see the sample code from Google Chrome here.
Try the following util class:
public class CustomTabs { private static final int TOOLBAR_SHARE_ITEM_ID = 1; public static void openTab(Context context, String url) { CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); enableUrlBarHiding(builder); setToolbarColor(context, builder); setSecondaryToolbarColor(context, builder); setCloseButtonIcon(context, builder); setShowTitle(builder); setAnimations(context, builder); setShareActionButton(context, builder, url); addToolbarShareItem(context, builder, url); addShareMenuItem(builder); addCopyMenuItem(context, builder); CustomTabsIntent customTabsIntent = builder.build(); customTabsIntent.launchUrl(context, Uri.parse(url)); } /* Enables the url bar to hide as the user scrolls down on the page */ private static void enableUrlBarHiding(CustomTabsIntent.Builder builder) { builder.enableUrlBarHiding(); } /* Sets the toolbar color */ private static void setToolbarColor(Context context, CustomTabsIntent.Builder builder) { builder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary)); } /* Sets the secondary toolbar color */ private static void setSecondaryToolbarColor(Context context, CustomTabsIntent.Builder builder) { builder.setSecondaryToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary)); } /* Sets the Close button icon for the custom tab */ private static void setCloseButtonIcon(Context context, CustomTabsIntent.Builder builder) { builder.setCloseButtonIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_arrow_back)); } /* Sets whether the title should be shown in the custom tab */ private static void setShowTitle(CustomTabsIntent.Builder builder) { builder.setShowTitle(true); } /* Sets animations */ private static void setAnimations(Context context, CustomTabsIntent.Builder builder) { builder.setStartAnimations(context, R.anim.slide_in_right, R.anim.slide_out_left); builder.setExitAnimations(context, R.anim.slide_in_left, R.anim.slide_out_right); } /* Sets share action button that is displayed in the Toolbar */ private static void setShareActionButton(Context context, CustomTabsIntent.Builder builder, String url) { Bitmap icon = BitmapFactory.decodeResource(context.getResources(), android.R.drawable.ic_menu_share); String label = "Share via"; Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_TEXT, url); shareIntent.setType("text/plain"); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, shareIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setActionButton(icon, label, pendingIntent); } /* Adds share item that is displayed in the secondary Toolbar */ private static void addToolbarShareItem(Context context, CustomTabsIntent.Builder builder, String url) { Bitmap icon = BitmapFactory.decodeResource(context.getResources(), android.R.drawable.ic_menu_share); String label = "Share via"; Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_TEXT, url); shareIntent.setType("text/plain"); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, shareIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.addToolbarItem(TOOLBAR_SHARE_ITEM_ID, icon, label, pendingIntent); } /* Adds a default share item to the menu */ private static void addShareMenuItem(CustomTabsIntent.Builder builder) { builder.addDefaultShareMenuItem(); } /* Adds a copy item to the menu */ private static void addCopyMenuItem(Context context, CustomTabsIntent.Builder builder) { String label = "Copy"; Intent intent = new Intent(context, CopyBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); builder.addMenuItem(label, pendingIntent); } public static class CopyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String url = intent.getDataString(); ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); ClipData data = ClipData.newPlainText("Link", url); clipboardManager.setPrimaryClip(data); Toast.makeText(context, "Copied " + url, Toast.LENGTH_SHORT).show(); } }}
Don't forget to add the dependencies to your app/build.gradle
dependencies { ... compile 'com.android.support:customtabs:25.2.0'}
and register your BroadcastReceiver
in your AndroidManifest.xml
<application> ... <receiver android:name=".CustomTabs$CopyBroadcastReceiver" /></application>
Here is the animation xml:
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="100%p" android:toXDelta="0%p" android:duration="@android:integer/config_longAnimTime" android:interpolator="@android:anim/overshoot_interpolator" />
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="-100%p" android:toXDelta="0%p" android:duration="@android:integer/config_longAnimTime" android:interpolator="@android:anim/overshoot_interpolator" />
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="-100%p" android:duration="@android:integer/config_longAnimTime" android:interpolator="@android:anim/overshoot_interpolator" />
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="100%p" android:duration="@android:integer/config_longAnimTime" android:interpolator="@android:anim/overshoot_interpolator" />