CustomTabsIntent.java revision 08889acbc842c73b64f94a761910154d9d42ee4c
108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal/* 208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Copyright (C) 2015 The Android Open Source Project 308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * 408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Licensed under the Apache License, Version 2.0 (the "License"); 508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * you may not use this file except in compliance with the License. 608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * You may obtain a copy of the License at 708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * 808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * http://www.apache.org/licenses/LICENSE-2.0 908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * 1008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Unless required by applicable law or agreed to in writing, software 1108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * distributed under the License is distributed on an "AS IS" BASIS, 1208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * See the License for the specific language governing permissions and 1408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * limitations under the License. 1508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 1608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 1708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalpackage android.support.customtabs; 1808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 1908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.app.Activity; 2008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.app.ActivityOptions; 2108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.app.PendingIntent; 2208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.content.Intent; 2308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.graphics.Bitmap; 2408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.graphics.Color; 2508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.net.Uri; 2608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.os.Build; 2708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.os.Bundle; 2808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.os.IBinder; 2908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 3008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport java.lang.reflect.InvocationTargetException; 3108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport java.lang.reflect.Method; 3208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 3308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal/** 3408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Constants and utilities that will be used for low level control on customizing the UI and 3508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * functionality of a tab. 3608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 3708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalpublic class CustomTabsIntent { 3808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 3908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 4008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Extra used to match the session. This has to be included in the intent to open in 4108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * a custom tab. This is the same IBinder that gets passed to ICustomTabsService#newSession. 4208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Null if there is no need to match any service side sessions with the intent. 4308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 4408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static final String EXTRA_SESSION = "android.support.customtabs.extra.SESSION"; 4508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 4608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 4708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Extra that changes the background color for the toolbar. colorRes is an int that specifies a 4808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * {@link Color}, not a resource id. 4908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 5008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static final String EXTRA_TOOLBAR_COLOR = 5108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal "android.support.customtabs.extra.TOOLBAR_COLOR"; 5208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 5308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 5408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Bundle used for adding a custom action button to the custom tab toolbar. The client can 5508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * provide an icon {@link Bitmap} and a {@link PendingIntent} for the button. 5608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 5708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static final String EXTRA_ACTION_BUTTON_BUNDLE = 5808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE"; 5908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 6008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 6108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Key that specifies the {@link Bitmap} to be used as the image source for the action button. 6208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 6308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static final String KEY_ICON = "android.support.customtabs.customaction.ICON"; 6408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 6508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 6608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Key that specifies the PendingIntent to launch when the action button or menu item was 6708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * clicked. The custom tab will be calling {@link PendingIntent#send()} on clicks after adding 6808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * the url as data. The client app can call {@link Intent#getDataString()} to get the url. 6908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 7008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static final String KEY_PENDING_INTENT = 7108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal "android.support.customtabs.customaction.PENDING_INTENT"; 7208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 7308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 7408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Use an {@code ArrayList<Bundle>} for specifying menu related params. There should be a 7508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * separate {@link Bundle} for each custom menu item. 7608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 7708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static final String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS"; 7808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 7908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 8008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Key for specifying the title of a menu item. 8108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 8208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static final String KEY_MENU_ITEM_TITLE = 8308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal "android.support.customtabs.customaction.MENU_ITEM_TITLE"; 8408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 8508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 8608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Bundle constructed out of {@link ActivityOptions} that will be running when the 8708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * {@link Activity} that holds the custom tab gets finished. A similar ActivityOptions 8808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * for creation should be constructed and given to the startActivity() call that 8908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * launches the custom tab. 9008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 9108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static final String EXTRA_EXIT_ANIMATION_BUNDLE = 9208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE"; 9308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 9408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 9508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Convenience method to create a VIEW intent without a session for the given package. 9608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * @param packageName The package name to set in the intent. 9708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * @param data The data {@link Uri} to be used in the intent. 9808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * @return The intent with the given package, data and the right session extra. 9908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 10008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public static Intent getViewIntentWithNoSession(String packageName, Uri data) { 10108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal Intent intent = new Intent(Intent.ACTION_VIEW, data); 10208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal intent.setPackage(packageName); 10308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal Bundle extras = new Bundle(); 10408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal if (!safePutBinder(extras, EXTRA_SESSION, null)) return null; 10508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal intent.putExtras(extras); 10608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal return intent; 10708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 10808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 10908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 11008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * A convenience method to handle putting an {@link IBinder} inside a {@link Bundle} for all 11108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Android version. 11208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * @param bundle The bundle to insert the {@link IBinder}. 11308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * @param key The key to use while putting the {@link IBinder}. 11408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * @param binder The {@link IBinder} to put. 11508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * @return Whether the operation was successful. 11608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 11708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal static boolean safePutBinder(Bundle bundle, String key, IBinder binder) { 11808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal try { 11908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 12008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal bundle.putBinder(key, binder); 12108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } else { 12208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal Method putBinderMethod = 12308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal Bundle.class.getMethod("putIBinder", String.class, IBinder.class); 12408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal putBinderMethod.invoke(bundle, key, binder); 12508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 12608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } catch (InvocationTargetException | IllegalAccessException 12708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal | IllegalArgumentException | NoSuchMethodException e) { 12808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal return false; 12908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 13008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal return true; 13108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 13208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal} 133