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