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 19c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysalimport android.content.Intent; 2008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.os.Bundle; 2108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.os.IBinder; 2208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.os.RemoteException; 23c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysalimport android.support.v4.app.BundleCompat; 2408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalimport android.util.Log; 2508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 2608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal/** 2708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * Wrapper class that can be used as a unique identifier for a session. Also contains an accessor 2808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * for the {@link CustomTabsCallback} for the session if there was any. 2908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 3008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysalpublic class CustomTabsSessionToken { 3108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal private static final String TAG = "CustomTabsSessionToken"; 3208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal private final ICustomTabsCallback mCallbackBinder; 3308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal private final CustomTabsCallback mCallback; 3408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 35c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal /** 36c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal * Obtain a {@link CustomTabsSessionToken} from an intent. See {@link CustomTabsIntent.Builder} 37c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal * for ways to generate an intent for custom tabs. 38c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal * @param intent The intent to generate the token from. This has to include an extra for 39c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal * {@link CustomTabsIntent#EXTRA_SESSION}. 40c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal * @return The token that was generated. 41c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal */ 42c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal public static CustomTabsSessionToken getSessionTokenFromIntent(Intent intent) { 43c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal Bundle b = intent.getExtras(); 44c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal IBinder binder = BundleCompat.getBinder(b, CustomTabsIntent.EXTRA_SESSION); 45c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal if (binder == null) return null; 46c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal return new CustomTabsSessionToken(ICustomTabsCallback.Stub.asInterface(binder)); 47c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal } 48c5c0045de7c8848144a570665e0d3c950816f314Yusuf Ozuysal 4908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal CustomTabsSessionToken(ICustomTabsCallback callbackBinder) { 5008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal mCallbackBinder = callbackBinder; 5108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal mCallback = new CustomTabsCallback() { 5208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 5308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal @Override 5408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public void onNavigationEvent(int navigationEvent, Bundle extras) { 5508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal try { 5608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal mCallbackBinder.onNavigationEvent(navigationEvent, extras); 5708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } catch (RemoteException e) { 5808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal Log.e(TAG, "RemoteException during ICustomTabsCallback transaction"); 5908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 6008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 61914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal 62914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal @Override 63914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal public void extraCallback(String callbackName, Bundle args) { 64914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal try { 65914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal mCallbackBinder.extraCallback(callbackName, args); 66914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } catch (RemoteException e) { 67914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal Log.e(TAG, "RemoteException during ICustomTabsCallback transaction"); 68914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } 69914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } 70914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal 71914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal @Override 72914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal public void onMessageChannelReady(Bundle extras) { 73914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal try { 74914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal mCallbackBinder.onMessageChannelReady(extras); 75914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } catch (RemoteException e) { 76914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal Log.e(TAG, "RemoteException during ICustomTabsCallback transaction"); 77914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } 78914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } 79914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal 80914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal @Override 81914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal public void onPostMessage(String message, Bundle extras) { 82914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal try { 83914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal mCallbackBinder.onPostMessage(message, extras); 84914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } catch (RemoteException e) { 85914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal Log.e(TAG, "RemoteException during ICustomTabsCallback transaction"); 86914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } 87914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } 8808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal }; 8908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 9008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 9108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal IBinder getCallbackBinder() { 9208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal return mCallbackBinder.asBinder(); 9308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 9408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 9508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal @Override 9697ee4f3f353309991efd3ceca369548b485e9a5fBenoit Lize public int hashCode() { 9797ee4f3f353309991efd3ceca369548b485e9a5fBenoit Lize return getCallbackBinder().hashCode(); 9897ee4f3f353309991efd3ceca369548b485e9a5fBenoit Lize } 9997ee4f3f353309991efd3ceca369548b485e9a5fBenoit Lize 10097ee4f3f353309991efd3ceca369548b485e9a5fBenoit Lize @Override 10108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public boolean equals(Object o) { 10208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal if (!(o instanceof CustomTabsSessionToken)) return false; 10308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal CustomTabsSessionToken token = (CustomTabsSessionToken) o; 10408889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal return token.getCallbackBinder().equals(mCallbackBinder.asBinder()); 10508889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 10608889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal 10708889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal /** 10808889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * @return {@link CustomTabsCallback} corresponding to this session if there was any non-null 10908889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal * callbacks passed by the client. 11008889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal */ 11108889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal public CustomTabsCallback getCallback() { 11208889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal return mCallback; 11308889acbc842c73b64f94a761910154d9d42ee4cYusuf Ozuysal } 114914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal 115914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal /** 116914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal * @return Whether this token is associated with the given session. 117914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal */ 118914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal public boolean isAssociatedWith(CustomTabsSession session) { 119914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal return session.getBinder().equals(mCallbackBinder); 120914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal } 121914073c7cf933229a3f51ddeddb63bb9725a70beYusuf Ozuysal} 122